use std::marker::PhantomData;
use std::ops::Add;
pub type NodePtr<T> = Option<Box<Node<T>>>;
#[derive(Clone)]
pub struct Node<T: Clone + Add + Into<T>> {
pub l: NodePtr<T>,
pub r: NodePtr<T>,
pub val: T,
__phantom: PhantomData<T>,
}
impl<T: Clone + Add<Output = T>> Node<T> {
pub fn new(x: T) -> NodePtr<T> {
return Some(Box::<Node<T>>::new(Node {
l: None,
r: None,
val: x,
__phantom: PhantomData,
}));
}
pub fn merge(l: NodePtr<T>, r: NodePtr<T>, new_val: T) -> NodePtr<T> {
return Some(Box::<Node<T>>::new(Node {
l: l.clone(),
r: r.clone(),
val: new_val,
__phantom: PhantomData,
}));
}
}