diff --git a/src/func/instances/composition.rs b/src/func/instances/composition.rs index e19384a..fdf9a66 100644 --- a/src/func/instances/composition.rs +++ b/src/func/instances/composition.rs @@ -1,3 +1,5 @@ +//! [Functor]s derived on compositions of other [Functor]s. + use crate::func::*; pub struct CompositionInstance(U, V); @@ -26,6 +28,7 @@ impl<'a, U: Pure<'a>, V: Pure<'a>> Pure<'a> for CompositionInstance { } } +/// Note: depends on the outer instance being [`ApplicativeLA2`] not [`ApplicativeSeq`]. impl<'a, U: ApplicativeLA2<'a>, V: ApplicativeSeq<'a>> ApplicativeSeq<'a> for CompositionInstance { @@ -54,6 +57,7 @@ impl<'a, U: ApplicativeTuple<'a>, V: ApplicativeTuple<'a>> ApplicativeTuple<'a> } } +/// Note: depends on the inner instance being [`Functor`] not [`ApplicativeSelect`]. impl<'a, U: ApplicativeSelect<'a>, V: Functor<'a>> ApplicativeSelect<'a> for CompositionInstance { @@ -87,6 +91,13 @@ impl<'a, U: Monad<'a>, V: Monad<'a> + LocalFunctor<'a>> Monad<'a> for Compositio U::iterate(ComposedIterative(f)) } + /// Basis for how composition can be a [Monad]. + /// + /// ```text + /// U V U V A + /// U U V V A + /// U V A + /// ``` fn join(ffa: Self::F>) -> Self::F { U::join(U::fmap(|ufa| U::fmap(V::join, V::stuff::<_, U>(ufa)), ffa)) } @@ -116,6 +127,7 @@ impl< } } +/// Note: fails in the inner instance not outer. impl<'a, E: 'a, U: Monad<'a>, V: Fail<'a, E> + LocalFunctor<'a>> Fail<'a, E> for CompositionInstance {