Skip to main content

comparator_demo/
comparator_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10
11use 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}