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>);