Skip to main content

stateful_supplier_demo/
stateful_supplier_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9
10//! Demonstration of StatefulSupplier types usage
11
12use qubit_function::{
13    ArcStatefulSupplier,
14    ArcSupplier,
15    BoxStatefulSupplier,
16    BoxSupplier,
17    BoxSupplierOnce,
18    RcStatefulSupplier,
19    RcSupplier,
20    StatefulSupplier,
21    Supplier,
22    SupplierOnce,
23};
24use std::cell::RefCell;
25use std::rc::Rc;
26use std::sync::{
27    Arc,
28    Mutex,
29};
30use std::thread;
31
32fn is_even_i32(value: &i32) -> bool {
33    value % 2 == 0
34}
35
36fn main() {
37    println!("=== Supplier Demo ===\n");
38
39    demo_closure_supplier();
40    demo_box_supplier_basics();
41    demo_box_supplier_methods();
42    demo_box_supplier_once();
43    demo_arc_supplier();
44    demo_arc_supplier_threading();
45    demo_rc_supplier();
46    demo_type_conversions();
47}
48
49fn demo_closure_supplier() {
50    println!("--- Closure as Supplier ---");
51
52    // Simple closure (Fn)
53    let closure = || 42;
54    let boxed = Supplier::into_box(closure);
55    println!("Closure: {}", boxed.get());
56
57    // Stateful closure (FnMut) - use StatefulSupplier
58    let mut counter = 0;
59    let stateful = move || {
60        counter += 1;
61        counter
62    };
63    let mut boxed_stateful = StatefulSupplier::into_box(stateful);
64    println!("Counter: {}", boxed_stateful.get());
65    println!("Counter: {}", boxed_stateful.get());
66    println!("Counter: {}", boxed_stateful.get());
67    println!();
68}
69
70fn demo_box_supplier_basics() {
71    println!("--- BoxSupplier Basics ---");
72
73    // Basic usage (Fn)
74    let supplier = BoxSupplier::new(|| 42);
75    println!("Basic: {}", supplier.get());
76
77    // Constant supplier (Fn)
78    let constant = BoxSupplier::constant(100);
79    println!("Constant: {}", constant.get());
80    println!("Constant: {}", constant.get());
81
82    // Stateful counter (FnMut) - use BoxStatefulSupplier
83    let mut counter = 0;
84    let mut counter_supplier = BoxStatefulSupplier::new(move || {
85        counter += 1;
86        counter
87    });
88    println!("Counter: {}", counter_supplier.get());
89    println!("Counter: {}", counter_supplier.get());
90    println!("Counter: {}", counter_supplier.get());
91    println!();
92}
93
94fn demo_box_supplier_methods() {
95    println!("--- BoxStatefulSupplier Methods ---");
96
97    // Map (FnMut)
98    let mut counter = 0;
99    let mut mapped = BoxStatefulSupplier::new(move || {
100        counter += 1;
101        counter * 10
102    })
103    .map(|x| x + 5);
104    println!("Mapped: {}", mapped.get());
105    println!("Mapped: {}", mapped.get());
106
107    // Filter (FnMut)
108    let mut counter = 0;
109    let mut filtered = BoxStatefulSupplier::new(move || {
110        counter += 1;
111        counter
112    })
113    .filter(is_even_i32);
114    println!("Filtered (odd): {:?}", filtered.get());
115    println!("Filtered (even): {:?}", filtered.get());
116
117    // Zip (Fn)
118    let first = BoxSupplier::new(|| 42);
119    let second = BoxSupplier::new(|| "hello");
120    let zipped = first.zip(second);
121    println!("Zipped: {:?}", zipped.get());
122
123    // Memoize (FnMut)
124    let mut call_count = 0;
125    let mut memoized = BoxStatefulSupplier::new(move || {
126        call_count += 1;
127        println!("  Expensive computation #{}", call_count);
128        42
129    })
130    .memoize();
131    println!("First call: {}", memoized.get());
132    println!("Second call (cached): {}", memoized.get());
133    println!();
134}
135
136fn demo_box_supplier_once() {
137    println!("--- BoxSupplierOnce ---");
138
139    // Basic usage
140    let once = BoxSupplierOnce::new(|| {
141        println!("  Expensive initialization");
142        42
143    });
144    println!("Value: {}", once.get());
145
146    // Moving captured values
147    let data = String::from("Hello, World!");
148    let once = BoxSupplierOnce::new(move || data);
149    println!("Moved data: {}", once.get());
150    println!();
151}
152
153fn demo_arc_supplier() {
154    println!("--- ArcSupplier ---");
155
156    // Basic usage (Fn)
157    let supplier = ArcSupplier::new(|| 42);
158    let s = supplier;
159    println!("Basic: {}", s.get());
160
161    // Reusable transformations (Fn)
162    let source = ArcSupplier::new(|| 10);
163    let doubled = source.map(|x| x * 2);
164    let tripled = source.map(|x| x * 3);
165
166    let s = source;
167    let d = doubled;
168    let t = tripled;
169    println!("Source: {}", s.get());
170    println!("Doubled: {}", d.get());
171    println!("Tripled: {}", t.get());
172
173    // Stateful with ArcStatefulSupplier (FnMut)
174    let call_count = Arc::new(Mutex::new(0));
175    let call_count_clone = Arc::clone(&call_count);
176    let source = ArcStatefulSupplier::new(move || {
177        let mut c = call_count_clone.lock().unwrap();
178        *c += 1;
179        println!("  Computation #{}", *c);
180        42
181    });
182
183    // Memoization with ArcStatefulSupplier
184    let memoized = source.memoize();
185    let mut m = memoized;
186    println!("First call: {}", m.get());
187    println!("Second call (cached): {}", m.get());
188    println!("Call count: {}", *call_count.lock().unwrap());
189    println!();
190}
191
192fn demo_arc_supplier_threading() {
193    println!("--- ArcStatefulSupplier Threading ---");
194
195    let counter = Arc::new(Mutex::new(0));
196    let counter_clone = Arc::clone(&counter);
197
198    let supplier = ArcStatefulSupplier::new(move || {
199        let mut c = counter_clone.lock().unwrap();
200        *c += 1;
201        *c
202    });
203
204    let mut s1 = supplier.clone();
205    let mut s2 = supplier.clone();
206    let mut s3 = supplier;
207
208    let h1 = thread::spawn(move || {
209        let v1 = s1.get();
210        let v2 = s1.get();
211        println!("Thread 1: {} {}", v1, v2);
212        (v1, v2)
213    });
214
215    let h2 = thread::spawn(move || {
216        let v1 = s2.get();
217        let v2 = s2.get();
218        println!("Thread 2: {} {}", v1, v2);
219        (v1, v2)
220    });
221
222    let v1 = s3.get();
223    let v2 = s3.get();
224    println!("Main thread: {} {}", v1, v2);
225
226    h1.join().unwrap();
227    h2.join().unwrap();
228
229    println!("Final counter: {}", *counter.lock().unwrap());
230    println!();
231}
232
233fn demo_rc_supplier() {
234    println!("--- RcSupplier ---");
235
236    // Basic usage (Fn)
237    let supplier = RcSupplier::new(|| 42);
238    let s = supplier;
239    println!("Basic: {}", s.get());
240
241    // Shared state (FnMut) - use RcStatefulSupplier
242    let counter = Rc::new(RefCell::new(0));
243    let counter_clone = Rc::clone(&counter);
244    let supplier = RcStatefulSupplier::new(move || {
245        let mut c = counter_clone.borrow_mut();
246        *c += 1;
247        *c
248    });
249
250    let mut s1 = supplier.clone();
251    let mut s2 = supplier.clone();
252
253    println!("First clone: {}", s1.get());
254    println!("Second clone: {}", s2.get());
255    println!("First clone again: {}", s1.get());
256
257    // Reusable transformations (Fn)
258    let source = RcSupplier::new(|| 10);
259    let doubled = source.map(|x| x * 2);
260    let tripled = source.map(|x| x * 3);
261    let squared = source.map(|x| x * x);
262
263    let s = source;
264    let d = doubled;
265    let t = tripled;
266    let sq = squared;
267
268    println!("Source: {}", s.get());
269    println!("Doubled: {}", d.get());
270    println!("Tripled: {}", t.get());
271    println!("Squared: {}", sq.get());
272    println!();
273}
274
275fn demo_type_conversions() {
276    println!("--- Type Conversions ---");
277
278    // Closure to Box (Fn)
279    let closure = || 42;
280    let boxed = Supplier::into_box(closure);
281    println!("Closure -> Box: {}", boxed.get());
282
283    // Closure to Rc (Fn)
284    let closure = || 100;
285    let rc = Supplier::into_rc(closure);
286    println!("Closure -> Rc: {}", rc.get());
287
288    // Closure to Arc (Fn)
289    let closure = || 200;
290    let arc = Supplier::into_arc(closure);
291    println!("Closure -> Arc: {}", arc.get());
292
293    // Box to Rc (Fn)
294    let boxed = BoxSupplier::new(|| 42);
295    let rc = boxed.into_rc();
296    println!("Box -> Rc: {}", rc.get());
297
298    // Arc to Box (Fn)
299    let arc = ArcSupplier::new(|| 42);
300    let boxed = arc.into_box();
301    println!("Arc -> Box: {}", boxed.get());
302
303    // Rc to Box (Fn)
304    let rc = RcSupplier::new(|| 42);
305    let boxed = rc.into_box();
306    println!("Rc -> Box: {}", boxed.get());
307
308    println!();
309}