qubit-function 0.16.0

Functional programming traits and Box/Rc/Arc adapters for Rust, inspired by Java functional interfaces
// =============================================================================
//    Copyright (c) 2025 - 2026 Haixing Hu.
//
//    SPDX-License-Identifier: Apache-2.0
//
//    Licensed under the Apache License, Version 2.0.
// =============================================================================
#![cfg(feature = "full")]
use qubit_function::comparator::{
    ArcComparator,
    BoxComparator,
    Comparator,
    RcComparator,
};
use std::cmp::Ordering;

#[test]
fn test_comparator_default_conversions_allow_relaxed_generic_types() {
    #[derive(Clone, Debug)]
    struct BorrowedRc<'a> {
        value: &'a str,
    }

    #[derive(Clone, Debug)]
    struct BorrowedRcComparator;

    impl<'a> Comparator<BorrowedRc<'a>> for BorrowedRcComparator {
        fn compare(
            &self,
            first: &BorrowedRc<'a>,
            second: &BorrowedRc<'a>,
        ) -> Ordering {
            first.value.cmp(second.value)
        }
    }

    let left_text = String::from("left");
    let right_text = String::from("right");
    let left = BorrowedRc {
        value: left_text.as_str(),
    };
    let right = BorrowedRc {
        value: right_text.as_str(),
    };
    let comparator = BorrowedRcComparator;

    assert_eq!(
        qubit_function::comparator::BoxComparator::new(comparator.clone())
            .compare(&left, &right),
        Ordering::Less
    );
    assert_eq!(
        qubit_function::comparator::RcComparator::new(comparator.clone())
            .compare(&left, &right),
        Ordering::Less
    );
    assert_eq!(
        qubit_function::comparator::ArcComparator::new(comparator)
            .compare(&left, &right),
        Ordering::Less
    );
}