Skip to main content

predicate_set_name_demo/
predicate_set_name_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9
10//! Demonstrates the set_name and new_with_name methods of Predicate
11
12use qubit_function::{
13    ArcPredicate,
14    BoxPredicate,
15    Predicate,
16    RcPredicate,
17};
18
19fn main() {
20    println!("=== Predicate Naming Functionality Demo ===\n");
21
22    demo_box_predicate();
23    demo_rc_predicate();
24    demo_arc_predicate();
25}
26
27/// Demonstrates the naming functionality of BoxPredicate
28fn demo_box_predicate() {
29    println!("1. BoxPredicate Naming Functionality");
30
31    // Create a predicate with name using new_with_name
32    let pred1 = BoxPredicate::new_with_name("is_positive", |x: &i32| *x > 0);
33    println!("   Created with new_with_name:");
34    println!("     Name: {:?}", pred1.name());
35    println!("     Test 5: {}", pred1.test(&5));
36
37    // Set name for an existing predicate using set_name
38    let mut pred2 = BoxPredicate::new(|x: &i32| x % 2 == 0);
39    println!("\n   Created with new then set_name:");
40    println!("     Initial name: {:?}", pred2.name());
41    pred2.set_name("is_even");
42    println!("     Name after setting: {:?}", pred2.name());
43    println!("     Test 4: {}", pred2.test(&4));
44
45    // Combined predicates automatically generate new names
46    let pred3 = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
47    let pred4 = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
48    let combined = pred3.and(pred4);
49    println!("\n   Combined predicate name:");
50    println!("     Auto-generated name: {:?}", combined.name());
51    println!("     Test 4: {}\n", combined.test(&4));
52}
53
54/// Demonstrates the naming functionality of RcPredicate
55fn demo_rc_predicate() {
56    println!("2. RcPredicate Naming Functionality");
57
58    // Using new_with_name
59    let pred1 = RcPredicate::new_with_name("greater_than_10", |x: &i32| *x > 10);
60    println!("   Using new_with_name:");
61    println!("     Name: {:?}", pred1.name());
62    println!("     Test 15: {}", pred1.test(&15));
63
64    // Using set_name
65    let mut pred2 = RcPredicate::new(|x: &i32| *x < 100);
66    println!("\n   Using set_name:");
67    println!("     Initial name: {:?}", pred2.name());
68    pred2.set_name("less_than_100");
69    println!("     Name after setting: {:?}", pred2.name());
70    println!("     Test 50: {}", pred2.test(&50));
71
72    // Name is preserved after cloning
73    let pred3 = pred2.clone();
74    println!("\n   Name preserved after cloning:");
75    println!("     Cloned name: {:?}", pred3.name());
76    println!("     Test 80: {}\n", pred3.test(&80));
77}
78
79/// Demonstrates the naming functionality of ArcPredicate
80fn demo_arc_predicate() {
81    println!("3. ArcPredicate Naming Functionality (Thread-Safe)");
82
83    // Using new_with_name
84    let pred1 = ArcPredicate::new_with_name("is_uppercase", |s: &String| {
85        s.chars().all(|c| c.is_uppercase() || !c.is_alphabetic())
86    });
87    println!("   Using new_with_name:");
88    println!("     Name: {:?}", pred1.name());
89    println!("     Test 'HELLO': {}", pred1.test(&"HELLO".to_string()));
90
91    // Using set_name
92    let mut pred2 = ArcPredicate::new(|s: &String| s.len() > 5);
93    println!("\n   Using set_name:");
94    println!("     Initial name: {:?}", pred2.name());
95    pred2.set_name("longer_than_5");
96    println!("     Name after setting: {:?}", pred2.name());
97    println!(
98        "     Test 'Hello World': {}",
99        pred2.test(&"Hello World".to_string())
100    );
101
102    // Name is preserved when sharing between threads
103    let pred3 = pred2.clone();
104    let handle = std::thread::spawn(move || {
105        let name = pred3.name().map(str::to_string);
106        let result = pred3.test(&"Threading".to_string());
107        (name, result)
108    });
109
110    let (name, result) = handle.join().unwrap();
111    println!("\n   Accessing from thread:");
112    println!("     Name in thread: {:?}", name);
113    println!("     Test 'Threading' in thread: {}", result);
114
115    // Original predicate is still available
116    println!("\n   Original predicate still available:");
117    println!("     Original name: {:?}", pred2.name());
118    println!("     Test 'Rust': {}\n", pred2.test(&"Rust".to_string()));
119}