Skip to main content

BoxStatefulTransformer

Struct BoxStatefulTransformer 

Source
pub struct BoxStatefulTransformer<T, R> { /* private fields */ }
Expand description

BoxStatefulTransformer - transformer wrapper based on Box<dyn FnMut>

A transformer wrapper that provides single ownership with reusable stateful transformation. The transformer consumes the input and can be called multiple times while maintaining internal state.

§Features

  • Based on: Box<dyn FnMut(T) -> R>
  • Ownership: Single ownership, cannot be cloned
  • Reusability: Can be called multiple times (each call consumes its input)
  • Thread Safety: Not thread-safe (no Send + Sync requirement)
  • Statefulness: Can modify internal state between calls

§Author

Haixing Hu

Implementations§

Source§

impl<T, R> BoxStatefulTransformer<T, R>

Source

pub fn new<F>(f: F) -> Self
where F: FnMut(T) -> R + 'static,

Creates a new transformer.

Wraps the provided closure in the appropriate smart pointer type for this transformer implementation.

Examples found in repository?
examples/transformers/stateful_transformer_demo.rs (lines 29-32)
23fn main() {
24    println!("=== StatefulTransformer Demo ===\n");
25
26    // 1. Basic BoxStatefulTransformer with state
27    println!("1. BoxStatefulTransformer with stateful counter:");
28    let mut counter = 0;
29    let mut mapper = BoxStatefulTransformer::new(move |x: i32| {
30        counter += 1;
31        format!("Item #{}: {}", counter, x)
32    });
33
34    println!("  {}", mapper.apply(100)); // Item #1: 100
35    println!("  {}", mapper.apply(200)); // Item #2: 200
36    println!("  {}", mapper.apply(300)); // Item #3: 300
37
38    // 2. Composing mappers with and_then
39    println!("\n2. Composing mappers with and_then:");
40    let mut counter1 = 0;
41    let mapper1 = BoxStatefulTransformer::new(move |x: i32| {
42        counter1 += 1;
43        x + counter1
44    });
45
46    let mut counter2 = 0;
47    let mapper2 = BoxStatefulTransformer::new(move |x: i32| {
48        counter2 += 1;
49        x * counter2
50    });
51
52    let mut composed = mapper1.and_then(mapper2);
53    println!("  First call:  {}", composed.apply(10)); // (10 + 1) * 1 = 11
54    println!("  Second call: {}", composed.apply(10)); // (10 + 2) * 2 = 24
55    println!("  Third call:  {}", composed.apply(10)); // (10 + 3) * 3 = 39
56
57    // 3. Conditional mapping with when/or_else
58    println!("\n3. Conditional mapping:");
59    let mut high_count = 0;
60    let mut low_count = 0;
61
62    let mut conditional = BoxStatefulTransformer::new(move |x: i32| {
63        high_count += 1;
64        format!("High[{}]: {} * 2 = {}", high_count, x, x * 2)
65    })
66    .when(|x: &i32| *x >= 10)
67    .or_else(move |x| {
68        low_count += 1;
69        format!("Low[{}]: {} + 1 = {}", low_count, x, x + 1)
70    });
71
72    println!("  {}", conditional.apply(15)); // High[1]: 15 * 2 = 30
73    println!("  {}", conditional.apply(5)); // Low[1]: 5 + 1 = 6
74    println!("  {}", conditional.apply(20)); // High[2]: 20 * 2 = 40
75
76    // 4. RcStatefulTransformer for cloneable mappers
77    println!("\n4. RcStatefulTransformer (cloneable, single-threaded):");
78    let mut counter = 0;
79    let mapper = RcStatefulTransformer::new(move |x: i32| {
80        counter += 1;
81        x + counter
82    });
83
84    let mut mapper1 = mapper.clone();
85    let mut mapper2 = mapper.clone();
86
87    println!("  mapper1: {}", mapper1.apply(10)); // 11
88    println!("  mapper2: {}", mapper2.apply(10)); // 12
89    println!("  mapper1: {}", mapper1.apply(10)); // 13
90
91    // 5. ArcStatefulTransformer for thread-safe mappers
92    println!("\n5. ArcStatefulTransformer (thread-safe):");
93    let mut counter = 0;
94    let mapper = ArcStatefulTransformer::new(move |x: i32| {
95        counter += 1;
96        format!("Result[{}]: {}", counter, x * 2)
97    });
98
99    let mut mapper_clone = mapper.clone();
100    println!("  Original: {}", mapper_clone.apply(5)); // Result[1]: 10
101    println!("  Clone:    {}", mapper_clone.apply(7)); // Result[2]: 14
102
103    // 6. Using FnStatefulTransformerOps extension trait
104    println!("\n6. Using FnStatefulTransformerOps extension trait:");
105    let mut count = 0;
106    let mut mapper = (move |x: i32| {
107        count += 1;
108        x + count
109    })
110    .and_then(|x| x * 2);
111
112    println!("  {}", mapper.apply(10)); // (10 + 1) * 2 = 22
113    println!("  {}", mapper.apply(10)); // (10 + 2) * 2 = 24
114
115    // 7. Building a complex pipeline
116    println!("\n7. Complex processing pipeline:");
117    let mut step1_count = 0;
118    let step1 = BoxStatefulTransformer::new(move |x: i32| {
119        step1_count += 1;
120        format!("Step1[{}]: {}", step1_count, x)
121    });
122
123    let mut step2_count = 0;
124    let step2 = BoxStatefulTransformer::new(move |s: String| {
125        step2_count += 1;
126        format!("{} -> Step2[{}]", s, step2_count)
127    });
128
129    let mut step3_count = 0;
130    let step3 = BoxStatefulTransformer::new(move |s: String| {
131        step3_count += 1;
132        format!("{} -> Step3[{}]", s, step3_count)
133    });
134
135    let mut pipeline = step1.and_then(step2).and_then(step3);
136
137    println!("  {}", pipeline.apply(100));
138    println!("  {}", pipeline.apply(200));
139
140    // 7. TransformerOnce implementation - consuming transformers
141    println!("\n7. TransformerOnce implementation - consuming StatefulTransformers:");
142
143    // BoxStatefulTransformer can be consumed as TransformerOnce
144    let mut counter = 0;
145    let mut box_mapper = BoxStatefulTransformer::new(move |x: i32| {
146        counter += 1;
147        x * counter
148    });
149    println!(
150        "  BoxStatefulTransformer consumed once: {}",
151        box_mapper.apply(10)
152    ); // 10 * 1 = 10
153
154    // RcStatefulTransformer can be consumed as TransformerOnce
155    let mut counter = 0;
156    let mut rc_mapper = RcStatefulTransformer::new(move |x: i32| {
157        counter += 1;
158        x + counter
159    });
160    let rc_clone = rc_mapper.clone(); // Clone before consuming
161    println!(
162        "  RcStatefulTransformer consumed once: {}",
163        rc_mapper.apply(10)
164    ); // 10 + 1 = 11
165    println!("  RcStatefulTransformer clone still works: {}", {
166        let mut rc_clone_for_call = rc_clone.clone();
167        rc_clone_for_call.apply(10)
168    }); // 10 + 2 = 12
169
170    // ArcStatefulTransformer can be consumed as TransformerOnce
171    let mut counter = 0;
172    let mut arc_mapper = ArcStatefulTransformer::new(move |x: i32| {
173        counter += 1;
174        x * counter
175    });
176    let arc_clone = arc_mapper.clone(); // Clone before consuming
177    println!(
178        "  ArcStatefulTransformer consumed once: {}",
179        arc_mapper.apply(10)
180    ); // 10 * 1 = 10
181    println!("  ArcStatefulTransformer clone still works: {}", {
182        let mut arc_clone_for_call = arc_clone.clone();
183        arc_clone_for_call.apply(10)
184    }); // 10 * 2 = 20
185
186    // 8. Converting to BoxTransformerOnce
187    println!("\n8. Converting StatefulTransformers to BoxTransformerOnce:");
188
189    let mut counter = 0;
190    let mapper = BoxStatefulTransformer::new(move |x: i32| {
191        counter += 1;
192        x * counter
193    });
194    let mut once_mapper = mapper.into_box();
195    println!(
196        "  BoxStatefulTransformer->BoxTransformerOnce: {}",
197        once_mapper.apply(5)
198    ); // 5 * 1 = 5
199
200    // RcStatefulTransformer can use to_box() to preserve original
201    let mut counter = 0;
202    let rc_mapper = RcStatefulTransformer::new(move |x: i32| {
203        counter += 1;
204        x * counter
205    });
206    let mut once_mapper = rc_mapper.to_box();
207    println!(
208        "  RcStatefulTransformer->BoxTransformerOnce: {}",
209        once_mapper.apply(5)
210    ); // 5 * 1 = 5
211    println!("  Original RcStatefulTransformer still works: {}", {
212        let mut rc_original_for_call = rc_mapper.clone();
213        rc_original_for_call.apply(5)
214    }); // 5 * 2 = 10
215
216    println!("\n=== Demo Complete ===");
217}
Source

