bi_transformer_demo/
bi_transformer_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025.
4 *    3-Prism Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9
10use prism3_function::{ArcBiTransformer, BiTransformer, BoxBiTransformer, RcBiTransformer};
11
12fn main() {
13    println!("=== BiTransformer Demo ===\n");
14
15    // 1. BoxBiTransformer - Single ownership
16    println!("1. BoxBiTransformer - Single ownership");
17    let add = BoxBiTransformer::new(|x: i32, y: i32| x + y);
18    println!("   add.transform(20, 22) = {}", add.transform(20, 22));
19
20    let multiply = BoxBiTransformer::new(|x: i32, y: i32| x * y);
21    println!("   multiply.transform(6, 7) = {}", multiply.transform(6, 7));
22
23    // Constant bi-transformer
24    let constant = BoxBiTransformer::constant("hello");
25    println!("   constant.transform(1, 2) = {}", constant.transform(1, 2));
26    println!();
27
28    // 2. ArcBiTransformer - Thread-safe, cloneable
29    println!("2. ArcBiTransformer - Thread-safe, cloneable");
30    let arc_add = ArcBiTransformer::new(|x: i32, y: i32| x + y);
31    let arc_add_clone = arc_add.clone();
32
33    println!(
34        "   arc_add.transform(10, 15) = {}",
35        arc_add.transform(10, 15)
36    );
37    println!(
38        "   arc_add_clone.transform(5, 8) = {}",
39        arc_add_clone.transform(5, 8)
40    );
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!(
49        "   rc_multiply.transform(3, 4) = {}",
50        rc_multiply.transform(3, 4)
51    );
52    println!(
53        "   rc_multiply_clone.transform(5, 6) = {}",
54        rc_multiply_clone.transform(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.transform(5, 3) = {} (both positive, add)",
68        conditional.transform(5, 3)
69    );
70    println!(
71        "   conditional.transform(-5, 3) = {} (not both positive, multiply)",
72        conditional.transform(-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.transform(\"Alice\", 30) = {}",
82        format.transform("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!(
90        "   subtract.transform(42, 10) = {}",
91        subtract.transform(42, 10)
92    );
93    println!();
94
95    // 7. Conversion between types
96    println!("7. Conversion between types");
97    let box_add = BoxBiTransformer::new(|x: i32, y: i32| x + y);
98    let rc_add = box_add.into_rc();
99    println!("   Converted BoxBiTransformer to RcBiTransformer");
100    println!("   rc_add.transform(7, 8) = {}", rc_add.transform(7, 8));
101    println!();
102
103    // 8. Safe division with Option
104    println!("8. Safe division with Option");
105    let safe_divide =
106        BoxBiTransformer::new(|x: i32, y: i32| if y == 0 { None } else { Some(x / y) });
107    println!(
108        "   safe_divide.transform(42, 2) = {:?}",
109        safe_divide.transform(42, 2)
110    );
111    println!(
112        "   safe_divide.transform(42, 0) = {:?}",
113        safe_divide.transform(42, 0)
114    );
115    println!();
116
117    // 9. String concatenation
118    println!("9. String concatenation");
119    let concat = BoxBiTransformer::new(|s1: String, s2: String| format!("{}{}", s1, s2));
120    println!(
121        "   concat.transform(\"Hello\", \"World\") = {}",
122        concat.transform("Hello".to_string(), "World".to_string())
123    );
124    println!();
125
126    println!("=== Demo Complete ===");
127}