pub enum Index {}
pub trait Get<Target, Index> {
type Remainder;
fn get(self) -> (Target, Self::Remainder);
}
impl<Head, Tail> Get<Head, Index> for (Head, Tail) {
type Remainder = Tail;
fn get(self) -> (Head, Self::Remainder) {
self
}
}
impl<Target, Head, Tail, Index> Get<Target, (Index,)> for (Head, Tail)
where
Tail: Get<Target, Index>,
{
type Remainder = (Head, Tail::Remainder);
fn get(self) -> (Target, Self::Remainder) {
let (target, remainder) = self.1.get();
(target, (self.0, remainder))
}
}
#[cfg(test)]
mod tests {
use super::Get;
#[derive(Debug, PartialEq)]
struct A;
#[derive(Debug, PartialEq)]
struct B;
#[derive(Debug, PartialEq)]
struct Null;
#[test]
fn get_head() {
assert_eq!(Get::<A, _>::get((A, (B, Null))), (A, (B, Null)));
}
#[test]
fn get_tail() {
assert_eq!(Get::<B, _>::get((A, (B, Null))), (B, (A, Null)));
}
}