bi_transformer_demo/
bi_transformer_demo.rs1use qubit_function::{
12 ArcBiTransformer,
13 BiTransformer,
14 BoxBiTransformer,
15 RcBiTransformer,
16};
17
18fn main() {
19 println!("=== BiTransformer Demo ===\n");
20
21 println!("1. BoxBiTransformer - Single ownership");
23 let add = BoxBiTransformer::new(|x: i32, y: i32| x + y);
24 println!(" add.apply(20, 22) = {}", add.apply(20, 22));
25
26 let multiply = BoxBiTransformer::new(|x: i32, y: i32| x * y);
27 println!(" multiply.apply(6, 7) = {}", multiply.apply(6, 7));
28
29 let constant = BoxBiTransformer::constant("hello");
31 println!(" constant.apply(1, 2) = {}", constant.apply(1, 2));
32 println!();
33
34 println!("2. ArcBiTransformer - Thread-safe, cloneable");
36 let arc_add = ArcBiTransformer::new(|x: i32, y: i32| x + y);
37 let arc_add_clone = arc_add.clone();
38
39 println!(" arc_add.apply(10, 15) = {}", arc_add.apply(10, 15));
40 println!(
41 " arc_add_clone.apply(5, 8) = {}",
42 arc_add_clone.apply(5, 8)
43 );
44 println!();
45
46 println!("3. RcBiTransformer - Single-threaded, cloneable");
48 let rc_multiply = RcBiTransformer::new(|x: i32, y: i32| x * y);
49 let rc_multiply_clone = rc_multiply.clone();
50
51 println!(" rc_multiply.apply(3, 4) = {}", rc_multiply.apply(3, 4));
52 println!(
53 " rc_multiply_clone.apply(5, 6) = {}",
54 rc_multiply_clone.apply(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.apply(5, 3) = {} (both positive, add)",
68 conditional.apply(5, 3)
69 );
70 println!(
71 " conditional.apply(-5, 3) = {} (not both positive, multiply)",
72 conditional.apply(-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.apply(\"Alice\", 30) = {}",
82 format.apply("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!(" subtract.apply(42, 10) = {}", subtract.apply(42, 10));
90 println!();
91
92 println!("7. Conversion between types");
94 let box_add = BoxBiTransformer::new(|x: i32, y: i32| x + y);
95 let rc_add = box_add.into_rc();
96 println!(" Converted BoxBiTransformer to RcBiTransformer");
97 println!(" rc_add.apply(7, 8) = {}", rc_add.apply(7, 8));
98 println!();
99
100 println!("8. Safe division with Option");
102 let safe_divide =
103 BoxBiTransformer::new(|x: i32, y: i32| if y == 0 { None } else { Some(x / y) });
104 println!(
105 " safe_divide.apply(42, 2) = {:?}",
106 safe_divide.apply(42, 2)
107 );
108 println!(
109 " safe_divide.apply(42, 0) = {:?}",
110 safe_divide.apply(42, 0)
111 );
112 println!();
113
114 println!("9. String concatenation");
116 let concat = BoxBiTransformer::new(|s1: String, s2: String| format!("{}{}", s1, s2));
117 println!(
118 " concat.apply(\"Hello\", \"World\") = {}",
119 concat.apply("Hello".to_string(), "World".to_string())
120 );
121 println!();
122
123 println!("=== Demo Complete ===");
124}