use itertools::assert_equal;
use rand::{Rng, SeedableRng};
use hibit_tree::{FromHibitTree, intersection, LazyHibitTree, map, union, Tree};
use hibit_tree::config::_64bit;
use hibit_tree::HibitTree;
use hibit_tree::RegularHibitTree;
use hibit_tree::utils::Borrowable;
mod common;
#[derive(Default, Clone, Ord, PartialOrd, Eq, PartialEq, Debug)]
struct Data(usize);
type Array = Tree<Data, _64bit<4>>;
#[test]
fn materialize_test(){
const RANGE: usize = common::RANGE;
const COUNT: usize = if cfg!(miri) {400} else {10000};
let mut rng = rand::rngs::StdRng::seed_from_u64(0xe15bb9db3dee3a0f);
let mut a1 = Array::default();
let mut a2 = Array::default();
for _ in 0..COUNT{
let v = rng.gen_range(0..RANGE);
a1.insert(v, Data(v));
a2.insert(v, Data(v));
}
{
let mut a1: Tree<usize, _64bit<4>> = Default::default();
let i0 = 0;
a1.insert(0, i0);
let m1 = map(a1, |d: &usize| -> usize { d.clone() } );
let m2 = map(m1, |d: usize| d.clone() );
}
let ao: Array = map(&a1, |d: &Data| d.clone()).materialize();
assert_equal(ao.iter(), a1.iter());
let ao: Array = map(intersection(&a1, &a2), |(l, _r) : (&Data, &Data)| l.clone()).materialize();
assert_equal(ao.iter(), a1.iter());
let ao: Array = union(&a1, &a2)
.map(|(l, _r) : (Option<&Data>, Option<&Data>)| l.unwrap().clone())
.materialize();
assert_equal(ao.iter(), a1.iter());
}