use std::iter::FromIterator;
pub trait Union: Sized {
fn union(lval: Self, rval: Self) -> UnionResult<Self>;
}
#[allow(missing_docs)]
#[derive(Copy, Clone, Debug)]
pub enum UnionResult<T> {
Left(T),
Right(T),
}
pub trait UnionFind<V: Union>: FromIterator<V> + Extend<V> + Sized {
#[inline]
fn new(len: usize) -> Self
where
V: Default,
{
Self::from_iter((0..len).map(|_| Default::default()))
}
fn size(&self) -> usize;
fn insert(&mut self, data: V) -> usize;
fn union(&mut self, key0: usize, key1: usize) -> bool;
fn find(&mut self, key: usize) -> usize;
fn get(&mut self, key: usize) -> &V;
fn get_mut(&mut self, key: usize) -> &mut V;
}