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!(" arc_add_clone.apply(5, 8) = {}", arc_add_clone.apply(5, 8));
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!(" rc_multiply.apply(3, 4) = {}", rc_multiply.apply(3, 4));
49 println!(" rc_multiply_clone.apply(5, 6) = {}", rc_multiply_clone.apply(5, 6));
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 = BoxBiTransformer::new(|name: String, age: i32| format!("{} is {} years old", name, age));
73 println!(
74 " format.apply(\"Alice\", 30) = {}",
75 format.apply("Alice".to_string(), 30)
76 );
77 println!();
78
79 println!("6. Closure as BiTransformer");
81 let subtract = |x: i32, y: i32| x - y;
82 println!(" subtract.apply(42, 10) = {}", subtract.apply(42, 10));
83 println!();
84
85 println!("7. Conversion between types");
87 let box_add = BoxBiTransformer::new(|x: i32, y: i32| x + y);
88 let rc_add = box_add.into_rc();
89 println!(" Converted BoxBiTransformer to RcBiTransformer");
90 println!(" rc_add.apply(7, 8) = {}", rc_add.apply(7, 8));
91 println!();
92
93 println!("8. Safe division with Option");
95 let safe_divide = BoxBiTransformer::new(|x: i32, y: i32| if y == 0 { None } else { Some(x / y) });
96 println!(" safe_divide.apply(42, 2) = {:?}", safe_divide.apply(42, 2));
97 println!(" safe_divide.apply(42, 0) = {:?}", safe_divide.apply(42, 0));
98 println!();
99
100 println!("9. String concatenation");
102 let concat = BoxBiTransformer::new(|s1: String, s2: String| format!("{}{}", s1, s2));
103 println!(
104 " concat.apply(\"Hello\", \"World\") = {}",
105 concat.apply("Hello".to_string(), "World".to_string())
106 );
107 println!();
108
109 println!("=== Demo Complete ===");
110}