use crate::cons::{Cons, ConsCell, Nil};
use std::ops::Add;
use typenum::{U0, U1, Unsigned};
pub trait Length: ConsCell {
type Len: Unsigned;
fn len(&self) -> usize {
Self::Len::to_usize()
}
}
impl<C: Cons> Length for C
where
<C as Cons>::Tail: Length,
<<C as Cons>::Tail as Length>::Len: Add<U1>,
<<<C as Cons>::Tail as Length>::Len as Add<U1>>::Output: Unsigned,
{
type Len = <<<C as Cons>::Tail as Length>::Len as Add<U1>>::Output;
}
impl<NilSeed> Length for Nil<NilSeed> {
type Len = U0;
}