Skip to main content

comparator_demo/
comparator_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9
10use 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}