linera_witty/util/
split.rs1use frunk::{hlist, HCons, HNil};
7
8pub trait Split<Target> {
14    type Remainder;
16
17    fn split(self) -> (Target, Self::Remainder);
19}
20
21impl<AnyTail> Split<HNil> for AnyTail {
22    type Remainder = AnyTail;
23
24    fn split(self) -> (HNil, Self::Remainder) {
25        (hlist![], self)
26    }
27}
28
29impl<Head, SourceTail, TargetTail> Split<HCons<Head, TargetTail>> for HCons<Head, SourceTail>
30where
31    SourceTail: Split<TargetTail>,
32{
33    type Remainder = <SourceTail as Split<TargetTail>>::Remainder;
34
35    fn split(self) -> (HCons<Head, TargetTail>, Self::Remainder) {
36        let (tail, remainder) = self.tail.split();
37
38        (
39            HCons {
40                head: self.head,
41                tail,
42            },
43            remainder,
44        )
45    }
46}