diff --git a/src/mrds/trees/unbalanced.rs b/src/mrds/trees/unbalanced.rs index 1ec6b8f..7cdde8c 100644 --- a/src/mrds/trees/unbalanced.rs +++ b/src/mrds/trees/unbalanced.rs @@ -144,30 +144,6 @@ impl<'a, T: Monad<'a>, A: 'a + Send + Sync> UnbalancedConstructor<'a, T, A> { let ctr = self.clone(); UnbalancedTree::Node(Arc::new(UnbalancedReference((ctr.wrap)(node)))).into() } - - #[cfg(test)] - pub fn from_slice( - self: &Arc, - rng: &mut R, - slice: &[A], - ) -> Arc> - where - A: 'a + Clone, - { - if slice.is_empty() { - self.leaf() - } else { - let key_at = rng.gen_range(0..slice.len()); - let key = slice[key_at].clone(); - let lslice = &slice[..key_at]; - let rslice = &slice[key_at + 1..]; - self.clone().node( - self.clone().from_slice(rng, lslice), - key, - self.clone().from_slice(rng, rslice), - ) - } - } } #[cfg(test)] @@ -178,6 +154,36 @@ mod tests { use super::{algorithms::contains::*, algorithms::subset::*, *}; + trait FromSlice { + type Tree; + type A; + + fn from_slice(self: &Arc, rng: &mut R, slice: &[Self::A]) -> Arc; + } + + impl<'a, T: Monad<'a>, A: 'a + Send + Sync + Clone, R: 'a + rand::Rng> FromSlice + for UnbalancedConstructor<'a, T, A> + { + type A = A; + type Tree = UnbalancedTree<'a, T, A>; + + fn from_slice(self: &Arc, rng: &mut R, slice: &[Self::A]) -> Arc { + if slice.is_empty() { + self.leaf() + } else { + let key_at = rng.gen_range(0..slice.len()); + let key = slice[key_at].clone(); + let lslice = &slice[..key_at]; + let rslice = &slice[key_at + 1..]; + self.clone().node( + self.clone().from_slice(rng, lslice), + key, + self.clone().from_slice(rng, rslice), + ) + } + } + } + #[test] fn test_simple_slices() { let ctr: Arc, _>> = @@ -265,7 +271,6 @@ mod tests { UnbalancedConstructor::rc(Box::new(|node| { Box::new(move || TracedMonad::pure(node.clone()).after_resolution()) })); - // let mut rng = rand::thread_rng(); let mut rng = rand::rngs::StdRng::seed_from_u64(426); let big: Vec = (0..(rng.gen_range(1000..2000))).collect(); let key = big[rng.gen_range(0..big.len())]; @@ -284,6 +289,5 @@ mod tests { None, ); assert!(traced.value.is_ok()); - // panic!("{:?}", traced.render().to_vec()); } }