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> =