use either::Either;
use frunk::{HCons, HNil};
pub trait Merge<Other>: Sized {
type Output;
}
impl Merge<HNil> for HNil {
type Output = HNil;
}
impl<Head, Tail> Merge<HNil> for HCons<Head, Tail>
where
Tail: Merge<HNil>,
{
type Output = HCons<Either<Head, ()>, <Tail as Merge<HNil>>::Output>;
}
impl<Head, Tail> Merge<HCons<Head, Tail>> for HNil
where
HNil: Merge<Tail>,
{
type Output = HCons<Either<(), Head>, <HNil as Merge<Tail>>::Output>;
}
impl<LeftHead, LeftTail, RightHead, RightTail> Merge<HCons<RightHead, RightTail>>
for HCons<LeftHead, LeftTail>
where
LeftTail: Merge<RightTail>,
{
type Output = HCons<Either<LeftHead, RightHead>, <LeftTail as Merge<RightTail>>::Output>;
}