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