comparator_demo/
comparator_demo.rs1use qubit_function::{
12 ArcComparator,
13 BoxComparator,
14 Comparator,
15 RcComparator,
16};
17
18#[derive(Debug, Eq, PartialEq)]
19struct User {
20 name: String,
21 age: u8,
22}
23
24fn main() {
25 println!("=== Comparator Demo ===\n");
26
27 demo_box_comparator();
28 demo_shared_comparators();
29}
30
31fn demo_box_comparator() {
32 println!("--- BoxComparator sorting ---");
33
34 let by_age = BoxComparator::new(|left: &User, right: &User| left.age.cmp(&right.age));
35 let by_name = BoxComparator::new(|left: &User, right: &User| left.name.cmp(&right.name));
36 let comparator = by_age.then_comparing(by_name);
37
38 let mut users = vec![
39 User {
40 name: String::from("Charlie"),
41 age: 30,
42 },
43 User {
44 name: String::from("Alice"),
45 age: 25,
46 },
47 User {
48 name: String::from("Bob"),
49 age: 25,
50 },
51 ];
52
53 users.sort_by(|left, right| comparator.compare(left, right));
54 println!("Sorted users: {users:?}");
55 println!();
56}
57
58fn demo_shared_comparators() {
59 println!("--- Shared comparators ---");
60
61 let ascending = ArcComparator::new(|left: &i32, right: &i32| left.cmp(right));
62 let descending = ascending.reversed();
63 println!(
64 "ArcComparator descending 10 vs 3: {:?}",
65 descending.compare(&10, &3)
66 );
67
68 let by_length = RcComparator::new(|left: &String, right: &String| left.len().cmp(&right.len()));
69 let alphabetic = RcComparator::new(|left: &String, right: &String| left.cmp(right));
70 let combined = by_length.then_comparing(&alphabetic);
71 println!(
72 "RcComparator length/name 'aa' vs 'b': {:?}",
73 combined.compare(&String::from("aa"), &String::from("b"))
74 );
75}