radn-rs/src/flow/comparator.rs
timofey cd222a643a
All checks were successful
buildbot/cargo fmt (1.71) Build done.
buildbot/cargo doc (1.71) Build done.
buildbot/cargo clippy (1.71) Build done.
buildbot/cargo test (1.65) Build done.
buildbot/cargo clippy (1.65) Build done.
remove -rs/_rs
2023-08-20 23:22:32 +00:00

51 lines
1.3 KiB
Rust

/// Result returned by [`Comparator::compare`].
#[derive(Debug, PartialEq, Eq)]
pub enum Comparison {
L,
/// Compared values were equal.
E,
R,
}
/// Returns [`Comparison`] saying which value is smaller.
///
/// ```rust
/// # use radn::flow::comparator::*;
/// assert_eq!(DefaultComparator.compare(&1, &3), Comparison::L);
/// assert_eq!(DefaultComparator.compare(&2, &2), Comparison::E);
/// assert_eq!(DefaultComparator.compare(&3, &1), Comparison::R);
/// ```
pub trait Comparator<A>: Send + Sync {
fn compare(&self, kl: &A, kr: &A) -> Comparison;
fn equal(&self, kl: &A, kr: &A) -> bool {
matches!(self.compare(kl, kr), Comparison::E)
}
}
/// Implementation of a [Comparator] relying on [`Ord`].
pub struct DefaultComparator;
impl<A: Ord> Comparator<A> for DefaultComparator {
fn compare(&self, kl: &A, kr: &A) -> Comparison {
match kl.cmp(kr) {
std::cmp::Ordering::Less => Comparison::L,
std::cmp::Ordering::Equal => Comparison::E,
std::cmp::Ordering::Greater => Comparison::R,
}
}
}
pub struct RcComparator<C>(C);
mod rc_comparator_impl {
use super::*;
use std::sync::Arc;
impl<A, C: Comparator<A>> Comparator<Arc<A>> for RcComparator<C> {
fn compare(&self, kl: &Arc<A>, kr: &Arc<A>) -> Comparison {
self.0.compare(kl, kr)
}
}
}