use crate::{Cons, HList};
use super::{Get, Here, Index, Prepend, There};
pub trait Remove<T, I>: Get<T, I>
where
I: Index,
{
type Remainder: HList;
fn remove(self) -> (T, Self::Remainder);
}
impl<Head, Tail> Remove<Head, Here> for Cons<Head, Tail>
where
Tail: HList,
{
type Remainder = Tail;
fn remove(self) -> (Head, Self::Remainder) {
let Cons(head, tail) = self;
(head, tail)
}
}
impl<Head, Tail, FromTail, TailIndex> Remove<FromTail, There<TailIndex>> for Cons<Head, Tail>
where
Tail: Remove<FromTail, TailIndex>,
TailIndex: Index,
Tail::Remainder: Prepend,
{
type Remainder = <Tail::Remainder as Prepend>::Output<Head>;
fn remove(self) -> (FromTail, Self::Remainder) {
let Cons(head, tail) = self;
let (removed, tail) = tail.remove();
let remainder = tail.prepend(head);
(removed, remainder)
}
}