composition docs

This commit is contained in:
AF 2023-05-26 11:55:36 +00:00
parent d873e33768
commit 445e45ddc9

View File

@ -1,3 +1,5 @@
//! [Functor]s derived on compositions of other [Functor]s.
use crate::func::*; use crate::func::*;
pub struct CompositionInstance<U, V>(U, V); pub struct CompositionInstance<U, V>(U, V);
@ -26,6 +28,7 @@ impl<'a, U: Pure<'a>, V: Pure<'a>> Pure<'a> for CompositionInstance<U, V> {
} }
} }
/// Note: depends on the outer instance being [`ApplicativeLA2`] not [`ApplicativeSeq`].
impl<'a, U: ApplicativeLA2<'a>, V: ApplicativeSeq<'a>> ApplicativeSeq<'a> impl<'a, U: ApplicativeLA2<'a>, V: ApplicativeSeq<'a>> ApplicativeSeq<'a>
for CompositionInstance<U, V> for CompositionInstance<U, V>
{ {
@ -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> impl<'a, U: ApplicativeSelect<'a>, V: Functor<'a>> ApplicativeSelect<'a>
for CompositionInstance<U, V> for CompositionInstance<U, V>
{ {
@ -87,6 +91,13 @@ impl<'a, U: Monad<'a>, V: Monad<'a> + LocalFunctor<'a>> Monad<'a> for Compositio
U::iterate(ComposedIterative(f)) 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<A: 'a>(ffa: Self::F<Self::F<A>>) -> Self::F<A> { fn join<A: 'a>(ffa: Self::F<Self::F<A>>) -> Self::F<A> {
U::join(U::fmap(|ufa| U::fmap(V::join, V::stuff::<_, U>(ufa)), ffa)) 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> impl<'a, E: 'a, U: Monad<'a>, V: Fail<'a, E> + LocalFunctor<'a>> Fail<'a, E>
for CompositionInstance<U, V> for CompositionInstance<U, V>
{ {