#![allow(dead_code)]
use std::collections::VecDeque;
use uniplate::{Biplate, Uniplate};
#[derive(Eq, PartialEq, Uniplate, Clone)]
#[biplate(to=T)]
enum BinaryTree<T: PartialEq + Eq>
where
T: Ord,
T: Clone,
{
Leaf(T),
Branch(T, Box<BinaryTree<T>>, Box<BinaryTree<T>>),
}
pub fn main() {
let tree1: BinaryTree<String> = BinaryTree::Leaf("Hello".into());
let tree2: BinaryTree<String> = BinaryTree::Branch(
"World".into(),
Box::new(tree1.clone()),
Box::new(tree1.clone()),
);
let tree3: BinaryTree<String> = BinaryTree::Branch(
"Foo".into(),
Box::new(tree1.clone()),
Box::new(tree2.clone()),
);
let tree1_universe: VecDeque<String> = VecDeque::from(["Hello".into()]);
let tree2_universe: VecDeque<String> =
VecDeque::from(["World".into(), "Hello".into(), "Hello".into()]);
let tree3_universe: VecDeque<String> = VecDeque::from([
"Foo".into(),
"Hello".into(),
"World".into(),
"Hello".into(),
"Hello".into(),
]);
assert_eq!(tree1_universe, Biplate::<String>::universe_bi(&tree1));
assert_eq!(tree2_universe, Biplate::<String>::universe_bi(&tree2));
assert_eq!(tree3_universe, Biplate::<String>::universe_bi(&tree3));
}