Skip to main content

always_bi_predicate_demo/
always_bi_predicate_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9use 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    // BoxBiPredicate::always_true
20    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    // BoxBiPredicate::always_false
28    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    // RcBiPredicate::always_true
38    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    // RcBiPredicate::always_false
51    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    // Can be cloned and reused
64    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    // ArcBiPredicate::always_true
78    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    // ArcBiPredicate::always_false
85    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    // Combining with always_true (AND)
94    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    // Combining with always_false (AND)
107    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    // Combining with always_true (OR)
120    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    // Combining with always_false (OR)
133    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    // Scenario 1: Default pass-all filter
148    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    // Scenario 2: Default reject-all filter
155    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    // Scenario 3: Configurable filter
162    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}