Skip to main content

qubit_function/transformers/stateful_transformer/
rc_stateful_transformer.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 `RcStatefulTransformer` public type.
12
13use super::{
14    BoxStatefulTransformer,
15    BoxTransformerOnce,
16    Predicate,
17    Rc,
18    RcConditionalStatefulTransformer,
19    RefCell,
20    StatefulTransformer,
21    impl_rc_conversions,
22    impl_shared_transformer_methods,
23    impl_transformer_clone,
24    impl_transformer_common_methods,
25    impl_transformer_constant_method,
26    impl_transformer_debug_display,
27};
28
29// ============================================================================
30// RcStatefulTransformer - Rc<RefCell<dyn FnMut(T) -> R>>
31// ============================================================================
32
33/// RcStatefulTransformer - single-threaded transformer wrapper
34///
35/// A single-threaded, clonable transformer wrapper optimized for scenarios
36/// that require sharing without thread-safety overhead.
37///
38/// # Features
39///
40/// - **Based on**: `Rc<RefCell<dyn FnMut(T) -> R>>`
41/// - **Ownership**: Shared ownership via reference counting (non-atomic)
42/// - **Reusability**: Can be called multiple times (each call consumes
43///   its input)
44/// - **Thread Safety**: Not thread-safe (no `Send + Sync`)
45/// - **Clonable**: Cheap cloning via `Rc::clone`
46/// - **Statefulness**: Can modify internal state between calls
47///
48pub struct RcStatefulTransformer<T, R> {
49    pub(super) function: Rc<RefCell<dyn FnMut(T) -> R>>,
50    pub(super) name: Option<String>,
51}
52
53// Implement RcStatefulTransformer
54impl<T, R> RcStatefulTransformer<T, R> {
55    impl_transformer_common_methods!(
56        RcStatefulTransformer<T, R>,
57        (FnMut(T) -> R + 'static),
58        |f| Rc::new(RefCell::new(f))
59    );
60
61    impl_shared_transformer_methods!(
62        RcStatefulTransformer<T, R>,
63        RcConditionalStatefulTransformer,
64        into_rc,
65        StatefulTransformer,
66        'static
67    );
68}
69
70// Implement constant method for RcStatefulTransformer
71impl_transformer_constant_method!(stateful RcStatefulTransformer<T, R>);
72
73// Implement Debug and Display for RcStatefulTransformer
74impl_transformer_debug_display!(RcStatefulTransformer<T, R>);
75
76// Implement Clone for RcStatefulTransformer
77impl_transformer_clone!(RcStatefulTransformer<T, R>);
78
79// Implement StatefulTransformer trait for RcStatefulTransformer
80impl<T, R> StatefulTransformer<T, R> for RcStatefulTransformer<T, R> {
81    fn apply(&mut self, input: T) -> R {
82        let mut self_fn = self.function.borrow_mut();
83        self_fn(input)
84    }
85
86    // Generate all conversion methods using the unified macro
87    impl_rc_conversions!(
88        RcStatefulTransformer<T, R>,
89        BoxStatefulTransformer,
90        BoxTransformerOnce,
91        FnMut(input: T) -> R
92    );
93}