pub trait NodeMetadata: Sized + Copy + Default {
fn merge(self, other: Self) -> Self;
fn with_size(self, _size: u16) -> Self {
self
}
}
pub trait NodeWithMetadata<M: NodeMetadata> {
fn self_metadata(&self) -> M {
M::default()
}
fn metadata(&self) -> M;
}
impl NodeMetadata for () {
fn merge(self, _: Self) -> Self {}
}
impl<M: NodeMetadata, T: NodeWithMetadata<M>> NodeWithMetadata<M> for Option<T> {
fn self_metadata(&self) -> M {
match self {
Some(inner) => inner.self_metadata(),
None => M::default(),
}
}
fn metadata(&self) -> M {
match self {
Some(inner) => inner.metadata(),
None => M::default(),
}
}
}