metatrait 0.0.0-alpha.1

RPITIT Monads
Documentation
use std::marker::PhantomData;

use either::Either;
use metatrait::{
    base::functor::*,
    existence::{Never, Sometimes},
};

struct Phantoms;

impl<T> BaseUnwrap<PhantomData<T>> for Phantoms {
    type T = T;
}

impl BaseWrap for Phantoms {
    type Wrap<T> = PhantomData<T>;
}

impl BasePure for Phantoms {
    fn pure<T>(_: T) -> Self::Wrap<T> {
        PhantomData
    }
}

impl BaseMap for Phantoms {
    fn map<Out, In>(_: Self::Wrap<In>, _: impl FnOnce(In) -> Out) -> Self::Wrap<Out> {
        PhantomData
    }
}

impl BaseMap2 for Phantoms {
    fn map2<Out, In0, In1>(
        _: Self::Wrap<In0>,
        _: Self::Wrap<In1>,
        _: impl FnOnce(In0, In1) -> Out,
    ) -> Self::Wrap<Out> {
        PhantomData
    }
}

impl BaseSelect for Phantoms {
    fn select<In0, In1>(_: Self::Wrap<In0>, _: Self::Wrap<In1>) -> BaseSelectWrap<Self, In0, In1> {
        PhantomData
    }
}

impl BaseFlatten for Phantoms {
    fn flatten<T>(_: Self::Wrap<Self::Wrap<T>>) -> Self::Wrap<T> {
        PhantomData
    }
}

impl BaseToEither for Phantoms {
    type L = Never;
    type R = Sometimes;

    fn either<In, Out>(_: Self::Wrap<In>) -> Either<(In, Self::L), (Self::Wrap<Out>, Self::R)> {
        Either::Right((PhantomData, Sometimes))
    }
}

fn main() {}