diff --git a/src/flow/traversible/algorithms/subset.rs b/src/flow/traversible/algorithms/subset.rs index 0309864..4f530ac 100644 --- a/src/flow/traversible/algorithms/subset.rs +++ b/src/flow/traversible/algorithms/subset.rs @@ -84,7 +84,7 @@ impl<'a, T: 'a + MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq> SubsetCont ) } - fn test(self) -> T::F<()> { + fn test_unoptimised(self) -> T::F<()> { let split = self.n_subset.split(); match self.comparator.compare(&split.2, &self.k_super) { Comparison::L => self.on_l(split), @@ -92,6 +92,44 @@ impl<'a, T: 'a + MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq> SubsetCont Comparison::R => self.on_r(split), } } + + fn outside_l(&self) -> bool { + outside_l(self.comparator, &self.k_l, &self.k_super) + } + + fn outside_r(&self) -> bool { + outside_r(self.comparator, &self.k_r, &self.k_super) + } + + fn test_r_only(self) -> T::F<()> { + t_subset_of_t( + self.comparator, + self.n_subset.to_tree(), + self.t_superr, + self.k_l, + self.k_r, + ) + } + + fn test_l_only(self) -> T::F<()> { + t_subset_of_t( + self.comparator, + self.n_subset.to_tree(), + self.t_superl, + self.k_l, + self.k_r, + ) + } + + fn test_optimised(self) -> T::F<()> { + if self.outside_l() { + self.test_r_only() + } else if self.outside_r() { + self.test_l_only() + } else { + self.test_unoptimised() + } + } } fn outside_l(comparator: &dyn Comparator, k_l: &Option, k_super: &A) -> bool { @@ -118,26 +156,20 @@ pub fn n_subset_of_n<'a, T: MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq> k_r: Option, ) -> T::F<()> { let (t_superl, t_superr, k_super) = n_superset.split(); - if outside_l(comparator, &k_l, &k_super) { - t_subset_of_t(comparator, n_subset.to_tree(), t_superr, k_l, k_r) - } else if outside_r(comparator, &k_r, &k_super) { - t_subset_of_t(comparator, n_subset.to_tree(), t_superl, k_l, k_r) - } else { - SubsetContext { - comparator, - n_subset, - n_superset, - k_l, - k_r, - t_superl, - t_superr, - k_super, - } - .test() + SubsetContext { + comparator, + n_subset, + n_superset, + k_l, + k_r, + t_superl, + t_superr, + k_super, } + .test_optimised() } -pub fn r_subset_of_r<'a, T: MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq>( +pub fn r_subset_of_r_unoptimised<'a, T: MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq>( comparator: &'a dyn Comparator, r_subset: Rc>, r_superset: Rc>, @@ -151,6 +183,20 @@ pub fn r_subset_of_r<'a, T: MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq> ) } +fn r_subset_of_r_optimised<'a, T: MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq>( + r_subset: Rc>, + r_superset: Rc>, + comparator: &'a dyn Comparator, + k_l: Option, + k_r: Option, +) -> >::F<()> { + if r_subset.data() == r_superset.data() { + T::pure(()) + } else { + r_subset_of_r_unoptimised(comparator, r_subset, r_superset, k_l, k_r) + } +} + pub fn t_subset_of_t<'a, T: MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq>( comparator: &'a dyn Comparator, t_subset: Rc>, @@ -162,11 +208,7 @@ pub fn t_subset_of_t<'a, T: MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq> (None, _) => T::pure(()), (Some(_), None) => T::fail(()), (Some(r_subset), Some(r_superset)) => { - if r_subset.data() == r_superset.data() { - T::pure(()) - } else { - r_subset_of_r(comparator, r_subset, r_superset, k_l, k_r) - } + r_subset_of_r_optimised(r_subset, r_superset, comparator, k_l, k_r) } } } diff --git a/src/func/instances/stackless.rs b/src/func/instances/stackless.rs index 280ab07..7f8a57b 100644 --- a/src/func/instances/stackless.rs +++ b/src/func/instances/stackless.rs @@ -302,13 +302,11 @@ mod stackless_test { } } - #[ignore] #[test] fn test_factorial() { assert_eq!(factorial(10).evaluate(), 3628800); } - #[ignore] #[test] fn test_dumb() { let n = 1000; diff --git a/src/mrds/trees/unbalanced.rs b/src/mrds/trees/unbalanced.rs index ac01d98..cc72250 100644 --- a/src/mrds/trees/unbalanced.rs +++ b/src/mrds/trees/unbalanced.rs @@ -205,7 +205,6 @@ mod tests { .is_err()); } - #[ignore] #[test] fn test_random_slices() { let ctr: Rc, _>> = @@ -255,7 +254,6 @@ mod tests { instances::result::ResultInstance<()>, >; - #[ignore] #[test] fn trace_one_slice() { let ctr: Rc> =