#![cfg(test)]
use deep_safe_drop::*;
mod list;
mod binary_tree;
mod dyn_trait;
const TREE_SIZE: usize = 2_usize.pow(20);
trait NewLink<Node>
{
fn new(node: Node) -> Self;
}
use {
binary_tree::BinaryTree,
list::List,
};
fn make_stretched_fan<L>(
fan_degree: usize,
stretch_len: usize,
) -> L
where
L: NewLink<List<L>> + NewLink<BinaryTree<L>>,
{
let branch = || {
let tail = Some(make_stretched_fan(fan_degree.saturating_sub(1), stretch_len));
L::new(List::make(stretch_len, tail))
};
if fan_degree >= 1 {
let left = Some(branch());
let right = Some(branch());
let branches = Some(L::new(BinaryTree { left, right }));
L::new(List::make(stretch_len, branches))
}
else {
L::new(BinaryTree { left: None, right: None })
}
}