bi_transformer_demo/
bi_transformer_demo.rs1use prism3_function::{ArcBiTransformer, BiTransformer, BoxBiTransformer, RcBiTransformer};
11
12fn main() {
13 println!("=== BiTransformer Demo ===\n");
14
15 println!("1. BoxBiTransformer - Single ownership");
17 let add = BoxBiTransformer::new(|x: i32, y: i32| x + y);
18 println!(" add.transform(20, 22) = {}", add.transform(20, 22));
19
20 let multiply = BoxBiTransformer::new(|x: i32, y: i32| x * y);
21 println!(" multiply.transform(6, 7) = {}", multiply.transform(6, 7));
22
23 let constant = BoxBiTransformer::constant("hello");
25 println!(" constant.transform(1, 2) = {}", constant.transform(1, 2));
26 println!();
27
28 println!("2. ArcBiTransformer - Thread-safe, cloneable");
30 let arc_add = ArcBiTransformer::new(|x: i32, y: i32| x + y);
31 let arc_add_clone = arc_add.clone();
32
33 println!(
34 " arc_add.transform(10, 15) = {}",
35 arc_add.transform(10, 15)
36 );
37 println!(
38 " arc_add_clone.transform(5, 8) = {}",
39 arc_add_clone.transform(5, 8)
40 );
41 println!();
42
43 println!("3. RcBiTransformer - Single-threaded, cloneable");
45 let rc_multiply = RcBiTransformer::new(|x: i32, y: i32| x * y);
46 let rc_multiply_clone = rc_multiply.clone();
47
48 println!(
49 " rc_multiply.transform(3, 4) = {}",
50 rc_multiply.transform(3, 4)
51 );
52 println!(
53 " rc_multiply_clone.transform(5, 6) = {}",
54 rc_multiply_clone.transform(5, 6)
55 );
56 println!();
57
58 println!("4. Conditional BiTransformer");
60 let add_if_positive = BoxBiTransformer::new(|x: i32, y: i32| x + y);
61 let multiply_otherwise = BoxBiTransformer::new(|x: i32, y: i32| x * y);
62 let conditional = add_if_positive
63 .when(|x: &i32, y: &i32| *x > 0 && *y > 0)
64 .or_else(multiply_otherwise);
65
66 println!(
67 " conditional.transform(5, 3) = {} (both positive, add)",
68 conditional.transform(5, 3)
69 );
70 println!(
71 " conditional.transform(-5, 3) = {} (not both positive, multiply)",
72 conditional.transform(-5, 3)
73 );
74 println!();
75
76 println!("5. Working with different types");
78 let format =
79 BoxBiTransformer::new(|name: String, age: i32| format!("{} is {} years old", name, age));
80 println!(
81 " format.transform(\"Alice\", 30) = {}",
82 format.transform("Alice".to_string(), 30)
83 );
84 println!();
85
86 println!("6. Closure as BiTransformer");
88 let subtract = |x: i32, y: i32| x - y;
89 println!(
90 " subtract.transform(42, 10) = {}",
91 subtract.transform(42, 10)
92 );
93 println!();
94
95 println!("7. Conversion between types");
97 let box_add = BoxBiTransformer::new(|x: i32, y: i32| x + y);
98 let rc_add = box_add.into_rc();
99 println!(" Converted BoxBiTransformer to RcBiTransformer");
100 println!(" rc_add.transform(7, 8) = {}", rc_add.transform(7, 8));
101 println!();
102
103 println!("8. Safe division with Option");
105 let safe_divide =
106 BoxBiTransformer::new(|x: i32, y: i32| if y == 0 { None } else { Some(x / y) });
107 println!(
108 " safe_divide.transform(42, 2) = {:?}",
109 safe_divide.transform(42, 2)
110 );
111 println!(
112 " safe_divide.transform(42, 0) = {:?}",
113 safe_divide.transform(42, 0)
114 );
115 println!();
116
117 println!("9. String concatenation");
119 let concat = BoxBiTransformer::new(|s1: String, s2: String| format!("{}{}", s1, s2));
120 println!(
121 " concat.transform(\"Hello\", \"World\") = {}",
122 concat.transform("Hello".to_string(), "World".to_string())
123 );
124 println!();
125
126 println!("=== Demo Complete ===");
127}