Skip to main content

bi_transformer_demo/
bi_transformer_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9
10use qubit_function::{
11    ArcBiTransformer,
12    BiTransformer,
13    BoxBiTransformer,
14    RcBiTransformer,
15};
16
17fn main() {
18    println!("=== BiTransformer Demo ===\n");
19
20    // 1. BoxBiTransformer - Single ownership
21    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    // Constant bi-transformer
29    let constant = BoxBiTransformer::constant("hello");
30    println!("   constant.apply(1, 2) = {}", constant.apply(1, 2));
31    println!();
32
33    // 2. ArcBiTransformer - Thread-safe, cloneable
34    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    // 3. RcBiTransformer - Single-threaded, cloneable
46    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    // 4. Conditional BiTransformer
58    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    // 5. Working with different types
76    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    // 6. Closure as BiTransformer
86    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    // 7. Conversion between types
92    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    // 8. Safe division with Option
100    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    // 9. String concatenation
114    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}