use frunk::{hlist, HCons, HNil};
pub trait Split<Target> {
type Remainder;
fn split(self) -> (Target, Self::Remainder);
}
impl<AnyTail> Split<HNil> for AnyTail {
type Remainder = AnyTail;
fn split(self) -> (HNil, Self::Remainder) {
(hlist![], self)
}
}
impl<Head, SourceTail, TargetTail> Split<HCons<Head, TargetTail>> for HCons<Head, SourceTail>
where
SourceTail: Split<TargetTail>,
{
type Remainder = <SourceTail as Split<TargetTail>>::Remainder;
fn split(self) -> (HCons<Head, TargetTail>, Self::Remainder) {
let (tail, remainder) = self.tail.split();
(
HCons {
head: self.head,
tail,
},
remainder,
)
}
}