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