more flexible UnbalancedConstructor

This commit is contained in:
AF 2023-05-14 05:18:32 +00:00
parent 629a0c9c83
commit 9f9ff0bf76

View File

@ -112,8 +112,9 @@ impl<'a, T: 'a + Monad, A: 'a> TraversibleBinaryTree<'a, T, A, UnbalancedData>
} }
} }
type WrapType<'a, T, A> = type WrapType<'a, T, A> = Box<
Box<dyn 'a + Fn(Rc<UnbalancedNode<'a, T, A>>) -> UnbalancedResolution<'a, T, A>>; dyn 'a + Fn(Rc<UnbalancedNode<'a, T, A>>) -> Box<dyn Fn() -> UnbalancedResolution<'a, T, A>>,
>;
pub struct UnbalancedConstructor<'a, T: 'a + Monad, A: 'a> { pub struct UnbalancedConstructor<'a, T: 'a + Monad, A: 'a> {
wrap: WrapType<'a, T, A>, wrap: WrapType<'a, T, A>,
@ -140,10 +141,7 @@ impl<'a, T: 'a + Monad, A: 'a> UnbalancedConstructor<'a, T, A> {
key: key.into(), key: key.into(),
}); });
let ctr = self.clone(); let ctr = self.clone();
UnbalancedTree::Node(Rc::new(UnbalancedReference(Box::new(move || { UnbalancedTree::Node(Rc::new(UnbalancedReference((ctr.wrap)(node)))).into()
(ctr.wrap)(node.clone())
}))))
.into()
} }
#[cfg(test)] #[cfg(test)]
@ -182,7 +180,7 @@ mod tests {
#[test] #[test]
fn test_simple_slices() { fn test_simple_slices() {
let ctr: Rc<UnbalancedConstructor<classes::result::ResultClass<()>, _>> = let ctr: Rc<UnbalancedConstructor<classes::result::ResultClass<()>, _>> =
UnbalancedConstructor::rc(Box::new(|node| Ok(node))); UnbalancedConstructor::rc(Box::new(|node| Box::new(move || Ok(node.clone()))));
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let t_set = ctr.from_slice(&mut rng, &[0]); let t_set = ctr.from_slice(&mut rng, &[0]);
assert!(t_contains(&DefaultComparator, t_set.clone(), 0.into()).is_ok()); assert!(t_contains(&DefaultComparator, t_set.clone(), 0.into()).is_ok());
@ -215,7 +213,7 @@ mod tests {
#[test] #[test]
fn test_random_slices() { fn test_random_slices() {
let ctr: Rc<UnbalancedConstructor<classes::result::ResultClass<()>, _>> = let ctr: Rc<UnbalancedConstructor<classes::result::ResultClass<()>, _>> =
UnbalancedConstructor::rc(Box::new(|node| Ok(node))); UnbalancedConstructor::rc(Box::new(|node| Box::new(move || Ok(node.clone()))));
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
for _ in 0..1000 { for _ in 0..1000 {
let big: Vec<i32> = (0..(rng.gen_range(2..10))).collect(); let big: Vec<i32> = (0..(rng.gen_range(2..10))).collect();
@ -263,7 +261,9 @@ mod tests {
#[test] #[test]
fn trace_one_slice() { fn trace_one_slice() {
let ctr: Rc<UnbalancedConstructor<TracedMonad, _>> = let ctr: Rc<UnbalancedConstructor<TracedMonad, _>> =
UnbalancedConstructor::rc(Box::new(|node| TracedMonad::pure(node).after_resolution())); UnbalancedConstructor::rc(Box::new(|node| {
Box::new(move || TracedMonad::pure(node.clone()).after_resolution())
}));
// let mut rng = rand::thread_rng(); // let mut rng = rand::thread_rng();
let mut rng = rand::rngs::StdRng::seed_from_u64(426); let mut rng = rand::rngs::StdRng::seed_from_u64(426);
let big: Vec<i32> = (0..(rng.gen_range(1000..2000))).collect(); let big: Vec<i32> = (0..(rng.gen_range(1000..2000))).collect();