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.apply(20, 22) = {}", add.apply(20, 22));
19
20 let multiply = BoxBiTransformer::new(|x: i32, y: i32| x * y);
21 println!(" multiply.apply(6, 7) = {}", multiply.apply(6, 7));
22
23 let constant = BoxBiTransformer::constant("hello");
25 println!(" constant.apply(1, 2) = {}", constant.apply(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!(" arc_add.apply(10, 15) = {}", arc_add.apply(10, 15));
34 println!(
35 " arc_add_clone.apply(5, 8) = {}",
36 arc_add_clone.apply(5, 8)
37 );
38 println!();
39
40 println!("3. RcBiTransformer - Single-threaded, cloneable");
42 let rc_multiply = RcBiTransformer::new(|x: i32, y: i32| x * y);
43 let rc_multiply_clone = rc_multiply.clone();
44
45 println!(" rc_multiply.apply(3, 4) = {}", rc_multiply.apply(3, 4));
46 println!(
47 " rc_multiply_clone.apply(5, 6) = {}",
48 rc_multiply_clone.apply(5, 6)
49 );
50 println!();
51
52 println!("4. Conditional BiTransformer");
54 let add_if_positive = BoxBiTransformer::new(|x: i32, y: i32| x + y);
55 let multiply_otherwise = BoxBiTransformer::new(|x: i32, y: i32| x * y);
56 let conditional = add_if_positive
57 .when(|x: &i32, y: &i32| *x > 0 && *y > 0)
58 .or_else(multiply_otherwise);
59
60 println!(
61 " conditional.apply(5, 3) = {} (both positive, add)",
62 conditional.apply(5, 3)
63 );
64 println!(
65 " conditional.apply(-5, 3) = {} (not both positive, multiply)",
66 conditional.apply(-5, 3)
67 );
68 println!();
69
70 println!("5. Working with different types");
72 let format =
73 BoxBiTransformer::new(|name: String, age: i32| format!("{} is {} years old", name, age));
74 println!(
75 " format.apply(\"Alice\", 30) = {}",
76 format.apply("Alice".to_string(), 30)
77 );
78 println!();
79
80 println!("6. Closure as BiTransformer");
82 let subtract = |x: i32, y: i32| x - y;
83 println!(" subtract.apply(42, 10) = {}", subtract.apply(42, 10));
84 println!();
85
86 println!("7. Conversion between types");
88 let box_add = BoxBiTransformer::new(|x: i32, y: i32| x + y);
89 let rc_add = box_add.into_rc();
90 println!(" Converted BoxBiTransformer to RcBiTransformer");
91 println!(" rc_add.apply(7, 8) = {}", rc_add.apply(7, 8));
92 println!();
93
94 println!("8. Safe division with Option");
96 let safe_divide =
97 BoxBiTransformer::new(|x: i32, y: i32| if y == 0 { None } else { Some(x / y) });
98 println!(
99 " safe_divide.apply(42, 2) = {:?}",
100 safe_divide.apply(42, 2)
101 );
102 println!(
103 " safe_divide.apply(42, 0) = {:?}",
104 safe_divide.apply(42, 0)
105 );
106 println!();
107
108 println!("9. String concatenation");
110 let concat = BoxBiTransformer::new(|s1: String, s2: String| format!("{}{}", s1, s2));
111 println!(
112 " concat.apply(\"Hello\", \"World\") = {}",
113 concat.apply("Hello".to_string(), "World".to_string())
114 );
115 println!();
116
117 println!("=== Demo Complete ===");
118}