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!("   arc_add_clone.apply(5, 8) = {}", arc_add_clone.apply(5, 8));
41    println!();
42
43    // 3. RcBiTransformer - Single-threaded, cloneable
44    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    // 4. Conditional BiTransformer
53    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    // 5. Working with different types
71    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    // 6. Closure as BiTransformer
80    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    // 7. Conversion between types
86    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    // 8. Safe division with Option
94    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    // 9. String concatenation
101    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}