always_predicate_demo/
always_predicate_demo.rs1use prism3_function::predicate::{ArcPredicate, BoxPredicate, Predicate, RcPredicate};
10
11fn main() {
12 println!("=== BoxPredicate always_true/always_false Demo ===\n");
13
14 let always_true: BoxPredicate<i32> = BoxPredicate::always_true();
16 println!("BoxPredicate::always_true():");
17 println!(" test(&42): {}", always_true.test(&42));
18 println!(" test(&-1): {}", always_true.test(&-1));
19 println!(" test(&0): {}", always_true.test(&0));
20 println!(" name: {:?}", always_true.name());
21
22 let always_false: BoxPredicate<i32> = BoxPredicate::always_false();
24 println!("\nBoxPredicate::always_false():");
25 println!(" test(&42): {}", always_false.test(&42));
26 println!(" test(&-1): {}", always_false.test(&-1));
27 println!(" test(&0): {}", always_false.test(&0));
28 println!(" name: {:?}", always_false.name());
29
30 println!("\n=== RcPredicate always_true/always_false Demo ===\n");
31
32 let rc_always_true: RcPredicate<String> = RcPredicate::always_true();
34 println!("RcPredicate::always_true():");
35 println!(
36 " test(&\"hello\"): {}",
37 rc_always_true.test(&"hello".to_string())
38 );
39 println!(
40 " test(&\"world\"): {}",
41 rc_always_true.test(&"world".to_string())
42 );
43 println!(" name: {:?}", rc_always_true.name());
44
45 let rc_always_false: RcPredicate<String> = RcPredicate::always_false();
47 println!("\nRcPredicate::always_false():");
48 println!(
49 " test(&\"hello\"): {}",
50 rc_always_false.test(&"hello".to_string())
51 );
52 println!(
53 " test(&\"world\"): {}",
54 rc_always_false.test(&"world".to_string())
55 );
56 println!(" name: {:?}", rc_always_false.name());
57
58 let rc_clone = rc_always_true.clone();
60 println!("\nAfter cloning, still usable:");
61 println!(
62 " Original: test(&\"test\"): {}",
63 rc_always_true.test(&"test".to_string())
64 );
65 println!(
66 " Clone: test(&\"test\"): {}",
67 rc_clone.test(&"test".to_string())
68 );
69
70 println!("\n=== ArcPredicate always_true/always_false Demo ===\n");
71
72 let arc_always_true: ArcPredicate<i32> = ArcPredicate::always_true();
74 println!("ArcPredicate::always_true():");
75 println!(" test(&100): {}", arc_always_true.test(&100));
76 println!(" test(&-100): {}", arc_always_true.test(&-100));
77 println!(" name: {:?}", arc_always_true.name());
78
79 let arc_always_false: ArcPredicate<i32> = ArcPredicate::always_false();
81 println!("\nArcPredicate::always_false():");
82 println!(" test(&100): {}", arc_always_false.test(&100));
83 println!(" test(&-100): {}", arc_always_false.test(&-100));
84 println!(" name: {:?}", arc_always_false.name());
85
86 println!("\n=== Combining with other predicates ===\n");
87
88 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
90 let combined_and_true = is_positive.and(BoxPredicate::always_true());
91 println!("is_positive AND always_true:");
92 println!(
93 " test(&5): {} (equivalent to is_positive)",
94 combined_and_true.test(&5)
95 );
96 println!(
97 " test(&-3): {} (equivalent to is_positive)",
98 combined_and_true.test(&-3)
99 );
100
101 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
103 let combined_and_false = is_positive.and(BoxPredicate::always_false());
104 println!("\nis_positive AND always_false:");
105 println!(" test(&5): {} (always false)", combined_and_false.test(&5));
106 println!(
107 " test(&-3): {} (always false)",
108 combined_and_false.test(&-3)
109 );
110
111 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
113 let combined_or_true = is_positive.or(BoxPredicate::always_true());
114 println!("\nis_positive OR always_true:");
115 println!(" test(&5): {} (always true)", combined_or_true.test(&5));
116 println!(" test(&-3): {} (always true)", combined_or_true.test(&-3));
117
118 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
120 let combined_or_false = is_positive.or(BoxPredicate::always_false());
121 println!("\nis_positive OR always_false:");
122 println!(
123 " test(&5): {} (equivalent to is_positive)",
124 combined_or_false.test(&5)
125 );
126 println!(
127 " test(&-3): {} (equivalent to is_positive)",
128 combined_or_false.test(&-3)
129 );
130
131 println!("\n=== Practical scenarios: Default pass/reject filters ===\n");
132
133 let numbers = vec![1, 2, 3, 4, 5];
135 let pass_all = BoxPredicate::<i32>::always_true();
136 let filtered: Vec<_> = numbers.iter().copied().filter(pass_all.into_fn()).collect();
137 println!("Default pass all elements: {:?} -> {:?}", numbers, filtered);
138
139 let numbers = vec![1, 2, 3, 4, 5];
141 let reject_all = BoxPredicate::<i32>::always_false();
142 let filtered: Vec<_> = numbers
143 .iter()
144 .copied()
145 .filter(reject_all.into_fn())
146 .collect();
147 println!(
148 "Default reject all elements: {:?} -> {:?}",
149 numbers, filtered
150 );
151
152 fn configurable_filter(enable_filter: bool) -> BoxPredicate<i32> {
154 if enable_filter {
155 BoxPredicate::new(|x: &i32| *x > 3)
156 } else {
157 BoxPredicate::always_true()
158 }
159 }
160
161 let numbers = vec![1, 2, 3, 4, 5];
162
163 let filter_enabled = configurable_filter(true);
164 let filtered: Vec<_> = numbers
165 .iter()
166 .copied()
167 .filter(filter_enabled.into_fn())
168 .collect();
169 println!("\nFilter enabled: {:?} -> {:?}", numbers, filtered);
170
171 let filter_disabled = configurable_filter(false);
172 let filtered: Vec<_> = numbers
173 .iter()
174 .copied()
175 .filter(filter_disabled.into_fn())
176 .collect();
177 println!("Filter disabled: {:?} -> {:?}", numbers, filtered);
178}