always_bi_predicate_demo/
always_bi_predicate_demo.rs1use qubit_function::{
10 ArcBiPredicate,
11 BiPredicate,
12 BoxBiPredicate,
13 RcBiPredicate,
14};
15
16fn main() {
17 println!("=== BoxBiPredicate always_true/always_false Demo ===\n");
18
19 let always_true: BoxBiPredicate<i32, i32> = BoxBiPredicate::always_true();
21 println!("BoxBiPredicate::always_true():");
22 println!(" test(&42, &10): {}", always_true.test(&42, &10));
23 println!(" test(&-1, &5): {}", always_true.test(&-1, &5));
24 println!(" test(&0, &0): {}", always_true.test(&0, &0));
25 println!(" name: {:?}", always_true.name());
26
27 let always_false: BoxBiPredicate<i32, i32> = BoxBiPredicate::always_false();
29 println!("\nBoxBiPredicate::always_false():");
30 println!(" test(&42, &10): {}", always_false.test(&42, &10));
31 println!(" test(&-1, &5): {}", always_false.test(&-1, &5));
32 println!(" test(&0, &0): {}", always_false.test(&0, &0));
33 println!(" name: {:?}", always_false.name());
34
35 println!("\n=== RcBiPredicate always_true/always_false Demo ===\n");
36
37 let rc_always_true: RcBiPredicate<String, i32> = RcBiPredicate::always_true();
39 println!("RcBiPredicate::always_true():");
40 println!(
41 " test(&\"hello\", &5): {}",
42 rc_always_true.test(&"hello".to_string(), &5)
43 );
44 println!(
45 " test(&\"world\", &-3): {}",
46 rc_always_true.test(&"world".to_string(), &-3)
47 );
48 println!(" name: {:?}", rc_always_true.name());
49
50 let rc_always_false: RcBiPredicate<String, i32> = RcBiPredicate::always_false();
52 println!("\nRcBiPredicate::always_false():");
53 println!(
54 " test(&\"hello\", &5): {}",
55 rc_always_false.test(&"hello".to_string(), &5)
56 );
57 println!(
58 " test(&\"world\", &-3): {}",
59 rc_always_false.test(&"world".to_string(), &-3)
60 );
61 println!(" name: {:?}", rc_always_false.name());
62
63 let rc_clone = rc_always_true.clone();
65 println!("\nAfter cloning, still usable:");
66 println!(
67 " Original: test(&\"test\", &1): {}",
68 rc_always_true.test(&"test".to_string(), &1)
69 );
70 println!(
71 " Clone: test(&\"test\", &2): {}",
72 rc_clone.test(&"test".to_string(), &2)
73 );
74
75 println!("\n=== ArcBiPredicate always_true/always_false Demo ===\n");
76
77 let arc_always_true: ArcBiPredicate<i32, i32> = ArcBiPredicate::always_true();
79 println!("ArcBiPredicate::always_true():");
80 println!(" test(&100, &50): {}", arc_always_true.test(&100, &50));
81 println!(" test(&-100, &25): {}", arc_always_true.test(&-100, &25));
82 println!(" name: {:?}", arc_always_true.name());
83
84 let arc_always_false: ArcBiPredicate<i32, i32> = ArcBiPredicate::always_false();
86 println!("\nArcBiPredicate::always_false():");
87 println!(" test(&100, &50): {}", arc_always_false.test(&100, &50));
88 println!(" test(&-100, &25): {}", arc_always_false.test(&-100, &25));
89 println!(" name: {:?}", arc_always_false.name());
90
91 println!("\n=== Combining with other bi-predicates ===\n");
92
93 let sum_positive = BoxBiPredicate::new(|x: &i32, y: &i32| x + y > 0);
95 let combined_and_true = sum_positive.and(BoxBiPredicate::always_true());
96 println!("sum_positive AND always_true:");
97 println!(
98 " test(&5, &3): {} (equivalent to sum_positive)",
99 combined_and_true.test(&5, &3)
100 );
101 println!(
102 " test(&-3, &-5): {} (equivalent to sum_positive)",
103 combined_and_true.test(&-3, &-5)
104 );
105
106 let sum_positive = BoxBiPredicate::new(|x: &i32, y: &i32| x + y > 0);
108 let combined_and_false = sum_positive.and(BoxBiPredicate::always_false());
109 println!("\nsum_positive AND always_false:");
110 println!(
111 " test(&5, &3): {} (always false)",
112 combined_and_false.test(&5, &3)
113 );
114 println!(
115 " test(&-3, &-5): {} (always false)",
116 combined_and_false.test(&-3, &-5)
117 );
118
119 let sum_positive = BoxBiPredicate::new(|x: &i32, y: &i32| x + y > 0);
121 let combined_or_true = sum_positive.or(BoxBiPredicate::always_true());
122 println!("\nsum_positive OR always_true:");
123 println!(
124 " test(&5, &3): {} (always true)",
125 combined_or_true.test(&5, &3)
126 );
127 println!(
128 " test(&-3, &-5): {} (always true)",
129 combined_or_true.test(&-3, &-5)
130 );
131
132 let sum_positive = BoxBiPredicate::new(|x: &i32, y: &i32| x + y > 0);
134 let combined_or_false = sum_positive.or(BoxBiPredicate::always_false());
135 println!("\nsum_positive OR always_false:");
136 println!(
137 " test(&5, &3): {} (equivalent to sum_positive)",
138 combined_or_false.test(&5, &3)
139 );
140 println!(
141 " test(&-3, &-5): {} (equivalent to sum_positive)",
142 combined_or_false.test(&-3, &-5)
143 );
144
145 println!("\n=== Practical scenarios: Default pass/reject filters ===\n");
146
147 let pairs = vec![(1, 2), (3, 4), (5, 6)];
149 let pass_all = BoxBiPredicate::<i32, i32>::always_true();
150 let closure = pass_all.into_fn();
151 let filtered: Vec<_> = pairs.iter().filter(|(x, y)| closure(x, y)).collect();
152 println!("Default pass all elements: {:?} -> {:?}", pairs, filtered);
153
154 let pairs = vec![(1, 2), (3, 4), (5, 6)];
156 let reject_all = BoxBiPredicate::<i32, i32>::always_false();
157 let closure = reject_all.into_fn();
158 let filtered: Vec<_> = pairs.iter().filter(|(x, y)| closure(x, y)).collect();
159 println!("Default reject all elements: {:?} -> {:?}", pairs, filtered);
160
161 fn configurable_filter(enable_filter: bool) -> BoxBiPredicate<i32, i32> {
163 if enable_filter {
164 BoxBiPredicate::new(|x: &i32, y: &i32| x + y > 5)
165 } else {
166 BoxBiPredicate::always_true()
167 }
168 }
169
170 let pairs = vec![(1, 2), (3, 4), (5, 6)];
171
172 let filter_enabled = configurable_filter(true);
173 let closure = filter_enabled.into_fn();
174 let filtered: Vec<_> = pairs.iter().filter(|(x, y)| closure(x, y)).collect();
175 println!("\nFilter enabled: {:?} -> {:?}", pairs, filtered);
176
177 let filter_disabled = configurable_filter(false);
178 let closure = filter_disabled.into_fn();
179 let filtered: Vec<_> = pairs.iter().filter(|(x, y)| closure(x, y)).collect();
180 println!("Filter disabled: {:?} -> {:?}", pairs, filtered);
181}