more flexible UnbalancedConstructor
This commit is contained in:
parent
629a0c9c83
commit
9f9ff0bf76
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user