mapper_demo/
mapper_demo.rs1use prism3_function::{ArcMapper, BoxMapper, FnMapperOps, Mapper, RcMapper};
16
17fn main() {
18 println!("=== Mapper Demo ===\n");
19
20 println!("1. BoxMapper with stateful counter:");
22 let mut counter = 0;
23 let mut mapper = BoxMapper::new(move |x: i32| {
24 counter += 1;
25 format!("Item #{}: {}", counter, x)
26 });
27
28 println!(" {}", mapper.apply(100)); println!(" {}", mapper.apply(200)); println!(" {}", mapper.apply(300)); println!("\n2. Composing mappers with and_then:");
34 let mut counter1 = 0;
35 let mapper1 = BoxMapper::new(move |x: i32| {
36 counter1 += 1;
37 x + counter1
38 });
39
40 let mut counter2 = 0;
41 let mapper2 = BoxMapper::new(move |x: i32| {
42 counter2 += 1;
43 x * counter2
44 });
45
46 let mut composed = mapper1.and_then(mapper2);
47 println!(" First call: {}", composed.apply(10)); println!(" Second call: {}", composed.apply(10)); println!(" Third call: {}", composed.apply(10)); println!("\n3. Conditional mapping:");
53 let mut high_count = 0;
54 let mut low_count = 0;
55
56 let mut conditional = BoxMapper::new(move |x: i32| {
57 high_count += 1;
58 format!("High[{}]: {} * 2 = {}", high_count, x, x * 2)
59 })
60 .when(|x: &i32| *x >= 10)
61 .or_else(move |x| {
62 low_count += 1;
63 format!("Low[{}]: {} + 1 = {}", low_count, x, x + 1)
64 });
65
66 println!(" {}", conditional.apply(15)); println!(" {}", conditional.apply(5)); println!(" {}", conditional.apply(20)); println!("\n4. RcMapper (cloneable, single-threaded):");
72 let mut counter = 0;
73 let mapper = RcMapper::new(move |x: i32| {
74 counter += 1;
75 x + counter
76 });
77
78 let mut mapper1 = mapper.clone();
79 let mut mapper2 = mapper.clone();
80
81 println!(" mapper1: {}", mapper1.apply(10)); println!(" mapper2: {}", mapper2.apply(10)); println!(" mapper1: {}", mapper1.apply(10)); println!("\n5. ArcMapper (thread-safe):");
87 let mut counter = 0;
88 let mapper = ArcMapper::new(move |x: i32| {
89 counter += 1;
90 format!("Result[{}]: {}", counter, x * 2)
91 });
92
93 let mut mapper_clone = mapper.clone();
94 println!(" Original: {}", mapper_clone.apply(5)); println!(" Clone: {}", mapper_clone.apply(7)); println!("\n6. Using FnMapperOps extension trait:");
99 let mut count = 0;
100 let mut mapper = (move |x: i32| {
101 count += 1;
102 x + count
103 })
104 .and_then(|x| x * 2);
105
106 println!(" {}", mapper.apply(10)); println!(" {}", mapper.apply(10)); println!("\n7. Complex processing pipeline:");
111 let mut step1_count = 0;
112 let step1 = BoxMapper::new(move |x: i32| {
113 step1_count += 1;
114 format!("Step1[{}]: {}", step1_count, x)
115 });
116
117 let mut step2_count = 0;
118 let step2 = BoxMapper::new(move |s: String| {
119 step2_count += 1;
120 format!("{} -> Step2[{}]", s, step2_count)
121 });
122
123 let mut step3_count = 0;
124 let step3 = BoxMapper::new(move |s: String| {
125 step3_count += 1;
126 format!("{} -> Step3[{}]", s, step3_count)
127 });
128
129 let mut pipeline = step1.and_then(step2).and_then(step3);
130
131 println!(" {}", pipeline.apply(100));
132 println!(" {}", pipeline.apply(200));
133
134 println!("\n=== Demo Complete ===");
135}