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}