predicate_set_name_demo/
predicate_set_name_demo.rs1use 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
27fn demo_box_predicate() {
29 println!("1. BoxPredicate Naming Functionality");
30
31 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 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 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
54fn demo_rc_predicate() {
56 println!("2. RcPredicate Naming Functionality");
57
58 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 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 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
79fn demo_arc_predicate() {
81 println!("3. ArcPredicate Naming Functionality (Thread-Safe)");
82
83 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 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 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 println!("\n Original predicate still available:");
117 println!(" Original name: {:?}", pred2.name());
118 println!(" Test 'Rust': {}\n", pred2.test(&"Rust".to_string()));
119}