Skip to main content

bi_transformer_demo/
bi_transformer_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10
11use qubit_function::{
12    ArcBiTransformer,
13    BiTransformer,
14    BoxBiTransformer,
15    RcBiTransformer,
16};
17
18fn main() {
19    println!("=== BiTransformer Demo ===\n");
20
21    // 1. BoxBiTransformer - Single ownership
22    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    // Constant bi-transformer
30    let constant = BoxBiTransformer::constant("hello");
31    println!("   constant.apply(1, 2) = {}", constant.apply(1, 2));
32    println!();
33
34    // 2. ArcBiTransformer - Thread-safe, cloneable
35    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    // 3. RcBiTransformer - Single-threaded, cloneable
47    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    // 4. Conditional BiTransformer
59    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    // 5. Working with different types
77    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    // 6. Closure as BiTransformer
87    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    // 7. Conversion between types
93    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    // 8. Safe division with Option
101    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    // 9. String concatenation
115    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}