transformer_once_demo/
transformer_once_demo.rs1use prism3_function::{ArcTransformer, BoxTransformer, RcTransformer, TransformerOnce};
19use std::sync::Arc;
20use std::thread;
21
22fn main() {
23 println!("=== TransformerOnce Demo ===\n");
24
25 println!("1. BoxTransformer TransformerOnce demonstration:");
27 let double = BoxTransformer::new(|x: i32| x * 2);
28 let result = double.apply_once(21);
29 println!(" double.apply_once(21) = {}", result);
30
31 let double = BoxTransformer::new(|x: i32| x * 2);
33 let boxed = double.into_box_once();
34 let result = boxed.apply_once(21);
35 println!(" double.into_box_once().apply_once(21) = {}", result);
36
37 let double = BoxTransformer::new(|x: i32| x * 2);
39 let func = double.into_fn_once();
40 let result = func(21);
41 println!(" double.into_fn_once()(21) = {}", result);
42
43 println!();
44
45 println!("2. RcTransformer TransformerOnce demonstration:");
47 let uppercase = RcTransformer::new(|s: String| s.to_uppercase());
48 let result = uppercase.apply_once("hello".to_string());
49 println!(" uppercase.apply_once(\"hello\") = {}", result);
50
51 let uppercase = RcTransformer::new(|s: String| s.to_uppercase());
53 let uppercase_clone = uppercase.clone();
54 let result1 = uppercase.apply_once("world".to_string());
55 let result2 = uppercase_clone.apply_once("rust".to_string());
56 println!(" uppercase.apply_once(\"world\") = {}", result1);
57 println!(" uppercase_clone.apply_once(\"rust\") = {}", result2);
58
59 println!();
60
61 println!("3. ArcTransformer TransformerOnce demonstration:");
63 let parse_and_double = ArcTransformer::new(|s: String| s.parse::<i32>().unwrap_or(0) * 2);
64 let result = parse_and_double.apply_once("21".to_string());
65 println!(" parse_and_double.apply_once(\"21\") = {}", result);
66
67 println!("4. ArcTransformer thread safety demonstration:");
69 let double = ArcTransformer::new(|x: i32| x * 2);
70 let double_arc = Arc::new(double);
71 let _double_clone = Arc::clone(&double_arc);
72
73 let handle = thread::spawn(move || {
74 let new_double = ArcTransformer::new(|x: i32| x * 2);
76 new_double.apply_once(21)
77 });
78
79 let result = handle.join().unwrap();
80 println!(
81 " Executed in thread: new_double.apply_once(21) = {}",
82 result
83 );
84
85 println!("\n=== Demo completed ===");
86}