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