pub fn new_with_name<F>(name: &str, f: F) -> Self
where F: FnMut(T) -> R + 'static,

Creates a new named transformer.

Wraps the provided closure and assigns it a name, which is useful for debugging and logging purposes.

Source

pub fn new_with_optional_name<F>(f: F, name: Option<String>) -> Self
where F: FnMut(T) -> R + 'static,

Creates a new named transformer with an optional name.

Wraps the provided closure and assigns it an optional name.

Source

pub fn name(&self) -> Option<&str>

Gets the name of this transformer.

§Returns

Returns Some(&str) if a name was set, None otherwise.

Source

pub fn set_name(&mut self, name: &str)

Sets the name of this transformer.

§Parameters
  • name - The name to set for this transformer
Source

pub fn clear_name(&mut self)

Clears the name of this transformer.

Source

pub fn identity() -> BoxStatefulTransformer<T, T>

Creates an identity transformer.

Creates a transformer that returns the input value unchanged. Useful for default values or placeholder implementations.

§Returns

Returns a new transformer instance that returns the input unchanged.

Source

pub fn when<P>(self, predicate: P) -> BoxConditionalStatefulTransformer<T, R>
where T: 'static, R: 'static, P: Predicate<T> + 'static,

Creates a conditional transformer that executes based on predicate result.

