diff --git a/src/flow.rs b/src/flow.rs index 21eae0c..81040b7 100644 --- a/src/flow.rs +++ b/src/flow.rs @@ -1,5 +1,6 @@ //! Data structures and algorithms, independent of [`crate::rcore`] concepts. pub mod binary; +pub mod comparator; pub mod speculative; pub mod traversible; diff --git a/src/flow/comparator.rs b/src/flow/comparator.rs new file mode 100644 index 0000000..e398914 --- /dev/null +++ b/src/flow/comparator.rs @@ -0,0 +1,35 @@ +/// Result returned by [`Comparator::pick_smaller`]. +#[derive(Debug, PartialEq)] +pub enum Comparison { + L, + /// Compared values were equal. + E, + R, +} + +/// Returns [`Comparison`] saying which value is smaller. +/// +/// ```rust +/// # use radn_rs::flow::traversible::*; +/// assert_eq!(DefaultComparator.pick_smaller(&1, &3), Comparison::L); +/// assert_eq!(DefaultComparator.pick_smaller(&2, &2), Comparison::E); +/// assert_eq!(DefaultComparator.pick_smaller(&3, &1), Comparison::R); +/// ``` +pub trait Comparator { + fn pick_smaller(&self, kl: &A, kr: &A) -> Comparison; +} + +/// Implementation of a [Comparator] relying on [`PartialOrd`]. +pub struct DefaultComparator; + +impl Comparator for DefaultComparator { + fn pick_smaller(&self, kl: &A, kr: &A) -> Comparison { + if kl < kr { + Comparison::L + } else if kr < kl { + Comparison::R + } else { + Comparison::E + } + } +} diff --git a/src/flow/traversible.rs b/src/flow/traversible.rs index 1e84cc4..dd16dec 100644 --- a/src/flow/traversible.rs +++ b/src/flow/traversible.rs @@ -5,46 +5,9 @@ pub mod unbalanced; use std::rc::Rc; +use crate::flow::comparator::*; use crate::func::*; -/// Result returned by [`Comparator::pick_smaller`]. -#[derive(Debug, PartialEq)] -pub enum Comparison { - L, - /// Compared values were equal. - E, - R, -} - -fn and(_l: (), _r: ()) {} - -/// Returns [`Comparison`] saying which value is smaller. -/// -/// ```rust -/// # use radn_rs::flow::traversible::*; -/// assert_eq!(DefaultComparator.pick_smaller(&1, &3), Comparison::L); -/// assert_eq!(DefaultComparator.pick_smaller(&2, &2), Comparison::E); -/// assert_eq!(DefaultComparator.pick_smaller(&3, &1), Comparison::R); -/// ``` -pub trait Comparator { - fn pick_smaller(&self, kl: &A, kr: &A) -> Comparison; -} - -/// Implementation of a [Comparator] relying on [`PartialOrd`]. -pub struct DefaultComparator; - -impl Comparator for DefaultComparator { - fn pick_smaller(&self, kl: &A, kr: &A) -> Comparison { - if kl < kr { - Comparison::L - } else if kr < kl { - Comparison::R - } else { - Comparison::E - } - } -} - pub type Split<'a, T, A, D> = ( Rc>, Rc>, diff --git a/src/flow/traversible/algorithms/subset.rs b/src/flow/traversible/algorithms/subset.rs index 76d9e81..381ba49 100644 --- a/src/flow/traversible/algorithms/subset.rs +++ b/src/flow/traversible/algorithms/subset.rs @@ -1,5 +1,8 @@ +use crate::flow::comparator::*; use crate::flow::traversible::*; +fn and(_l: (), _r: ()) {} + struct SubsetContext<'a, T: MonadFail<'a, ()>, A: 'a, D: 'a + PartialEq> { comparator: &'a dyn Comparator, n_subset: Rc>,