pub struct BoxPredicate<T> { /* private fields */ }Expand description
A Box-based predicate with single ownership.
This type is suitable for one-time use scenarios where the predicate does
not need to be cloned or shared. Composition methods consume self,
reflecting the single-ownership model.
§Examples
use qubit_function::{Predicate, BoxPredicate};
let pred = BoxPredicate::new(|x: &i32| *x > 0);
assert!(pred.test(&5));
// Chaining consumes the predicate
let combined = pred.and(BoxPredicate::new(|x| x % 2 == 0));
assert!(combined.test(&4));Implementations§
Source§impl<T> BoxPredicate<T>
impl<T> BoxPredicate<T>
Sourcepub fn new<F>(f: F) -> Self
pub fn new<F>(f: F) -> Self
Creates a new predicate.
Wraps the provided closure in the appropriate smart pointer type for this predicate implementation.
Examples found in repository?
More examples
86fn box_predicate_examples() {
87 println!("--- 2. BoxPredicate Examples (Single Ownership) ---");
88
89 // Basic BoxPredicate
90 let pred = BoxPredicate::new(|x: &i32| *x > 0);
91 println!("BoxPredicate test 5: {}", pred.test(&5));
92
93 // Named predicate for better debugging
94 let named_pred =
95 BoxPredicate::new_with_name("is_positive_even", |x: &i32| *x > 0 && x % 2 == 0);
96 println!("Predicate name: {:?}", named_pred.name());
97 println!("Test 4: {}", named_pred.test(&4));
98
99 // Method chaining - consumes self
100 let positive = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
101 let even = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
102 let combined = positive.and(even);
103 println!("Combined predicate name: {:?}", combined.name());
104 println!("Test 4: {}", combined.test(&4));
105}
106
107/// RcPredicate examples - single-threaded reuse
108fn rc_predicate_examples() {
109 println!("--- 3. RcPredicate Examples (Single-threaded Reuse) ---");
110
111 let is_positive = RcPredicate::new(|x: &i32| *x > 0);
112 let is_even = RcPredicate::new(|x: &i32| x % 2 == 0);
113
114 // Multiple compositions without consuming the original
115 let positive_and_even = is_positive.and(is_even.clone());
116 let positive_or_even = is_positive.or(is_even.clone());
117
118 println!("Original predicates still available:");
119 println!(" is_positive.test(&5) = {}", is_positive.test(&5));
120 println!(" is_even.test(&4) = {}", is_even.test(&4));
121
122 println!("Combined predicates:");
123 println!(
124 " positive_and_even.test(&4) = {}",
125 positive_and_even.test(&4)
126 );
127 println!(
128 " positive_or_even.test(&5) = {}",
129 positive_or_even.test(&5)
130 );
131
132 // Cloning
133 let cloned = is_positive.clone();
134 println!("Cloned predicate: {}", cloned.test(&10));
135}
136
137/// ArcPredicate examples - multi-threaded scenarios
138fn arc_predicate_examples() {
139 println!("--- 4. ArcPredicate Examples (Multi-threaded Scenarios) ---");
140
141 let is_positive = ArcPredicate::new(|x: &i32| *x > 0);
142 let is_even = ArcPredicate::new(|x: &i32| x % 2 == 0);
143
144 // Create combined predicate
145 let combined = is_positive.and(is_even);
146
147 // Use in multiple threads
148 let handles: Vec<_> = (0..3)
149 .map(|i| {
150 let pred = combined.clone();
151 std::thread::spawn(move || {
152 let value = i * 2;
153 println!(" Thread {} testing {}: {}", i, value, pred.test(&value));
154 })
155 })
156 .collect();
157
158 for handle in handles {
159 handle.join().unwrap();
160 }
161
162 // Original predicates still usable
163 println!("Original predicates still available in main thread:");
164 println!(" is_positive.test(&5) = {}", is_positive.test(&5));
165}
166
167/// Logical composition examples
168fn logical_composition_examples() {
169 println!("--- 5. Logical Composition Examples ---");
170
171 let positive = RcPredicate::new_with_name("positive", |x: &i32| *x > 0);
172 let even = RcPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
173 let less_than_ten = RcPredicate::new_with_name("less_than_ten", |x: &i32| *x < 10);
174
175 // AND composition
176 let positive_and_even = positive.and(even.clone());
177 println!("positive AND even: name={:?}", positive_and_even.name());
178 println!(" Test 4: {}", positive_and_even.test(&4));
179 println!(" Test 5: {}", positive_and_even.test(&5));
180
181 // OR composition
182 let positive_or_even = positive.or(even.clone());
183 println!("positive OR even: name={:?}", positive_or_even.name());
184 println!(" Test -2: {}", positive_or_even.test(&-2));
185 println!(" Test 5: {}", positive_or_even.test(&5));
186
187 // NOT composition
188 let not_positive = positive.not();
189 println!("NOT positive: name={:?}", not_positive.name());
190 println!(" Test 5: {}", not_positive.test(&5));
191 println!(" Test -3: {}", not_positive.test(&-3));
192
193 // NAND composition
194 let nand = positive.nand(even.clone());
195 println!("positive NAND even: name={:?}", nand.name());
196 println!(" Test 3: {}", nand.test(&3)); // true NAND false = true
197 println!(" Test 4: {}", nand.test(&4)); // true NAND true = false
198
199 // XOR composition
200 let xor = positive.xor(even.clone());
201 println!("positive XOR even: name={:?}", xor.name());
202 println!(" Test 3: {}", xor.test(&3)); // true XOR false = true
203 println!(" Test 4: {}", xor.test(&4)); // true XOR true = false
204 println!(" Test -2: {}", xor.test(&-2)); // false XOR true = true
205
206 // NOR composition
207 let nor = positive.nor(even.clone());
208 println!("positive NOR even: name={:?}", nor.name());
209 println!(" Test -3: {}", nor.test(&-3)); // false NOR false = true
210 println!(" Test 3: {}", nor.test(&3)); // true NOR false = false
211 println!(" Test -2: {}", nor.test(&-2)); // false NOR true = false
212 println!(" Test 4: {}", nor.test(&4)); // true NOR true = false
213
214 // Complex composition
215 let complex = positive.and(even.clone()).and(less_than_ten.clone());
216 println!("Complex composition: name={:?}", complex.name());
217 println!(" Test 4: {}", complex.test(&4));
218 println!(" Test 12: {}", complex.test(&12));
219}
220
221/// Interior mutability examples
222fn interior_mutability_examples() {
223 println!("--- 6. Interior Mutability Examples ---");
224
225 // BoxPredicate with counter (RefCell)
226 println!("BoxPredicate with counter:");
227 let count = RefCell::new(0);
228 let pred = BoxPredicate::new(move |x: &i32| {
229 *count.borrow_mut() += 1;
230 *x > 0
231 });
232 println!(" Test 5: {}", pred.test(&5));
233 println!(" Test -3: {}", pred.test(&-3));
234 println!(" Test 10: {}", pred.test(&10));
235 // Note: count is moved into the closure, so we can't access it here
236
237 // RcPredicate with cache (RefCell + HashMap)
238 println!("\nRcPredicate with cache:");
239 let cache: RefCell<HashMap<i32, bool>> = RefCell::new(HashMap::new());
240 let expensive_pred = RcPredicate::new(move |x: &i32| {
241 let mut c = cache.borrow_mut();
242 *c.entry(*x).or_insert_with(|| {
243 println!(" Computing result for {} (expensive operation)", x);
244 *x > 0 && x % 2 == 0
245 })
246 });
247
248 println!(" First test 4:");
249 println!(" Result: {}", expensive_pred.test(&4));
250 println!(" Test 4 again (using cache):");
251 println!(" Result: {}", expensive_pred.test(&4));
252 println!(" Test 3:");
253 println!(" Result: {}", expensive_pred.test(&3));
254
255 // ArcPredicate with thread-safe counter (Mutex)
256 println!("\nArcPredicate with thread-safe counter:");
257 let counter = Arc::new(Mutex::new(0));
258 let pred = ArcPredicate::new({
259 let counter = Arc::clone(&counter);
260 move |x: &i32| {
261 let mut c = counter.lock().unwrap();
262 *c += 1;
263 *x > 0
264 }
265 });
266
267 let pred_clone = pred.clone();
268 let counter_clone = Arc::clone(&counter);
269
270 let handle = std::thread::spawn(move || {
271 pred_clone.test(&5);
272 pred_clone.test(&10);
273 });
274
275 pred.test(&3);
276 handle.join().unwrap();
277
278 println!(" Total call count: {}", counter_clone.lock().unwrap());
279}29fn demo_box_predicate() {
30 println!("1. BoxPredicate Naming Functionality");
31
32 // Create a predicate with name using new_with_name
33 let pred1 = BoxPredicate::new_with_name("is_positive", |x: &i32| *x > 0);
34 println!(" Created with new_with_name:");
35 println!(" Name: {:?}", pred1.name());
36 println!(" Test 5: {}", pred1.test(&5));
37
38 // Set name for an existing predicate using set_name
39 let mut pred2 = BoxPredicate::new(|x: &i32| x % 2 == 0);
40 println!("\n Created with new then set_name:");
41 println!(" Initial name: {:?}", pred2.name());
42 pred2.set_name("is_even");
43 println!(" Name after setting: {:?}", pred2.name());
44 println!(" Test 4: {}", pred2.test(&4));
45
46 // Combined predicates automatically generate new names
47 let pred3 = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
48 let pred4 = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
49 let combined = pred3.and(pred4);
50 println!("\n Combined predicate name:");
51 println!(" Auto-generated name: {:?}", combined.name());
52 println!(" Test 4: {}\n", combined.test(&4));
53}17fn main() {
18 println!("=== BoxPredicate always_true/always_false Demo ===\n");
19
20 // BoxPredicate::always_true
21 let always_true: BoxPredicate<i32> = BoxPredicate::always_true();
22 println!("BoxPredicate::always_true():");
23 println!(" test(&42): {}", always_true.test(&42));
24 println!(" test(&-1): {}", always_true.test(&-1));
25 println!(" test(&0): {}", always_true.test(&0));
26 println!(" name: {:?}", always_true.name());
27
28 // BoxPredicate::always_false
29 let always_false: BoxPredicate<i32> = BoxPredicate::always_false();
30 println!("\nBoxPredicate::always_false():");
31 println!(" test(&42): {}", always_false.test(&42));
32 println!(" test(&-1): {}", always_false.test(&-1));
33 println!(" test(&0): {}", always_false.test(&0));
34 println!(" name: {:?}", always_false.name());
35
36 println!("\n=== RcPredicate always_true/always_false Demo ===\n");
37
38 // RcPredicate::always_true
39 let rc_always_true: RcPredicate<String> = RcPredicate::always_true();
40 println!("RcPredicate::always_true():");
41 println!(
42 " test(&\"hello\"): {}",
43 rc_always_true.test(&"hello".to_string())
44 );
45 println!(
46 " test(&\"world\"): {}",
47 rc_always_true.test(&"world".to_string())
48 );
49 println!(" name: {:?}", rc_always_true.name());
50
51 // RcPredicate::always_false
52 let rc_always_false: RcPredicate<String> = RcPredicate::always_false();
53 println!("\nRcPredicate::always_false():");
54 println!(
55 " test(&\"hello\"): {}",
56 rc_always_false.test(&"hello".to_string())
57 );
58 println!(
59 " test(&\"world\"): {}",
60 rc_always_false.test(&"world".to_string())
61 );
62 println!(" name: {:?}", rc_always_false.name());
63
64 // Can be cloned and reused
65 let rc_clone = rc_always_true.clone();
66 println!("\nAfter cloning, still usable:");
67 println!(
68 " Original: test(&\"test\"): {}",
69 rc_always_true.test(&"test".to_string())
70 );
71 println!(
72 " Clone: test(&\"test\"): {}",
73 rc_clone.test(&"test".to_string())
74 );
75
76 println!("\n=== ArcPredicate always_true/always_false Demo ===\n");
77
78 // ArcPredicate::always_true
79 let arc_always_true: ArcPredicate<i32> = ArcPredicate::always_true();
80 println!("ArcPredicate::always_true():");
81 println!(" test(&100): {}", arc_always_true.test(&100));
82 println!(" test(&-100): {}", arc_always_true.test(&-100));
83 println!(" name: {:?}", arc_always_true.name());
84
85 // ArcPredicate::always_false
86 let arc_always_false: ArcPredicate<i32> = ArcPredicate::always_false();
87 println!("\nArcPredicate::always_false():");
88 println!(" test(&100): {}", arc_always_false.test(&100));
89 println!(" test(&-100): {}", arc_always_false.test(&-100));
90 println!(" name: {:?}", arc_always_false.name());
91
92 println!("\n=== Combining with other predicates ===\n");
93
94 // Combining with always_true (AND)
95 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
96 let combined_and_true = is_positive.and(BoxPredicate::always_true());
97 println!("is_positive AND always_true:");
98 println!(
99 " test(&5): {} (equivalent to is_positive)",
100 combined_and_true.test(&5)
101 );
102 println!(
103 " test(&-3): {} (equivalent to is_positive)",
104 combined_and_true.test(&-3)
105 );
106
107 // Combining with always_false (AND)
108 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
109 let combined_and_false = is_positive.and(BoxPredicate::always_false());
110 println!("\nis_positive AND always_false:");
111 println!(" test(&5): {} (always false)", combined_and_false.test(&5));
112 println!(
113 " test(&-3): {} (always false)",
114 combined_and_false.test(&-3)
115 );
116
117 // Combining with always_true (OR)
118 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
119 let combined_or_true = is_positive.or(BoxPredicate::always_true());
120 println!("\nis_positive OR always_true:");
121 println!(" test(&5): {} (always true)", combined_or_true.test(&5));
122 println!(" test(&-3): {} (always true)", combined_or_true.test(&-3));
123
124 // Combining with always_false (OR)
125 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
126 let combined_or_false = is_positive.or(BoxPredicate::always_false());
127 println!("\nis_positive OR always_false:");
128 println!(
129 " test(&5): {} (equivalent to is_positive)",
130 combined_or_false.test(&5)
131 );
132 println!(
133 " test(&-3): {} (equivalent to is_positive)",
134 combined_or_false.test(&-3)
135 );
136
137 println!("\n=== Practical scenarios: Default pass/reject filters ===\n");
138
139 // Scenario 1: Default pass-all filter
140 let numbers = vec![1, 2, 3, 4, 5];
141 let pass_all = BoxPredicate::<i32>::always_true();
142 let filtered: Vec<_> = numbers.iter().copied().filter(pass_all.into_fn()).collect();
143 println!("Default pass all elements: {:?} -> {:?}", numbers, filtered);
144
145 // Scenario 2: Default reject-all filter
146 let numbers = vec![1, 2, 3, 4, 5];
147 let reject_all = BoxPredicate::<i32>::always_false();
148 let filtered: Vec<_> = numbers
149 .iter()
150 .copied()
151 .filter(reject_all.into_fn())
152 .collect();
153 println!(
154 "Default reject all elements: {:?} -> {:?}",
155 numbers, filtered
156 );
157
158 // Scenario 3: Configurable filter
159 fn configurable_filter(enable_filter: bool) -> BoxPredicate<i32> {
160 if enable_filter {
161 BoxPredicate::new(|x: &i32| *x > 3)
162 } else {
163 BoxPredicate::always_true()
164 }
165 }
166
167 let numbers = vec![1, 2, 3, 4, 5];
168
169 let filter_enabled = configurable_filter(true);
170 let filtered: Vec<_> = numbers
171 .iter()
172 .copied()
173 .filter(filter_enabled.into_fn())
174 .collect();
175 println!("\nFilter enabled: {:?} -> {:?}", numbers, filtered);
176
177 let filter_disabled = configurable_filter(false);
178 let filtered: Vec<_> = numbers
179 .iter()
180 .copied()
181 .filter(filter_disabled.into_fn())
182 .collect();
183 println!("Filter disabled: {:?} -> {:?}", numbers, filtered);
184}21fn main() {
22 println!("=== MutatorOnce Conditional Execution Examples ===\n");
23
24 // 1. Basic conditional execution - when condition is satisfied
25 println!("1. Basic conditional execution - when condition is satisfied");
26 let data = vec![1, 2, 3];
27 let mutator = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
28 println!(" Extending vector with data: {:?}", data);
29 x.extend(data);
30 });
31 let conditional = mutator.when(|x: &Vec<i32>| {
32 println!(" Checking condition: !x.is_empty()");
33 !x.is_empty()
34 });
35
36 let mut target = vec![0];
37 println!(" Initial: {:?}", target);
38 conditional.apply(&mut target);
39 println!(" Result: {:?}\n", target);
40
41 // 2. Conditional execution - when condition is not satisfied
42 println!("2. Conditional execution - when condition is not satisfied");
43 let data = vec![4, 5, 6];
44 let mutator = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
45 println!(" This should not be executed");
46 x.extend(data);
47 });
48 let conditional = mutator.when(|x: &Vec<i32>| {
49 println!(" Checking condition: x.len() > 10");
50 x.len() > 10
51 });
52
53 let mut target = vec![0];
54 println!(" Initial: {:?}", target);
55 conditional.apply(&mut target);
56 println!(" Result: {:?} (unchanged)\n", target);
57
58 // 3. Using BoxPredicate
59 println!("3. Using BoxPredicate");
60 let pred = BoxPredicate::new(|x: &Vec<i32>| {
61 println!(" Predicate: checking if vector is not empty");
62 !x.is_empty()
63 });
64 let data = vec![7, 8, 9];
65 let mutator = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
66 println!(" Adding data: {:?}", data);
67 x.extend(data);
68 });
69 let conditional = mutator.when(pred);
70
71 let mut target = vec![0];
72 println!(" Initial: {:?}", target);
73 conditional.apply(&mut target);
74 println!(" Result: {:?}\n", target);
75
76 // 4. Using composed predicate
77 println!("4. Using composed predicate");
78 let pred = (|x: &Vec<i32>| {
79 println!(" Condition 1: !x.is_empty()");
80 !x.is_empty()
81 })
82 .and(|x: &Vec<i32>| {
83 println!(" Condition 2: x.len() < 10");
84 x.len() < 10
85 });
86 let data = vec![10, 11, 12];
87 let mutator = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
88 println!(" Adding data: {:?}", data);
89 x.extend(data);
90 });
91 let conditional = mutator.when(pred);
92
93 let mut target = vec![0];
94 println!(" Initial: {:?}", target);
95 conditional.apply(&mut target);
96 println!(" Result: {:?}\n", target);
97
98 // 5. If-then-else with or_else - when branch
99 println!("5. If-then-else with or_else - when branch");
100 let data1 = vec![1, 2, 3];
101 let data2 = vec![99];
102 let mutator = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
103 println!(" When branch: adding {:?}", data1);
104 x.extend(data1);
105 })
106 .when(|x: &Vec<i32>| {
107 println!(" Checking: !x.is_empty()");
108 !x.is_empty()
109 })
110 .or_else(move |x: &mut Vec<i32>| {
111 println!(" Else branch: adding {:?}", data2);
112 x.extend(data2);
113 });
114
115 let mut target = vec![0];
116 println!(" Initial: {:?}", target);
117 mutator.apply(&mut target);
118 println!(" Result: {:?}\n", target);
119
120 // 6. If-then-else with or_else - else branch
121 println!("6. If-then-else with or_else - else branch");
122 let data1 = vec![4, 5, 6];
123 let data2 = vec![99];
124 let mutator = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
125 println!(" When branch: adding {:?}", data1);
126 x.extend(data1);
127 })
128 .when(|x: &Vec<i32>| {
129 println!(" Checking: x.is_empty()");
130 x.is_empty()
131 })
132 .or_else(move |x: &mut Vec<i32>| {
133 println!(" Else branch: adding {:?}", data2);
134 x.extend(data2);
135 });
136
137 let mut target = vec![0];
138 println!(" Initial: {:?}", target);
139 mutator.apply(&mut target);
140 println!(" Result: {:?}\n", target);
141
142 // 7. Conditional with integers
143 println!("7. Conditional with integers");
144 let mutator = BoxMutatorOnce::new(|x: &mut i32| {
145 println!(" Multiplying by 2");
146 *x *= 2;
147 })
148 .when(|x: &i32| {
149 println!(" Checking: *x > 0");
150 *x > 0
151 });
152
153 let mut positive = 5;
154 println!(" Initial (positive): {}", positive);
155 mutator.apply(&mut positive);
156 println!(" Result: {}\n", positive);
157
158 // 8. Conditional with integers - not executed
159 println!("8. Conditional with integers - not executed");
160 let mutator = BoxMutatorOnce::new(|x: &mut i32| {
161 println!(" This should not be executed");
162 *x *= 2;
163 })
164 .when(|x: &i32| {
165 println!(" Checking: *x > 0");
166 *x > 0
167 });
168
169 let mut negative = -5;
170 println!(" Initial (negative): {}", negative);
171 mutator.apply(&mut negative);
172 println!(" Result: {} (unchanged)\n", negative);
173
174 // 9. Chaining conditional mutators
175 println!("9. Chaining conditional mutators");
176 let data1 = vec![1, 2];
177 let cond1 = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
178 println!(" First mutator: adding {:?}", data1);
179 x.extend(data1);
180 })
181 .when(|x: &Vec<i32>| {
182 println!(" First condition: !x.is_empty()");
183 !x.is_empty()
184 });
185
186 let data2 = vec![3, 4];
187 let cond2 = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
188 println!(" Second mutator: adding {:?}", data2);
189 x.extend(data2);
190 })
191 .when(|x: &Vec<i32>| {
192 println!(" Second condition: x.len() < 10");
193 x.len() < 10
194 });
195
196 let chained = cond1.and_then(cond2);
197
198 let mut target = vec![0];
199 println!(" Initial: {:?}", target);
200 chained.apply(&mut target);
201 println!(" Result: {:?}\n", target);
202
203 // 10. Complex conditional chain
204 println!("10. Complex conditional chain");
205 let data1 = vec![1, 2];
206 let data2 = vec![99];
207 let data3 = vec![5, 6];
208
209 let mutator = BoxMutatorOnce::new(move |x: &mut Vec<i32>| {
210 println!(" When branch: adding {:?}", data1);
211 x.extend(data1);
212 })
213 .when(|x: &Vec<i32>| {
214 println!(" Checking: !x.is_empty()");
215 !x.is_empty()
216 })
217 .or_else(move |x: &mut Vec<i32>| {
218 println!(" Else branch: adding {:?}", data2);
219 x.extend(data2);
220 })
221 .and_then(move |x: &mut Vec<i32>| {
222 println!(" Final step: adding {:?}", data3);
223 x.extend(data3);
224 });
225
226 let mut target = vec![0];
227 println!(" Initial: {:?}", target);
228 mutator.apply(&mut target);
229 println!(" Result: {:?}\n", target);
230
231 // 11. Real-world scenario: data validation and processing
232 println!("11. Real-world scenario: data validation and processing");
233
234 struct DataProcessor {
235 on_valid: Option<BoxMutatorOnce<Vec<String>>>,
236 on_invalid: Option<BoxMutatorOnce<Vec<String>>>,
237 }
238
239 impl DataProcessor {
240 fn new<V, I>(on_valid: V, on_invalid: I) -> Self
241 where
242 V: FnOnce(&mut Vec<String>) + 'static,
243 I: FnOnce(&mut Vec<String>) + 'static,
244 {
245 Self {
246 on_valid: Some(BoxMutatorOnce::new(on_valid)),
247 on_invalid: Some(BoxMutatorOnce::new(on_invalid)),
248 }
249 }
250
251 fn process(mut self, data: &mut Vec<String>) {
252 let is_valid = !data.is_empty() && data.iter().all(|s| !s.is_empty());
253 println!(
254 " Data validation: {}",
255 if is_valid { "VALID" } else { "INVALID" }
256 );
257
258 if is_valid {
259 if let Some(callback) = self.on_valid.take() {
260 callback.apply(data);
261 }
262 } else if let Some(callback) = self.on_invalid.take() {
263 callback.apply(data);
264 }
265 }
266 }
267
268 let valid_suffix = vec!["processed".to_string()];
269 let invalid_marker = vec!["[INVALID]".to_string()];
270
271 let processor = DataProcessor::new(
272 move |data| {
273 println!(" Valid data callback: adding suffix");
274 data.extend(valid_suffix);
275 },
276 move |data| {
277 println!(" Invalid data callback: adding error marker");
278 data.clear();
279 data.extend(invalid_marker);
280 },
281 );
282
283 let mut valid_data = vec!["item1".to_string(), "item2".to_string()];
284 println!(" Processing valid data: {:?}", valid_data);
285 processor.process(&mut valid_data);
286 println!(" Result: {:?}\n", valid_data);
287
288 println!("=== Examples completed ===");
289}Sourcepub fn new_with_name<F>(name: &str, f: F) -> Self
pub fn new_with_name<F>(name: &str, f: F) -> Self
Creates a new named predicate.
Wraps the provided closure and assigns it a name, which is useful for debugging and logging purposes.
Examples found in repository?
86fn box_predicate_examples() {
87 println!("--- 2. BoxPredicate Examples (Single Ownership) ---");
88
89 // Basic BoxPredicate
90 let pred = BoxPredicate::new(|x: &i32| *x > 0);
91 println!("BoxPredicate test 5: {}", pred.test(&5));
92
93 // Named predicate for better debugging
94 let named_pred =
95 BoxPredicate::new_with_name("is_positive_even", |x: &i32| *x > 0 && x % 2 == 0);
96 println!("Predicate name: {:?}", named_pred.name());
97 println!("Test 4: {}", named_pred.test(&4));
98
99 // Method chaining - consumes self
100 let positive = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
101 let even = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
102 let combined = positive.and(even);
103 println!("Combined predicate name: {:?}", combined.name());
104 println!("Test 4: {}", combined.test(&4));
105}More examples
29fn demo_box_predicate() {
30 println!("1. BoxPredicate Naming Functionality");
31
32 // Create a predicate with name using new_with_name
33 let pred1 = BoxPredicate::new_with_name("is_positive", |x: &i32| *x > 0);
34 println!(" Created with new_with_name:");
35 println!(" Name: {:?}", pred1.name());
36 println!(" Test 5: {}", pred1.test(&5));
37
38 // Set name for an existing predicate using set_name
39 let mut pred2 = BoxPredicate::new(|x: &i32| x % 2 == 0);
40 println!("\n Created with new then set_name:");
41 println!(" Initial name: {:?}", pred2.name());
42 pred2.set_name("is_even");
43 println!(" Name after setting: {:?}", pred2.name());
44 println!(" Test 4: {}", pred2.test(&4));
45
46 // Combined predicates automatically generate new names
47 let pred3 = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
48 let pred4 = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
49 let combined = pred3.and(pred4);
50 println!("\n Combined predicate name:");
51 println!(" Auto-generated name: {:?}", combined.name());
52 println!(" Test 4: {}\n", combined.test(&4));
53}Sourcepub fn new_with_optional_name<F>(f: F, name: Option<String>) -> Self
pub fn new_with_optional_name<F>(f: F, name: Option<String>) -> Self
Creates a new named predicate with an optional name.
Wraps the provided closure and assigns it an optional name.
Sourcepub fn name(&self) -> Option<&str>
pub fn name(&self) -> Option<&str>
Examples found in repository?
86fn box_predicate_examples() {
87 println!("--- 2. BoxPredicate Examples (Single Ownership) ---");
88
89 // Basic BoxPredicate
90 let pred = BoxPredicate::new(|x: &i32| *x > 0);
91 println!("BoxPredicate test 5: {}", pred.test(&5));
92
93 // Named predicate for better debugging
94 let named_pred =
95 BoxPredicate::new_with_name("is_positive_even", |x: &i32| *x > 0 && x % 2 == 0);
96 println!("Predicate name: {:?}", named_pred.name());
97 println!("Test 4: {}", named_pred.test(&4));
98
99 // Method chaining - consumes self
100 let positive = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
101 let even = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
102 let combined = positive.and(even);
103 println!("Combined predicate name: {:?}", combined.name());
104 println!("Test 4: {}", combined.test(&4));
105}More examples
29fn demo_box_predicate() {
30 println!("1. BoxPredicate Naming Functionality");
31
32 // Create a predicate with name using new_with_name
33 let pred1 = BoxPredicate::new_with_name("is_positive", |x: &i32| *x > 0);
34 println!(" Created with new_with_name:");
35 println!(" Name: {:?}", pred1.name());
36 println!(" Test 5: {}", pred1.test(&5));
37
38 // Set name for an existing predicate using set_name
39 let mut pred2 = BoxPredicate::new(|x: &i32| x % 2 == 0);
40 println!("\n Created with new then set_name:");
41 println!(" Initial name: {:?}", pred2.name());
42 pred2.set_name("is_even");
43 println!(" Name after setting: {:?}", pred2.name());
44 println!(" Test 4: {}", pred2.test(&4));
45
46 // Combined predicates automatically generate new names
47 let pred3 = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
48 let pred4 = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
49 let combined = pred3.and(pred4);
50 println!("\n Combined predicate name:");
51 println!(" Auto-generated name: {:?}", combined.name());
52 println!(" Test 4: {}\n", combined.test(&4));
53}17fn main() {
18 println!("=== BoxPredicate always_true/always_false Demo ===\n");
19
20 // BoxPredicate::always_true
21 let always_true: BoxPredicate<i32> = BoxPredicate::always_true();
22 println!("BoxPredicate::always_true():");
23 println!(" test(&42): {}", always_true.test(&42));
24 println!(" test(&-1): {}", always_true.test(&-1));
25 println!(" test(&0): {}", always_true.test(&0));
26 println!(" name: {:?}", always_true.name());
27
28 // BoxPredicate::always_false
29 let always_false: BoxPredicate<i32> = BoxPredicate::always_false();
30 println!("\nBoxPredicate::always_false():");
31 println!(" test(&42): {}", always_false.test(&42));
32 println!(" test(&-1): {}", always_false.test(&-1));
33 println!(" test(&0): {}", always_false.test(&0));
34 println!(" name: {:?}", always_false.name());
35
36 println!("\n=== RcPredicate always_true/always_false Demo ===\n");
37
38 // RcPredicate::always_true
39 let rc_always_true: RcPredicate<String> = RcPredicate::always_true();
40 println!("RcPredicate::always_true():");
41 println!(
42 " test(&\"hello\"): {}",
43 rc_always_true.test(&"hello".to_string())
44 );
45 println!(
46 " test(&\"world\"): {}",
47 rc_always_true.test(&"world".to_string())
48 );
49 println!(" name: {:?}", rc_always_true.name());
50
51 // RcPredicate::always_false
52 let rc_always_false: RcPredicate<String> = RcPredicate::always_false();
53 println!("\nRcPredicate::always_false():");
54 println!(
55 " test(&\"hello\"): {}",
56 rc_always_false.test(&"hello".to_string())
57 );
58 println!(
59 " test(&\"world\"): {}",
60 rc_always_false.test(&"world".to_string())
61 );
62 println!(" name: {:?}", rc_always_false.name());
63
64 // Can be cloned and reused
65 let rc_clone = rc_always_true.clone();
66 println!("\nAfter cloning, still usable:");
67 println!(
68 " Original: test(&\"test\"): {}",
69 rc_always_true.test(&"test".to_string())
70 );
71 println!(
72 " Clone: test(&\"test\"): {}",
73 rc_clone.test(&"test".to_string())
74 );
75
76 println!("\n=== ArcPredicate always_true/always_false Demo ===\n");
77
78 // ArcPredicate::always_true
79 let arc_always_true: ArcPredicate<i32> = ArcPredicate::always_true();
80 println!("ArcPredicate::always_true():");
81 println!(" test(&100): {}", arc_always_true.test(&100));
82 println!(" test(&-100): {}", arc_always_true.test(&-100));
83 println!(" name: {:?}", arc_always_true.name());
84
85 // ArcPredicate::always_false
86 let arc_always_false: ArcPredicate<i32> = ArcPredicate::always_false();
87 println!("\nArcPredicate::always_false():");
88 println!(" test(&100): {}", arc_always_false.test(&100));
89 println!(" test(&-100): {}", arc_always_false.test(&-100));
90 println!(" name: {:?}", arc_always_false.name());
91
92 println!("\n=== Combining with other predicates ===\n");
93
94 // Combining with always_true (AND)
95 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
96 let combined_and_true = is_positive.and(BoxPredicate::always_true());
97 println!("is_positive AND always_true:");
98 println!(
99 " test(&5): {} (equivalent to is_positive)",
100 combined_and_true.test(&5)
101 );
102 println!(
103 " test(&-3): {} (equivalent to is_positive)",
104 combined_and_true.test(&-3)
105 );
106
107 // Combining with always_false (AND)
108 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
109 let combined_and_false = is_positive.and(BoxPredicate::always_false());
110 println!("\nis_positive AND always_false:");
111 println!(" test(&5): {} (always false)", combined_and_false.test(&5));
112 println!(
113 " test(&-3): {} (always false)",
114 combined_and_false.test(&-3)
115 );
116
117 // Combining with always_true (OR)
118 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
119 let combined_or_true = is_positive.or(BoxPredicate::always_true());
120 println!("\nis_positive OR always_true:");
121 println!(" test(&5): {} (always true)", combined_or_true.test(&5));
122 println!(" test(&-3): {} (always true)", combined_or_true.test(&-3));
123
124 // Combining with always_false (OR)
125 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
126 let combined_or_false = is_positive.or(BoxPredicate::always_false());
127 println!("\nis_positive OR always_false:");
128 println!(
129 " test(&5): {} (equivalent to is_positive)",
130 combined_or_false.test(&5)
131 );
132 println!(
133 " test(&-3): {} (equivalent to is_positive)",
134 combined_or_false.test(&-3)
135 );
136
137 println!("\n=== Practical scenarios: Default pass/reject filters ===\n");
138
139 // Scenario 1: Default pass-all filter
140 let numbers = vec![1, 2, 3, 4, 5];
141 let pass_all = BoxPredicate::<i32>::always_true();
142 let filtered: Vec<_> = numbers.iter().copied().filter(pass_all.into_fn()).collect();
143 println!("Default pass all elements: {:?} -> {:?}", numbers, filtered);
144
145 // Scenario 2: Default reject-all filter
146 let numbers = vec![1, 2, 3, 4, 5];
147 let reject_all = BoxPredicate::<i32>::always_false();
148 let filtered: Vec<_> = numbers
149 .iter()
150 .copied()
151 .filter(reject_all.into_fn())
152 .collect();
153 println!(
154 "Default reject all elements: {:?} -> {:?}",
155 numbers, filtered
156 );
157
158 // Scenario 3: Configurable filter
159 fn configurable_filter(enable_filter: bool) -> BoxPredicate<i32> {
160 if enable_filter {
161 BoxPredicate::new(|x: &i32| *x > 3)
162 } else {
163 BoxPredicate::always_true()
164 }
165 }
166
167 let numbers = vec![1, 2, 3, 4, 5];
168
169 let filter_enabled = configurable_filter(true);
170 let filtered: Vec<_> = numbers
171 .iter()
172 .copied()
173 .filter(filter_enabled.into_fn())
174 .collect();
175 println!("\nFilter enabled: {:?} -> {:?}", numbers, filtered);
176
177 let filter_disabled = configurable_filter(false);
178 let filtered: Vec<_> = numbers
179 .iter()
180 .copied()
181 .filter(filter_disabled.into_fn())
182 .collect();
183 println!("Filter disabled: {:?} -> {:?}", numbers, filtered);
184}Sourcepub fn set_name(&mut self, name: &str)
pub fn set_name(&mut self, name: &str)
Examples found in repository?
29fn demo_box_predicate() {
30 println!("1. BoxPredicate Naming Functionality");
31
32 // Create a predicate with name using new_with_name
33 let pred1 = BoxPredicate::new_with_name("is_positive", |x: &i32| *x > 0);
34 println!(" Created with new_with_name:");
35 println!(" Name: {:?}", pred1.name());
36 println!(" Test 5: {}", pred1.test(&5));
37
38 // Set name for an existing predicate using set_name
39 let mut pred2 = BoxPredicate::new(|x: &i32| x % 2 == 0);
40 println!("\n Created with new then set_name:");
41 println!(" Initial name: {:?}", pred2.name());
42 pred2.set_name("is_even");
43 println!(" Name after setting: {:?}", pred2.name());
44 println!(" Test 4: {}", pred2.test(&4));
45
46 // Combined predicates automatically generate new names
47 let pred3 = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
48 let pred4 = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
49 let combined = pred3.and(pred4);
50 println!("\n Combined predicate name:");
51 println!(" Auto-generated name: {:?}", combined.name());
52 println!(" Test 4: {}\n", combined.test(&4));
53}Sourcepub fn clear_name(&mut self)
pub fn clear_name(&mut self)
Clears the name of this predicate.
Sourcepub fn always_true() -> Self
pub fn always_true() -> Self
Examples found in repository?
17fn main() {
18 println!("=== BoxPredicate always_true/always_false Demo ===\n");
19
20 // BoxPredicate::always_true
21 let always_true: BoxPredicate<i32> = BoxPredicate::always_true();
22 println!("BoxPredicate::always_true():");
23 println!(" test(&42): {}", always_true.test(&42));
24 println!(" test(&-1): {}", always_true.test(&-1));
25 println!(" test(&0): {}", always_true.test(&0));
26 println!(" name: {:?}", always_true.name());
27
28 // BoxPredicate::always_false
29 let always_false: BoxPredicate<i32> = BoxPredicate::always_false();
30 println!("\nBoxPredicate::always_false():");
31 println!(" test(&42): {}", always_false.test(&42));
32 println!(" test(&-1): {}", always_false.test(&-1));
33 println!(" test(&0): {}", always_false.test(&0));
34 println!(" name: {:?}", always_false.name());
35
36 println!("\n=== RcPredicate always_true/always_false Demo ===\n");
37
38 // RcPredicate::always_true
39 let rc_always_true: RcPredicate<String> = RcPredicate::always_true();
40 println!("RcPredicate::always_true():");
41 println!(
42 " test(&\"hello\"): {}",
43 rc_always_true.test(&"hello".to_string())
44 );
45 println!(
46 " test(&\"world\"): {}",
47 rc_always_true.test(&"world".to_string())
48 );
49 println!(" name: {:?}", rc_always_true.name());
50
51 // RcPredicate::always_false
52 let rc_always_false: RcPredicate<String> = RcPredicate::always_false();
53 println!("\nRcPredicate::always_false():");
54 println!(
55 " test(&\"hello\"): {}",
56 rc_always_false.test(&"hello".to_string())
57 );
58 println!(
59 " test(&\"world\"): {}",
60 rc_always_false.test(&"world".to_string())
61 );
62 println!(" name: {:?}", rc_always_false.name());
63
64 // Can be cloned and reused
65 let rc_clone = rc_always_true.clone();
66 println!("\nAfter cloning, still usable:");
67 println!(
68 " Original: test(&\"test\"): {}",
69 rc_always_true.test(&"test".to_string())
70 );
71 println!(
72 " Clone: test(&\"test\"): {}",
73 rc_clone.test(&"test".to_string())
74 );
75
76 println!("\n=== ArcPredicate always_true/always_false Demo ===\n");
77
78 // ArcPredicate::always_true
79 let arc_always_true: ArcPredicate<i32> = ArcPredicate::always_true();
80 println!("ArcPredicate::always_true():");
81 println!(" test(&100): {}", arc_always_true.test(&100));
82 println!(" test(&-100): {}", arc_always_true.test(&-100));
83 println!(" name: {:?}", arc_always_true.name());
84
85 // ArcPredicate::always_false
86 let arc_always_false: ArcPredicate<i32> = ArcPredicate::always_false();
87 println!("\nArcPredicate::always_false():");
88 println!(" test(&100): {}", arc_always_false.test(&100));
89 println!(" test(&-100): {}", arc_always_false.test(&-100));
90 println!(" name: {:?}", arc_always_false.name());
91
92 println!("\n=== Combining with other predicates ===\n");
93
94 // Combining with always_true (AND)
95 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
96 let combined_and_true = is_positive.and(BoxPredicate::always_true());
97 println!("is_positive AND always_true:");
98 println!(
99 " test(&5): {} (equivalent to is_positive)",
100 combined_and_true.test(&5)
101 );
102 println!(
103 " test(&-3): {} (equivalent to is_positive)",
104 combined_and_true.test(&-3)
105 );
106
107 // Combining with always_false (AND)
108 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
109 let combined_and_false = is_positive.and(BoxPredicate::always_false());
110 println!("\nis_positive AND always_false:");
111 println!(" test(&5): {} (always false)", combined_and_false.test(&5));
112 println!(
113 " test(&-3): {} (always false)",
114 combined_and_false.test(&-3)
115 );
116
117 // Combining with always_true (OR)
118 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
119 let combined_or_true = is_positive.or(BoxPredicate::always_true());
120 println!("\nis_positive OR always_true:");
121 println!(" test(&5): {} (always true)", combined_or_true.test(&5));
122 println!(" test(&-3): {} (always true)", combined_or_true.test(&-3));
123
124 // Combining with always_false (OR)
125 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
126 let combined_or_false = is_positive.or(BoxPredicate::always_false());
127 println!("\nis_positive OR always_false:");
128 println!(
129 " test(&5): {} (equivalent to is_positive)",
130 combined_or_false.test(&5)
131 );
132 println!(
133 " test(&-3): {} (equivalent to is_positive)",
134 combined_or_false.test(&-3)
135 );
136
137 println!("\n=== Practical scenarios: Default pass/reject filters ===\n");
138
139 // Scenario 1: Default pass-all filter
140 let numbers = vec![1, 2, 3, 4, 5];
141 let pass_all = BoxPredicate::<i32>::always_true();
142 let filtered: Vec<_> = numbers.iter().copied().filter(pass_all.into_fn()).collect();
143 println!("Default pass all elements: {:?} -> {:?}", numbers, filtered);
144
145 // Scenario 2: Default reject-all filter
146 let numbers = vec![1, 2, 3, 4, 5];
147 let reject_all = BoxPredicate::<i32>::always_false();
148 let filtered: Vec<_> = numbers
149 .iter()
150 .copied()
151 .filter(reject_all.into_fn())
152 .collect();
153 println!(
154 "Default reject all elements: {:?} -> {:?}",
155 numbers, filtered
156 );
157
158 // Scenario 3: Configurable filter
159 fn configurable_filter(enable_filter: bool) -> BoxPredicate<i32> {
160 if enable_filter {
161 BoxPredicate::new(|x: &i32| *x > 3)
162 } else {
163 BoxPredicate::always_true()
164 }
165 }
166
167 let numbers = vec![1, 2, 3, 4, 5];
168
169 let filter_enabled = configurable_filter(true);
170 let filtered: Vec<_> = numbers
171 .iter()
172 .copied()
173 .filter(filter_enabled.into_fn())
174 .collect();
175 println!("\nFilter enabled: {:?} -> {:?}", numbers, filtered);
176
177 let filter_disabled = configurable_filter(false);
178 let filtered: Vec<_> = numbers
179 .iter()
180 .copied()
181 .filter(filter_disabled.into_fn())
182 .collect();
183 println!("Filter disabled: {:?} -> {:?}", numbers, filtered);
184}Sourcepub fn always_false() -> Self
pub fn always_false() -> Self
Creates a predicate that always returns false.
§Returns
A new BoxPredicate that always returns false.
Examples found in repository?
17fn main() {
18 println!("=== BoxPredicate always_true/always_false Demo ===\n");
19
20 // BoxPredicate::always_true
21 let always_true: BoxPredicate<i32> = BoxPredicate::always_true();
22 println!("BoxPredicate::always_true():");
23 println!(" test(&42): {}", always_true.test(&42));
24 println!(" test(&-1): {}", always_true.test(&-1));
25 println!(" test(&0): {}", always_true.test(&0));
26 println!(" name: {:?}", always_true.name());
27
28 // BoxPredicate::always_false
29 let always_false: BoxPredicate<i32> = BoxPredicate::always_false();
30 println!("\nBoxPredicate::always_false():");
31 println!(" test(&42): {}", always_false.test(&42));
32 println!(" test(&-1): {}", always_false.test(&-1));
33 println!(" test(&0): {}", always_false.test(&0));
34 println!(" name: {:?}", always_false.name());
35
36 println!("\n=== RcPredicate always_true/always_false Demo ===\n");
37
38 // RcPredicate::always_true
39 let rc_always_true: RcPredicate<String> = RcPredicate::always_true();
40 println!("RcPredicate::always_true():");
41 println!(
42 " test(&\"hello\"): {}",
43 rc_always_true.test(&"hello".to_string())
44 );
45 println!(
46 " test(&\"world\"): {}",
47 rc_always_true.test(&"world".to_string())
48 );
49 println!(" name: {:?}", rc_always_true.name());
50
51 // RcPredicate::always_false
52 let rc_always_false: RcPredicate<String> = RcPredicate::always_false();
53 println!("\nRcPredicate::always_false():");
54 println!(
55 " test(&\"hello\"): {}",
56 rc_always_false.test(&"hello".to_string())
57 );
58 println!(
59 " test(&\"world\"): {}",
60 rc_always_false.test(&"world".to_string())
61 );
62 println!(" name: {:?}", rc_always_false.name());
63
64 // Can be cloned and reused
65 let rc_clone = rc_always_true.clone();
66 println!("\nAfter cloning, still usable:");
67 println!(
68 " Original: test(&\"test\"): {}",
69 rc_always_true.test(&"test".to_string())
70 );
71 println!(
72 " Clone: test(&\"test\"): {}",
73 rc_clone.test(&"test".to_string())
74 );
75
76 println!("\n=== ArcPredicate always_true/always_false Demo ===\n");
77
78 // ArcPredicate::always_true
79 let arc_always_true: ArcPredicate<i32> = ArcPredicate::always_true();
80 println!("ArcPredicate::always_true():");
81 println!(" test(&100): {}", arc_always_true.test(&100));
82 println!(" test(&-100): {}", arc_always_true.test(&-100));
83 println!(" name: {:?}", arc_always_true.name());
84
85 // ArcPredicate::always_false
86 let arc_always_false: ArcPredicate<i32> = ArcPredicate::always_false();
87 println!("\nArcPredicate::always_false():");
88 println!(" test(&100): {}", arc_always_false.test(&100));
89 println!(" test(&-100): {}", arc_always_false.test(&-100));
90 println!(" name: {:?}", arc_always_false.name());
91
92 println!("\n=== Combining with other predicates ===\n");
93
94 // Combining with always_true (AND)
95 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
96 let combined_and_true = is_positive.and(BoxPredicate::always_true());
97 println!("is_positive AND always_true:");
98 println!(
99 " test(&5): {} (equivalent to is_positive)",
100 combined_and_true.test(&5)
101 );
102 println!(
103 " test(&-3): {} (equivalent to is_positive)",
104 combined_and_true.test(&-3)
105 );
106
107 // Combining with always_false (AND)
108 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
109 let combined_and_false = is_positive.and(BoxPredicate::always_false());
110 println!("\nis_positive AND always_false:");
111 println!(" test(&5): {} (always false)", combined_and_false.test(&5));
112 println!(
113 " test(&-3): {} (always false)",
114 combined_and_false.test(&-3)
115 );
116
117 // Combining with always_true (OR)
118 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
119 let combined_or_true = is_positive.or(BoxPredicate::always_true());
120 println!("\nis_positive OR always_true:");
121 println!(" test(&5): {} (always true)", combined_or_true.test(&5));
122 println!(" test(&-3): {} (always true)", combined_or_true.test(&-3));
123
124 // Combining with always_false (OR)
125 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
126 let combined_or_false = is_positive.or(BoxPredicate::always_false());
127 println!("\nis_positive OR always_false:");
128 println!(
129 " test(&5): {} (equivalent to is_positive)",
130 combined_or_false.test(&5)
131 );
132 println!(
133 " test(&-3): {} (equivalent to is_positive)",
134 combined_or_false.test(&-3)
135 );
136
137 println!("\n=== Practical scenarios: Default pass/reject filters ===\n");
138
139 // Scenario 1: Default pass-all filter
140 let numbers = vec![1, 2, 3, 4, 5];
141 let pass_all = BoxPredicate::<i32>::always_true();
142 let filtered: Vec<_> = numbers.iter().copied().filter(pass_all.into_fn()).collect();
143 println!("Default pass all elements: {:?} -> {:?}", numbers, filtered);
144
145 // Scenario 2: Default reject-all filter
146 let numbers = vec![1, 2, 3, 4, 5];
147 let reject_all = BoxPredicate::<i32>::always_false();
148 let filtered: Vec<_> = numbers
149 .iter()
150 .copied()
151 .filter(reject_all.into_fn())
152 .collect();
153 println!(
154 "Default reject all elements: {:?} -> {:?}",
155 numbers, filtered
156 );
157
158 // Scenario 3: Configurable filter
159 fn configurable_filter(enable_filter: bool) -> BoxPredicate<i32> {
160 if enable_filter {
161 BoxPredicate::new(|x: &i32| *x > 3)
162 } else {
163 BoxPredicate::always_true()
164 }
165 }
166
167 let numbers = vec![1, 2, 3, 4, 5];
168
169 let filter_enabled = configurable_filter(true);
170 let filtered: Vec<_> = numbers
171 .iter()
172 .copied()
173 .filter(filter_enabled.into_fn())
174 .collect();
175 println!("\nFilter enabled: {:?} -> {:?}", numbers, filtered);
176
177 let filter_disabled = configurable_filter(false);
178 let filtered: Vec<_> = numbers
179 .iter()
180 .copied()
181 .filter(filter_disabled.into_fn())
182 .collect();
183 println!("Filter disabled: {:?} -> {:?}", numbers, filtered);
184}Sourcepub fn and<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
pub fn and<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
Returns a predicate that represents the logical AND of this predicate and another.
This method consumes self due to single-ownership semantics.
§Parameters
other- The other predicate to combine with.
§Returns
A new predicate representing the logical AND.
Examples found in repository?
86fn box_predicate_examples() {
87 println!("--- 2. BoxPredicate Examples (Single Ownership) ---");
88
89 // Basic BoxPredicate
90 let pred = BoxPredicate::new(|x: &i32| *x > 0);
91 println!("BoxPredicate test 5: {}", pred.test(&5));
92
93 // Named predicate for better debugging
94 let named_pred =
95 BoxPredicate::new_with_name("is_positive_even", |x: &i32| *x > 0 && x % 2 == 0);
96 println!("Predicate name: {:?}", named_pred.name());
97 println!("Test 4: {}", named_pred.test(&4));
98
99 // Method chaining - consumes self
100 let positive = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
101 let even = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
102 let combined = positive.and(even);
103 println!("Combined predicate name: {:?}", combined.name());
104 println!("Test 4: {}", combined.test(&4));
105}More examples
29fn demo_box_predicate() {
30 println!("1. BoxPredicate Naming Functionality");
31
32 // Create a predicate with name using new_with_name
33 let pred1 = BoxPredicate::new_with_name("is_positive", |x: &i32| *x > 0);
34 println!(" Created with new_with_name:");
35 println!(" Name: {:?}", pred1.name());
36 println!(" Test 5: {}", pred1.test(&5));
37
38 // Set name for an existing predicate using set_name
39 let mut pred2 = BoxPredicate::new(|x: &i32| x % 2 == 0);
40 println!("\n Created with new then set_name:");
41 println!(" Initial name: {:?}", pred2.name());
42 pred2.set_name("is_even");
43 println!(" Name after setting: {:?}", pred2.name());
44 println!(" Test 4: {}", pred2.test(&4));
45
46 // Combined predicates automatically generate new names
47 let pred3 = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
48 let pred4 = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
49 let combined = pred3.and(pred4);
50 println!("\n Combined predicate name:");
51 println!(" Auto-generated name: {:?}", combined.name());
52 println!(" Test 4: {}\n", combined.test(&4));
53}17fn main() {
18 println!("=== BoxPredicate always_true/always_false Demo ===\n");
19
20 // BoxPredicate::always_true
21 let always_true: BoxPredicate<i32> = BoxPredicate::always_true();
22 println!("BoxPredicate::always_true():");
23 println!(" test(&42): {}", always_true.test(&42));
24 println!(" test(&-1): {}", always_true.test(&-1));
25 println!(" test(&0): {}", always_true.test(&0));
26 println!(" name: {:?}", always_true.name());
27
28 // BoxPredicate::always_false
29 let always_false: BoxPredicate<i32> = BoxPredicate::always_false();
30 println!("\nBoxPredicate::always_false():");
31 println!(" test(&42): {}", always_false.test(&42));
32 println!(" test(&-1): {}", always_false.test(&-1));
33 println!(" test(&0): {}", always_false.test(&0));
34 println!(" name: {:?}", always_false.name());
35
36 println!("\n=== RcPredicate always_true/always_false Demo ===\n");
37
38 // RcPredicate::always_true
39 let rc_always_true: RcPredicate<String> = RcPredicate::always_true();
40 println!("RcPredicate::always_true():");
41 println!(
42 " test(&\"hello\"): {}",
43 rc_always_true.test(&"hello".to_string())
44 );
45 println!(
46 " test(&\"world\"): {}",
47 rc_always_true.test(&"world".to_string())
48 );
49 println!(" name: {:?}", rc_always_true.name());
50
51 // RcPredicate::always_false
52 let rc_always_false: RcPredicate<String> = RcPredicate::always_false();
53 println!("\nRcPredicate::always_false():");
54 println!(
55 " test(&\"hello\"): {}",
56 rc_always_false.test(&"hello".to_string())
57 );
58 println!(
59 " test(&\"world\"): {}",
60 rc_always_false.test(&"world".to_string())
61 );
62 println!(" name: {:?}", rc_always_false.name());
63
64 // Can be cloned and reused
65 let rc_clone = rc_always_true.clone();
66 println!("\nAfter cloning, still usable:");
67 println!(
68 " Original: test(&\"test\"): {}",
69 rc_always_true.test(&"test".to_string())
70 );
71 println!(
72 " Clone: test(&\"test\"): {}",
73 rc_clone.test(&"test".to_string())
74 );
75
76 println!("\n=== ArcPredicate always_true/always_false Demo ===\n");
77
78 // ArcPredicate::always_true
79 let arc_always_true: ArcPredicate<i32> = ArcPredicate::always_true();
80 println!("ArcPredicate::always_true():");
81 println!(" test(&100): {}", arc_always_true.test(&100));
82 println!(" test(&-100): {}", arc_always_true.test(&-100));
83 println!(" name: {:?}", arc_always_true.name());
84
85 // ArcPredicate::always_false
86 let arc_always_false: ArcPredicate<i32> = ArcPredicate::always_false();
87 println!("\nArcPredicate::always_false():");
88 println!(" test(&100): {}", arc_always_false.test(&100));
89 println!(" test(&-100): {}", arc_always_false.test(&-100));
90 println!(" name: {:?}", arc_always_false.name());
91
92 println!("\n=== Combining with other predicates ===\n");
93
94 // Combining with always_true (AND)
95 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
96 let combined_and_true = is_positive.and(BoxPredicate::always_true());
97 println!("is_positive AND always_true:");
98 println!(
99 " test(&5): {} (equivalent to is_positive)",
100 combined_and_true.test(&5)
101 );
102 println!(
103 " test(&-3): {} (equivalent to is_positive)",
104 combined_and_true.test(&-3)
105 );
106
107 // Combining with always_false (AND)
108 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
109 let combined_and_false = is_positive.and(BoxPredicate::always_false());
110 println!("\nis_positive AND always_false:");
111 println!(" test(&5): {} (always false)", combined_and_false.test(&5));
112 println!(
113 " test(&-3): {} (always false)",
114 combined_and_false.test(&-3)
115 );
116
117 // Combining with always_true (OR)
118 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
119 let combined_or_true = is_positive.or(BoxPredicate::always_true());
120 println!("\nis_positive OR always_true:");
121 println!(" test(&5): {} (always true)", combined_or_true.test(&5));
122 println!(" test(&-3): {} (always true)", combined_or_true.test(&-3));
123
124 // Combining with always_false (OR)
125 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
126 let combined_or_false = is_positive.or(BoxPredicate::always_false());
127 println!("\nis_positive OR always_false:");
128 println!(
129 " test(&5): {} (equivalent to is_positive)",
130 combined_or_false.test(&5)
131 );
132 println!(
133 " test(&-3): {} (equivalent to is_positive)",
134 combined_or_false.test(&-3)
135 );
136
137 println!("\n=== Practical scenarios: Default pass/reject filters ===\n");
138
139 // Scenario 1: Default pass-all filter
140 let numbers = vec![1, 2, 3, 4, 5];
141 let pass_all = BoxPredicate::<i32>::always_true();
142 let filtered: Vec<_> = numbers.iter().copied().filter(pass_all.into_fn()).collect();
143 println!("Default pass all elements: {:?} -> {:?}", numbers, filtered);
144
145 // Scenario 2: Default reject-all filter
146 let numbers = vec![1, 2, 3, 4, 5];
147 let reject_all = BoxPredicate::<i32>::always_false();
148 let filtered: Vec<_> = numbers
149 .iter()
150 .copied()
151 .filter(reject_all.into_fn())
152 .collect();
153 println!(
154 "Default reject all elements: {:?} -> {:?}",
155 numbers, filtered
156 );
157
158 // Scenario 3: Configurable filter
159 fn configurable_filter(enable_filter: bool) -> BoxPredicate<i32> {
160 if enable_filter {
161 BoxPredicate::new(|x: &i32| *x > 3)
162 } else {
163 BoxPredicate::always_true()
164 }
165 }
166
167 let numbers = vec![1, 2, 3, 4, 5];
168
169 let filter_enabled = configurable_filter(true);
170 let filtered: Vec<_> = numbers
171 .iter()
172 .copied()
173 .filter(filter_enabled.into_fn())
174 .collect();
175 println!("\nFilter enabled: {:?} -> {:?}", numbers, filtered);
176
177 let filter_disabled = configurable_filter(false);
178 let filtered: Vec<_> = numbers
179 .iter()
180 .copied()
181 .filter(filter_disabled.into_fn())
182 .collect();
183 println!("Filter disabled: {:?} -> {:?}", numbers, filtered);
184}Sourcepub fn or<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
pub fn or<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
Returns a predicate that represents the logical OR of this predicate and another.
This method consumes self due to single-ownership semantics.
§Parameters
other- The other predicate to combine with.
§Returns
A new predicate representing the logical OR.
Examples found in repository?
17fn main() {
18 println!("=== BoxPredicate always_true/always_false Demo ===\n");
19
20 // BoxPredicate::always_true
21 let always_true: BoxPredicate<i32> = BoxPredicate::always_true();
22 println!("BoxPredicate::always_true():");
23 println!(" test(&42): {}", always_true.test(&42));
24 println!(" test(&-1): {}", always_true.test(&-1));
25 println!(" test(&0): {}", always_true.test(&0));
26 println!(" name: {:?}", always_true.name());
27
28 // BoxPredicate::always_false
29 let always_false: BoxPredicate<i32> = BoxPredicate::always_false();
30 println!("\nBoxPredicate::always_false():");
31 println!(" test(&42): {}", always_false.test(&42));
32 println!(" test(&-1): {}", always_false.test(&-1));
33 println!(" test(&0): {}", always_false.test(&0));
34 println!(" name: {:?}", always_false.name());
35
36 println!("\n=== RcPredicate always_true/always_false Demo ===\n");
37
38 // RcPredicate::always_true
39 let rc_always_true: RcPredicate<String> = RcPredicate::always_true();
40 println!("RcPredicate::always_true():");
41 println!(
42 " test(&\"hello\"): {}",
43 rc_always_true.test(&"hello".to_string())
44 );
45 println!(
46 " test(&\"world\"): {}",
47 rc_always_true.test(&"world".to_string())
48 );
49 println!(" name: {:?}", rc_always_true.name());
50
51 // RcPredicate::always_false
52 let rc_always_false: RcPredicate<String> = RcPredicate::always_false();
53 println!("\nRcPredicate::always_false():");
54 println!(
55 " test(&\"hello\"): {}",
56 rc_always_false.test(&"hello".to_string())
57 );
58 println!(
59 " test(&\"world\"): {}",
60 rc_always_false.test(&"world".to_string())
61 );
62 println!(" name: {:?}", rc_always_false.name());
63
64 // Can be cloned and reused
65 let rc_clone = rc_always_true.clone();
66 println!("\nAfter cloning, still usable:");
67 println!(
68 " Original: test(&\"test\"): {}",
69 rc_always_true.test(&"test".to_string())
70 );
71 println!(
72 " Clone: test(&\"test\"): {}",
73 rc_clone.test(&"test".to_string())
74 );
75
76 println!("\n=== ArcPredicate always_true/always_false Demo ===\n");
77
78 // ArcPredicate::always_true
79 let arc_always_true: ArcPredicate<i32> = ArcPredicate::always_true();
80 println!("ArcPredicate::always_true():");
81 println!(" test(&100): {}", arc_always_true.test(&100));
82 println!(" test(&-100): {}", arc_always_true.test(&-100));
83 println!(" name: {:?}", arc_always_true.name());
84
85 // ArcPredicate::always_false
86 let arc_always_false: ArcPredicate<i32> = ArcPredicate::always_false();
87 println!("\nArcPredicate::always_false():");
88 println!(" test(&100): {}", arc_always_false.test(&100));
89 println!(" test(&-100): {}", arc_always_false.test(&-100));
90 println!(" name: {:?}", arc_always_false.name());
91
92 println!("\n=== Combining with other predicates ===\n");
93
94 // Combining with always_true (AND)
95 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
96 let combined_and_true = is_positive.and(BoxPredicate::always_true());
97 println!("is_positive AND always_true:");
98 println!(
99 " test(&5): {} (equivalent to is_positive)",
100 combined_and_true.test(&5)
101 );
102 println!(
103 " test(&-3): {} (equivalent to is_positive)",
104 combined_and_true.test(&-3)
105 );
106
107 // Combining with always_false (AND)
108 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
109 let combined_and_false = is_positive.and(BoxPredicate::always_false());
110 println!("\nis_positive AND always_false:");
111 println!(" test(&5): {} (always false)", combined_and_false.test(&5));
112 println!(
113 " test(&-3): {} (always false)",
114 combined_and_false.test(&-3)
115 );
116
117 // Combining with always_true (OR)
118 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
119 let combined_or_true = is_positive.or(BoxPredicate::always_true());
120 println!("\nis_positive OR always_true:");
121 println!(" test(&5): {} (always true)", combined_or_true.test(&5));
122 println!(" test(&-3): {} (always true)", combined_or_true.test(&-3));
123
124 // Combining with always_false (OR)
125 let is_positive = BoxPredicate::new(|x: &i32| *x > 0);
126 let combined_or_false = is_positive.or(BoxPredicate::always_false());
127 println!("\nis_positive OR always_false:");
128 println!(
129 " test(&5): {} (equivalent to is_positive)",
130 combined_or_false.test(&5)
131 );
132 println!(
133 " test(&-3): {} (equivalent to is_positive)",
134 combined_or_false.test(&-3)
135 );
136
137 println!("\n=== Practical scenarios: Default pass/reject filters ===\n");
138
139 // Scenario 1: Default pass-all filter
140 let numbers = vec![1, 2, 3, 4, 5];
141 let pass_all = BoxPredicate::<i32>::always_true();
142 let filtered: Vec<_> = numbers.iter().copied().filter(pass_all.into_fn()).collect();
143 println!("Default pass all elements: {:?} -> {:?}", numbers, filtered);
144
145 // Scenario 2: Default reject-all filter
146 let numbers = vec![1, 2, 3, 4, 5];
147 let reject_all = BoxPredicate::<i32>::always_false();
148 let filtered: Vec<_> = numbers
149 .iter()
150 .copied()
151 .filter(reject_all.into_fn())
152 .collect();
153 println!(
154 "Default reject all elements: {:?} -> {:?}",
155 numbers, filtered
156 );
157
158 // Scenario 3: Configurable filter
159 fn configurable_filter(enable_filter: bool) -> BoxPredicate<i32> {
160 if enable_filter {
161 BoxPredicate::new(|x: &i32| *x > 3)
162 } else {
163 BoxPredicate::always_true()
164 }
165 }
166
167 let numbers = vec![1, 2, 3, 4, 5];
168
169 let filter_enabled = configurable_filter(true);
170 let filtered: Vec<_> = numbers
171 .iter()
172 .copied()
173 .filter(filter_enabled.into_fn())
174 .collect();
175 println!("\nFilter enabled: {:?} -> {:?}", numbers, filtered);
176
177 let filter_disabled = configurable_filter(false);
178 let filtered: Vec<_> = numbers
179 .iter()
180 .copied()
181 .filter(filter_disabled.into_fn())
182 .collect();
183 println!("Filter disabled: {:?} -> {:?}", numbers, filtered);
184}Sourcepub fn not(self) -> BoxPredicate<T>where
T: 'static,
pub fn not(self) -> BoxPredicate<T>where
T: 'static,
Returns a predicate that represents the logical negation of this predicate.
This method consumes self due to single-ownership semantics.
§Returns
A new predicate representing the logical negation.
Sourcepub fn nand<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
pub fn nand<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
Returns a predicate that represents the logical NAND (NOT AND) of this predicate and another.
NAND returns true unless both predicates are true.
Equivalent to !(self AND other).
This method consumes self due to single-ownership semantics.
§Parameters
other- The other predicate to combine with.
§Returns
A new predicate representing the logical NAND.
Sourcepub fn xor<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
pub fn xor<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
Returns a predicate that represents the logical XOR (exclusive OR) of this predicate and another.
XOR returns true if exactly one of the predicates is true.
This method consumes self due to single-ownership semantics.
§Parameters
other- The other predicate to combine with.
§Returns
A new predicate representing the logical XOR.
Sourcepub fn nor<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
pub fn nor<P>(self, other: P) -> BoxPredicate<T>where
P: Predicate<T> + 'static,
T: 'static,
Returns a predicate that represents the logical NOR (NOT OR) of this predicate and another.
NOR returns true only when both predicates are false.
Equivalent to !(self OR other).
This method consumes self due to single-ownership semantics.
§Parameters
other- The other predicate to combine with.
§Returns
A new predicate representing the logical NOR.
Trait Implementations§
Source§impl<T> Debug for BoxPredicate<T>
impl<T> Debug for BoxPredicate<T>
Source§impl<T> Display for BoxPredicate<T>
impl<T> Display for BoxPredicate<T>
Source§impl<T> Predicate<T> for BoxPredicate<T>
impl<T> Predicate<T> for BoxPredicate<T>
Source§fn test(&self, value: &T) -> bool
fn test(&self, value: &T) -> bool
Source§fn into_box(self) -> BoxPredicate<T>
fn into_box(self) -> BoxPredicate<T>
BoxPredicate. Read moreSource§fn into_rc(self) -> RcPredicate<T>where
Self: 'static,
fn into_rc(self) -> RcPredicate<T>where
Self: 'static,
RcPredicate. Read more