§Parameters
  • predicate - The predicate to determine whether to execute the transformation operation
§Returns

Returns a conditional transformer that only executes when the predicate returns true.

§Examples
use std::sync::Arc;
use std::sync::atomic::{AtomicI32, Ordering};
use qubit_function::transformers::*;

let transformer = BoxTransformer::new({
    |value: i32| value * 2
});

let conditional = transformer.when(|value: &i32| *value > 0).or_else(|value: i32| value);
assert_eq!(conditional.apply(5), 10);  // transformed
assert_eq!(conditional.apply(-1), -1); // identity (unchanged)
Examples found in repository?
examples/transformers/stateful_transformer_demo.rs (line 66)
23fn main() {
24    println!("=== StatefulTransformer Demo ===\n");
25
26    // 1. Basic BoxStatefulTransformer with state
27    println!("1. BoxStatefulTransformer with stateful counter:");
28    let mut counter = 0;
29    let mut mapper = BoxStatefulTransformer::new(move |x: i32| {
30        counter += 1;
31        format!("Item #{}: {}", counter, x)
32    });
33
34    println!("  {}", mapper.apply(100)); // Item #1: 100
35    println!("  {}", mapper.apply(200)); // Item #2: 200
36    println!("  {}", mapper.apply(300)); // Item #3: 300
37
38    // 2. Composing mappers with and_then
39    println!("\n2. Composing mappers with and_then:");
40    let mut counter1 = 0;
41    let mapper1 = BoxStatefulTransformer::new(move |x: i32| {
42        counter1 += 1;
43        x + counter1
44    });
45
46    let mut counter2 = 0;
47    let mapper2 = BoxStatefulTransformer::new(move |x: i32| {
48        counter2 += 1;
49        x * counter2
50    });
51
52    let mut composed = mapper1.and_then(mapper2);
53    println!("  First call:  {}", composed.apply(10)); // (10 + 1) * 1 = 11
54    println!("  Second call: {}", composed.apply(10)); // (10 + 2) * 2 = 24
55    println!("  Third call:  {}", composed.apply(10)); // (10 + 3) * 3 = 39
56
57    // 3. Conditional mapping with when/or_else
58    println!("\n3. Conditional mapping:");
59    let mut high_count = 0;
60    let mut low_count = 0;
61
62    let mut conditional = BoxStatefulTransformer::new(move |x: i32| {
63        high_count += 1;
64        format!("High[{}]: {} * 2 = {}", high_count, x, x * 2)
65    })
66    .when(|x: &i32| *x >= 10)
67    .or_else(move |x| {
68        low_count += 1;
69        format!("Low[{}]: {} + 1 = {}", low_count, x, x + 1)
70    });
71
72    println!("  {}", conditional.apply(15)); // High[1]: 15 * 2 = 30
73    println!("  {}", conditional.apply(5)); // Low[1]: 5 + 1 = 6
74    println!("  {}", conditional.apply(20)); // High[2]: 20 * 2 = 40
75
76    // 4. RcStatefulTransformer for cloneable mappers
77    println!("\n4. RcStatefulTransformer (cloneable, single-threaded):");
78    let mut counter = 0;
79    let mapper = RcStatefulTransformer::new(move |x: i32| {
80        counter += 1;
81        x + counter
82    });
83
84    let mut mapper1 = mapper.clone();
85    let mut mapper2 = mapper.clone();
86
87    println!("  mapper1: {}", mapper1.apply(10)); // 11
88    println!("  mapper2: {}", mapper2.apply(10)); // 12
89    println!("  mapper1: {}", mapper1.apply(10)); // 13
90
91    // 5. ArcStatefulTransformer for thread-safe mappers
92    println!("\n5. ArcStatefulTransformer (thread-safe):");
93    let mut counter = 0;
94    let mapper = ArcStatefulTransformer::new(move |x: i32| {
95        counter += 1;
96        format!("Result[{}]: {}", counter, x * 2)
97    });
98
99    let mut mapper_clone = mapper.clone();
100    println!("  Original: {}", mapper_clone.apply(5)); // Result[1]: 10
101    println!("  Clone:    {}", mapper_clone.apply(7)); // Result[2]: 14
102
103    // 6. Using FnStatefulTransformerOps extension trait
104    println!("\n6. Using FnStatefulTransformerOps extension trait:");
105    let mut count = 0;
106    let mut mapper = (move |x: i32| {
107        count += 1;
108        x + count
109    })
110    .and_then(|x| x * 2);
111
112    println!("  {}", mapper.apply(10)); // (10 + 1) * 2 = 22
113    println!("  {}", mapper.apply(10)); // (10 + 2) * 2 = 24
114
115    // 7. Building a complex pipeline
116    println!("\n7. Complex processing pipeline:");
117    let mut step1_count = 0;
118    let step1 = BoxStatefulTransformer::new(move |x: i32| {
119        step1_count += 1;
120        format!("Step1[{}]: {}", step1_count, x)
121    });
122
123    let mut step2_count = 0;
124    let step2 = BoxStatefulTransformer::new(move |s: String| {
125        step2_count += 1;
126        format!("{} -> Step2[{}]", s, step2_count)
127    });
128
129    let mut step3_count = 0;
130    let step3 = BoxStatefulTransformer::new(move |s: String| {
131        step3_count += 1;
132        format!("{} -> Step3[{}]", s, step3_count)
133    });
134
135    let mut pipeline = step1.and_then(step2).and_then(step3);
136
137    println!("  {}", pipeline.apply(100));
138    println!("  {}", pipeline.apply(200));
139
140    // 7. TransformerOnce implementation - consuming transformers
141    println!("\n7. TransformerOnce implementation - consuming StatefulTransformers:");
142
143    // BoxStatefulTransformer can be consumed as TransformerOnce
144    let mut counter = 0;
145    let mut box_mapper = BoxStatefulTransformer::new(move |x: i32| {
146        counter += 1;
147        x * counter
148    });
149    println!(
150        "  BoxStatefulTransformer consumed once: {}",
151        box_mapper.apply(10)
152    ); // 10 * 1 = 10
153
154    // RcStatefulTransformer can be consumed as TransformerOnce
155    let mut counter = 0;
156    let mut rc_mapper = RcStatefulTransformer::new(move |x: i32| {
157        counter += 1;
158        x + counter
159    });
160    let rc_clone = rc_mapper.clone(); // Clone before consuming
161    println!(
162        "  RcStatefulTransformer consumed once: {}",
163        rc_mapper.apply(10)
164    ); // 10 + 1 = 11
165    println!("  RcStatefulTransformer clone still works: {}", {
166        let mut rc_clone_for_call = rc_clone.clone();
167        rc_clone_for_call.apply(10)
168    }); // 10 + 2 = 12
169
170    // ArcStatefulTransformer can be consumed as TransformerOnce
171    let mut counter = 0;
172    let mut arc_mapper = ArcStatefulTransformer::new(move |x: i32| {
173        counter += 1;
174        x * counter
175    });
176    let arc_clone = arc_mapper.clone(); // Clone before consuming
177    println!(
178        "  ArcStatefulTransformer consumed once: {}",
179        arc_mapper.apply(10)
180    ); // 10 * 1 = 10
181    println!("  ArcStatefulTransformer clone still works: {}", {
182        let mut arc_clone_for_call = arc_clone.clone();
183        arc_clone_for_call.apply(10)
184    }); // 10 * 2 = 20
185
186    // 8. Converting to BoxTransformerOnce
187    println!("\n8. Converting StatefulTransformers to BoxTransformerOnce:");
188
189    let mut counter = 0;
190    let mapper = BoxStatefulTransformer::new(move |x: i32| {
191        counter += 1;
192        x * counter
193    });
194    let mut once_mapper = mapper.into_box();
195    println!(
196        "  BoxStatefulTransformer->BoxTransformerOnce: {}",
197        once_mapper.apply(5)
198    ); // 5 * 1 = 5
199
200    // RcStatefulTransformer can use to_box() to preserve original
201    let mut counter = 0;
202    let rc_mapper = RcStatefulTransformer::new(move |x: i32| {
203        counter += 1;
204        x * counter
205    });
206    let mut once_mapper = rc_mapper.to_box();
207    println!(
208        "  RcStatefulTransformer->BoxTransformerOnce: {}",
209        once_mapper.apply(5)
210    ); // 5 * 1 = 5
211    println!("  Original RcStatefulTransformer still works: {}", {
212        let mut rc_original_for_call = rc_mapper.clone();
213        rc_original_for_call.apply(5)
214    }); // 5 * 2 = 10
215
216    println!("\n=== Demo Complete ===");
217}
Source

