Skip to main content

qubit_function/consumers/bi_consumer/
arc_conditional_bi_consumer.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10// qubit-style: allow explicit-imports
11//! Defines the `ArcConditionalBiConsumer` public type.
12
13use super::{
14    ArcBiConsumer,
15    ArcBiPredicate,
16    BiConsumer,
17    BiPredicate,
18    BoxBiConsumer,
19    RcBiConsumer,
20    impl_conditional_consumer_clone,
21    impl_conditional_consumer_conversions,
22    impl_conditional_consumer_debug_display,
23    impl_shared_conditional_consumer,
24};
25
26// =======================================================================
27// 8. ArcConditionalBiConsumer - Arc-based Conditional BiConsumer
28// =======================================================================
29
30/// ArcConditionalBiConsumer struct
31///
32/// A conditional bi-consumer that wraps an `ArcBiConsumer` and only executes
33/// when a predicate is satisfied. Based on `Arc` for thread-safe shared ownership.
34///
35/// # Features
36///
37/// - **Shared Ownership**: Cloneable through `Arc`, allows multiple owners
38/// - **Thread Safe**: Implements `Send + Sync`, can be safely used concurrently
39/// - **Conditional Execution**: Only consumes when predicate returns `true`
40/// - **Implements BiConsumer**: Can be used anywhere a `BiConsumer` is expected
41/// - **Non-mutating**: Neither modifies itself nor input values
42///
43pub struct ArcConditionalBiConsumer<T, U> {
44    pub(super) consumer: ArcBiConsumer<T, U>,
45    pub(super) predicate: ArcBiPredicate<T, U>,
46}
47
48// Use macro to generate conditional bi-consumer implementations
49impl_shared_conditional_consumer!(
50    ArcConditionalBiConsumer<T, U>,
51    ArcBiConsumer,
52    BiConsumer,
53    into_arc,
54    Send + Sync + 'static
55);
56
57// Hand-written BiConsumer trait implementation
58impl<T, U> BiConsumer<T, U> for ArcConditionalBiConsumer<T, U> {
59    fn accept(&self, first: &T, second: &U) {
60        if self.predicate.test(first, second) {
61            self.consumer.accept(first, second);
62        }
63    }
64
65    // Generates: into_box(), into_rc(), into_fn()
66    impl_conditional_consumer_conversions!(
67        BoxBiConsumer<T, U>,
68        RcBiConsumer,
69        Fn
70    );
71}
72
73// Use macro to generate Clone implementation
74impl_conditional_consumer_clone!(ArcConditionalBiConsumer<T, U>);
75
76// Use macro to generate Debug and Display implementations
77impl_conditional_consumer_debug_display!(ArcConditionalBiConsumer<T, U>);