cons_cell 0.1.0

Swiss knife for heterogenous containers
Documentation
use crate::cons::traits::contains::Contains;
use crate::cons::traits::distinct::Distinct;
use crate::cons::{Cons, ConsCell, Nil};
use typenum_uuid_trait::TypeId;
// TODO: Reason about how to handle repeated types.

pub trait ContainsMany<Contained: ConsCell + Distinct>: ConsCell {}

impl<Container: ConsCell, Contained: Cons + Distinct> ContainsMany<Contained> for Container
where
    Contained::Head: TypeId,
    Container: Contains<Contained::Head>,
    Contained::Tail: Distinct,
    Container: ContainsMany<Contained::Tail>,
{
}

impl<ContainerC: ConsCell, ContainedNilSeed> ContainsMany<Nil<ContainedNilSeed>> for ContainerC {}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::cons::ConsCell;
    use crate::cons::test_types::*;
    use crate::cons::types::hcons::{HCons, HNil};

    fn only_contains_many<Contained: ConsCell + Distinct, C: ConsCell + ContainsMany<Contained>>(
        _: C,
    ) {
    }
    #[test]
    fn it_works() {
        let c = HNil::new().extend(U8(1)).extend(U32(2)).extend(U16(3));

        only_contains_many::<HCons<U16, HCons<U32, HNil>>, _>(c);

        // Does not compile
        // let repeated_c = HNil::new()
        //     .extend(U8(1))
        //     .extend(U32(2))
        //     .extend(U16(3));
        //
        // only_contains_many::<HCons<U64, HCons<U32, HNil>>,_>(repeated_c);
    }
}