pub fn and_then<S, F>(self, after: F) -> BoxStatefulTransformer<T, S>
where T: 'static, R: 'static, S: 'static, F: StatefulTransformer<R, S> + 'static,

Chains execution with another transformer, executing the current transformer first, then the subsequent transformer.

§Parameters
  • after - The subsequent transformer to execute after the current transformer completes
§Returns

Returns a new transformer that executes the current transformer and the subsequent transformer in sequence.

§Examples
use qubit_function::transformers::*;

let transformer1 = BoxTransformer::new({
    |value: i32| value + 1
});

let transformer2 = BoxTransformer::new({
    |value: i32| value * 2
});

let chained = transformer1.and_then(transformer2);
assert_eq!(chained.apply(5), 12); // (5 + 1) * 2 = 12
Examples found in repository?
examples/transformers/stateful_transformer_demo.rs (line 52)
23fn main() {
24    println!("=== StatefulTransformer Demo ===\n");
25
26    // 1. Basic BoxStatefulTransformer with state
27    println!("1. BoxStatefulTransformer with stateful counter:");
28    let mut counter = 0;
29    let mut mapper = BoxStatefulTransformer::new(move |x: i32| {
30        counter += 1;
31        format!("Item #{}: {}", counter, x)
32    });
33
34    println!("  {}", mapper.apply(100)); // Item #1: 100
35    println!("  {}", mapper.apply(200)); // Item #2: 200
36    println!("  {}", mapper.apply(300)); // Item #3: 300
37
38    // 2. Composing mappers with and_then
39    println!("\n2. Composing mappers with and_then:");
40    let mut counter1 = 0;
41    let mapper1 = BoxStatefulTransformer::new(move |x: i32| {
42        counter1 += 1;
43        x + counter1
44    });
45
46    let mut counter2 = 0;
47    let mapper2 = BoxStatefulTransformer::new(move |x: i32| {
48        counter2 += 1;
49        x * counter2
50    });
51
52    let mut composed = mapper1.and_then(mapper2);
53    println!("  First call:  {}", composed.apply(10)); // (10 + 1) * 1 = 11
54    println!("  Second call: {}", composed.apply(10)); // (10 + 2) * 2 = 24
55    println!("  Third call:  {}", composed.apply(10)); // (10 + 3) * 3 = 39
56
57    // 3. Conditional mapping with when/or_else
58    println!("\n3. Conditional mapping:");
59    let mut high_count = 0;
60    let mut low_count = 0;
61
62    let mut conditional = BoxStatefulTransformer::new(move |x: i32| {
63        high_count += 1;
64        format!("High[{}]: {} * 2 = {}", high_count, x, x * 2)
65    })
66    .when(|x: &i32| *x >= 10)
67    .or_else(move |x| {
68        low_count += 1;
69        format!("Low[{}]: {} + 1 = {}", low_count, x, x + 1)
70    });
71
72    println!("  {}", conditional.apply(15)); // High[1]: 15 * 2 = 30
73    println!("  {}", conditional.apply(5)); // Low[1]: 5 + 1 = 6
74    println!("  {}", conditional.apply(20)); // High[2]: 20 * 2 = 40
75
76    // 4. RcStatefulTransformer for cloneable mappers
77    println!("\n4. RcStatefulTransformer (cloneable, single-threaded):");
78    let mut counter = 0;
79    let mapper = RcStatefulTransformer::new(move |x: i32| {
80        counter += 1;
81        x + counter
82    });
83
84    let mut mapper1 = mapper.clone();
85    let mut mapper2 = mapper.clone();
86
87    println!("  mapper1: {}", mapper1.apply(10)); // 11
88    println!("  mapper2: {}", mapper2.apply(10)); // 12
89    println!("  mapper1: {}", mapper1.apply(10)); // 13
90
91    // 5. ArcStatefulTransformer for thread-safe mappers
92    println!("\n5. ArcStatefulTransformer (thread-safe):");
93    let mut counter = 0;
94    let mapper = ArcStatefulTransformer::new(move |x: i32| {
95        counter += 1;
96        format!("Result[{}]: {}", counter, x * 2)
97    });
98
99    let mut mapper_clone = mapper.clone();
100    println!("  Original: {}", mapper_clone.apply(5)); // Result[1]: 10
101    println!("  Clone:    {}", mapper_clone.apply(7)); // Result[2]: 14
102
103    // 6. Using FnStatefulTransformerOps extension trait
104    println!("\n6. Using FnStatefulTransformerOps extension trait:");
105    let mut count = 0;
106    let mut mapper = (move |x: i32| {
107        count += 1;
108        x + count
109    })
110    .and_then(|x| x * 2);
111
112    println!("  {}", mapper.apply(10)); // (10 + 1) * 2 = 22
113    println!("  {}", mapper.apply(10)); // (10 + 2) * 2 = 24
114
115    // 7. Building a complex pipeline
116    println!("\n7. Complex processing pipeline:");
117    let mut step1_count = 0;
118    let step1 = BoxStatefulTransformer::new(move |x: i32| {
119        step1_count += 1;
120        format!("Step1[{}]: {}", step1_count, x)
121    });
122
123    let mut step2_count = 0;
124    let step2 = BoxStatefulTransformer::new(move |s: String| {
125        step2_count += 1;
126        format!("{} -> Step2[{}]", s, step2_count)
127    });
128
129    let mut step3_count = 0;
130    let step3 = BoxStatefulTransformer::new(move |s: String| {
131        step3_count += 1;
132        format!("{} -> Step3[{}]", s, step3_count)
133    });
134
135    let mut pipeline = step1.and_then(step2).and_then(step3);
136
137    println!("  {}", pipeline.apply(100));
138    println!("  {}", pipeline.apply(200));
139
140    // 7. TransformerOnce implementation - consuming transformers
141    println!("\n7. TransformerOnce implementation - consuming StatefulTransformers:");
142
143    // BoxStatefulTransformer can be consumed as TransformerOnce
144    let mut counter = 0;
145    let mut box_mapper = BoxStatefulTransformer::new(move |x: i32| {
146        counter += 1;
147        x * counter
148    });
149    println!(
150        "  BoxStatefulTransformer consumed once: {}",
151        box_mapper.apply(10)
152    ); // 10 * 1 = 10
153
154    // RcStatefulTransformer can be consumed as TransformerOnce
155    let mut counter = 0;
156    let mut rc_mapper = RcStatefulTransformer::new(move |x: i32| {
157        counter += 1;
158        x + counter
159    });
160    let rc_clone = rc_mapper.clone(); // Clone before consuming
161    println!(
162        "  RcStatefulTransformer consumed once: {}",
163        rc_mapper.apply(10)
164    ); // 10 + 1 = 11
165    println!("  RcStatefulTransformer clone still works: {}", {
166        let mut rc_clone_for_call = rc_clone.clone();
167        rc_clone_for_call.apply(10)
168    }); // 10 + 2 = 12
169
170    // ArcStatefulTransformer can be consumed as TransformerOnce
171    let mut counter = 0;
172    let mut arc_mapper = ArcStatefulTransformer::new(move |x: i32| {
173        counter += 1;
174        x * counter
175    });
176    let arc_clone = arc_mapper.clone(); // Clone before consuming
177    println!(
178        "  ArcStatefulTransformer consumed once: {}",
179        arc_mapper.apply(10)
180    ); // 10 * 1 = 10
181    println!("  ArcStatefulTransformer clone still works: {}", {
182        let mut arc_clone_for_call = arc_clone.clone();
183        arc_clone_for_call.apply(10)
184    }); // 10 * 2 = 20
185
186    // 8. Converting to BoxTransformerOnce
187    println!("\n8. Converting StatefulTransformers to BoxTransformerOnce:");
188
189    let mut counter = 0;
190    let mapper = BoxStatefulTransformer::new(move |x: i32| {
191        counter += 1;
192        x * counter
193    });
194    let mut once_mapper = mapper.into_box();
195    println!(
196        "  BoxStatefulTransformer->BoxTransformerOnce: {}",
197        once_mapper.apply(5)
198    ); // 5 * 1 = 5
199
200    // RcStatefulTransformer can use to_box() to preserve original
201    let mut counter = 0;
202    let rc_mapper = RcStatefulTransformer::new(move |x: i32| {
203        counter += 1;
204        x * counter
205    });
206    let mut once_mapper = rc_mapper.to_box();
207    println!(
208        "  RcStatefulTransformer->BoxTransformerOnce: {}",
209        once_mapper.apply(5)
210    ); // 5 * 1 = 5
211    println!("  Original RcStatefulTransformer still works: {}", {
212        let mut rc_original_for_call = rc_mapper.clone();
213        rc_original_for_call.apply(5)
214    }); // 5 * 2 = 10
215
216    println!("\n=== Demo Complete ===");
217}
Source§

