predicate_set_name_demo/
predicate_set_name_demo.rs1use prism3_function::predicate::{ArcPredicate, BoxPredicate, Predicate, RcPredicate};
13
14fn main() {
15    println!("=== Predicate Naming Functionality Demo ===\n");
16
17    demo_box_predicate();
18    demo_rc_predicate();
19    demo_arc_predicate();
20}
21
22fn demo_box_predicate() {
24    println!("1. BoxPredicate Naming Functionality");
25
26    let pred1 = BoxPredicate::new_with_name("is_positive", |x: &i32| *x > 0);
28    println!("   Created with new_with_name:");
29    println!("     Name: {:?}", pred1.name());
30    println!("     Test 5: {}", pred1.test(&5));
31
32    let mut pred2 = BoxPredicate::new(|x: &i32| x % 2 == 0);
34    println!("\n   Created with new then set_name:");
35    println!("     Initial name: {:?}", pred2.name());
36    pred2.set_name("is_even");
37    println!("     Name after setting: {:?}", pred2.name());
38    println!("     Test 4: {}", pred2.test(&4));
39
40    let pred3 = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
42    let pred4 = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
43    let combined = pred3.and(pred4);
44    println!("\n   Combined predicate name:");
45    println!("     Auto-generated name: {:?}", combined.name());
46    println!("     Test 4: {}\n", combined.test(&4));
47}
48
49fn demo_rc_predicate() {
51    println!("2. RcPredicate Naming Functionality");
52
53    let pred1 = RcPredicate::new_with_name("greater_than_10", |x: &i32| *x > 10);
55    println!("   Using new_with_name:");
56    println!("     Name: {:?}", pred1.name());
57    println!("     Test 15: {}", pred1.test(&15));
58
59    let mut pred2 = RcPredicate::new(|x: &i32| *x < 100);
61    println!("\n   Using set_name:");
62    println!("     Initial name: {:?}", pred2.name());
63    pred2.set_name("less_than_100");
64    println!("     Name after setting: {:?}", pred2.name());
65    println!("     Test 50: {}", pred2.test(&50));
66
67    let pred3 = pred2.clone();
69    println!("\n   Name preserved after cloning:");
70    println!("     Cloned name: {:?}", pred3.name());
71    println!("     Test 80: {}\n", pred3.test(&80));
72}
73
74fn demo_arc_predicate() {
76    println!("3. ArcPredicate Naming Functionality (Thread-Safe)");
77
78    let pred1 = ArcPredicate::new_with_name("is_uppercase", |s: &String| {
80        s.chars().all(|c| c.is_uppercase() || !c.is_alphabetic())
81    });
82    println!("   Using new_with_name:");
83    println!("     Name: {:?}", pred1.name());
84    println!("     Test 'HELLO': {}", pred1.test(&"HELLO".to_string()));
85
86    let mut pred2 = ArcPredicate::new(|s: &String| s.len() > 5);
88    println!("\n   Using set_name:");
89    println!("     Initial name: {:?}", pred2.name());
90    pred2.set_name("longer_than_5");
91    println!("     Name after setting: {:?}", pred2.name());
92    println!(
93        "     Test 'Hello World': {}",
94        pred2.test(&"Hello World".to_string())
95    );
96
97    let pred3 = pred2.clone();
99    let handle = std::thread::spawn(move || {
100        let name = pred3.name().map(|s| s.to_string());
101        let result = pred3.test(&"Threading".to_string());
102        (name, result)
103    });
104
105    let (name, result) = handle.join().unwrap();
106    println!("\n   Accessing from thread:");
107    println!("     Name in thread: {:?}", name);
108    println!("     Test 'Threading' in thread: {}", result);
109
110    println!("\n   Original predicate still available:");
112    println!("     Original name: {:?}", pred2.name());
113    println!("     Test 'Rust': {}\n", pred2.test(&"Rust".to_string()));
114}