Skip to main content

qubit_function/transformers/stateful_transformer/
arc_stateful_transformer.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9//! Defines the `ArcStatefulTransformer` public type.
10
11#![allow(unused_imports)]
12
13use super::*;
14
15// ============================================================================
16// ArcStatefulTransformer - Arc<Mutex<dyn FnMut(T) -> R + Send>>
17// ============================================================================
18
19/// ArcStatefulTransformer - thread-safe transformer wrapper
20///
21/// A thread-safe, clonable transformer wrapper suitable for multi-threaded
22/// scenarios. Can be called multiple times and shared across threads
23/// while maintaining internal state.
24///
25/// # Features
26///
27/// - **Based on**: `Arc<Mutex<dyn FnMut(T) -> R + Send>>`
28/// - **Ownership**: Shared ownership via reference counting
29/// - **Reusability**: Can be called multiple times (each call consumes
30///   its input)
31/// - **Thread Safety**: Thread-safe (`Send` required)
32/// - **Clonable**: Cheap cloning via `Arc::clone`
33/// - **Statefulness**: Can modify internal state between calls
34///
35/// # Author
36///
37/// Haixing Hu
38pub struct ArcStatefulTransformer<T, R> {
39    pub(super) function: Arc<Mutex<dyn FnMut(T) -> R + Send>>,
40    pub(super) name: Option<String>,
41}
42
43impl<T, R> ArcStatefulTransformer<T, R> {
44    impl_transformer_common_methods!(
45        ArcStatefulTransformer<T, R>,
46        (FnMut(T) -> R + Send + 'static),
47        |f| Arc::new(Mutex::new(f))
48    );
49
50    impl_shared_transformer_methods!(
51        ArcStatefulTransformer<T, R>,
52        ArcConditionalStatefulTransformer,
53        into_arc,
54        StatefulTransformer,
55        Send + Sync + 'static
56    );
57}
58
59// Implement constant method for ArcStatefulTransformer
60impl_transformer_constant_method!(stateful thread_safe ArcStatefulTransformer<T, R>);
61
62// Implement Debug and Display for ArcStatefulTransformer
63impl_transformer_debug_display!(ArcStatefulTransformer<T, R>);
64
65// Implement Clone for ArcStatefulTransformer
66impl_transformer_clone!(ArcStatefulTransformer<T, R>);
67
68impl<T, R> StatefulTransformer<T, R> for ArcStatefulTransformer<T, R> {
69    fn apply(&mut self, input: T) -> R {
70        let mut func = self.function.lock();
71        func(input)
72    }
73
74    // Use macro to implement conversion methods
75    impl_arc_conversions!(
76        ArcStatefulTransformer<T, R>,
77        BoxStatefulTransformer,
78        RcStatefulTransformer,
79        BoxTransformerOnce,
80        FnMut(t: T) -> R
81    );
82}
83
84// ============================================================================
85// Blanket implementation for standard FnMut trait
86// ============================================================================
87
88// Implement StatefulTransformer<T, R> for any type that implements FnMut(T) -> R
89impl_closure_trait!(
90    StatefulTransformer<T, R>,
91    apply,
92    BoxTransformerOnce,
93    FnMut(input: T) -> R
94);