impl<T, R> BoxStatefulTransformer<T, R>

Source

pub fn constant(value: R) -> BoxStatefulTransformer<T, R>
where R: Clone + 'static,

Creates a constant transformer

§Examples

/// rust /// use qubit_function::{BoxStatefulTransformer, StatefulTransformer}; /// /// let mut constant = BoxStatefulTransformer::constant("hello"); /// assert_eq!(constant.apply(123), "hello"); ///

Trait Implementations§

Source§

impl<T, R> Debug for BoxStatefulTransformer<T, R>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T, R> Display for BoxStatefulTransformer<T, R>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T, R> StatefulTransformer<T, R> for BoxStatefulTransformer<T, R>

Source§

fn apply(&mut self, input: T) -> R

Applies the transformation to the input value to produce an output value Read more
Source§

fn into_box(self) -> BoxStatefulTransformer<T, R>

Converts to BoxStatefulTransformer Read more
Source§

fn into_rc(self) -> RcStatefulTransformer<T, R>
where Self: 'static,

Converts to RcStatefulTransformer Read more
Source§

fn into_fn(self) -> impl FnMut(T) -> R

Converts to a closure implementing FnMut(T) -> R Read more
Source§

fn into_once(self) -> BoxTransformerOnce<T, R>
where Self: 'static,

Converts to BoxTransformerOnce. Read more
Source§

fn into_arc(self) -> ArcStatefulTransformer<T, R>
where Self: Sized + Send + 'static,

Converts to ArcStatefulTransformer Read more
Source§

fn into_mut_fn(self) -> impl FnMut(T) -> R
where Self: Sized + 'static,

Converts transformer to a mutable closure (FnMut) with an explicit method name. Read more

Auto Trait Implementations§

§

impl<T, R> Freeze for BoxStatefulTransformer<T, R>

§

impl<T, R> !RefUnwindSafe for BoxStatefulTransformer<T, R>

§

impl<T, R> !Send for BoxStatefulTransformer<T, R>

§

impl<T, R> !Sync for BoxStatefulTransformer<T, R>

§

impl<T, R> Unpin for BoxStatefulTransformer<T, R>

§

impl<T, R> UnsafeUnpin for BoxStatefulTransformer<T, R>

§

impl<T, R> !UnwindSafe for BoxStatefulTransformer<T, R>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.