/// 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: 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 Comparator 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); mod rc_comparator_impl { use super::*; use std::sync::Arc; impl> Comparator> for RcComparator { fn compare(&self, kl: &Arc, kr: &Arc) -> Comparison { self.0.compare(kl, kr) } } }