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