diff --git a/src/flow/binary/bounds.rs b/src/flow/binary/bounds.rs index 7416304..8a6df96 100644 --- a/src/flow/binary/bounds.rs +++ b/src/flow/binary/bounds.rs @@ -28,6 +28,30 @@ impl Bounds { } } + fn orderedl( + l: &Option, + r: &A, + comparator: &impl Comparator, + ) -> Result<(), BoundsError> { + if let Some(l) = &l { + Self::ordered(l, r, comparator) + } else { + Err(BoundsError::OverflowL(r.clone())) + } + } + + fn orderedr( + l: &A, + r: &Option, + comparator: &impl Comparator, + ) -> Result<(), BoundsError> { + if let Some(r) = &r { + Self::ordered(l, r, comparator) + } else { + Err(BoundsError::OverflowR(l.clone())) + } + } + fn new( l: Option, r: Option, @@ -56,23 +80,15 @@ impl Bounds { key: &A, comparator: &impl Comparator, ) -> Result> { - if let Some(lr) = &l.r { - Self::ordered(lr, key, comparator)? - } else { - Err(BoundsError::OverflowL(key.clone()))? - } - if let Some(rl) = &r.l { - Self::ordered(key, rl, comparator)? - } else { - Err(BoundsError::OverflowR(key.clone()))? - } + Self::orderedl(&l.r, key, comparator)?; + Self::orderedr(key, &r.l, comparator)?; Self::new(l.l, r.r, comparator) } fn equal_bound(l: &Option, r: &Option, comparator: &impl Comparator) -> bool { match (l, r) { (None, None) => true, - (Some(kl), Some(kr)) => matches!(comparator.compare(kl, kr), Comparison::E), + (Some(kl), Some(kr)) => comparator.equal(kl, kr), _ => false, } } diff --git a/src/flow/comparator.rs b/src/flow/comparator.rs index ee7fb81..82b6648 100644 --- a/src/flow/comparator.rs +++ b/src/flow/comparator.rs @@ -17,6 +17,10 @@ pub enum Comparison { /// ``` pub trait Comparator { 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`].