use crate::func::*; pub trait ApplicativeLA2ViaSeq: ApplicativeSeq { fn _la2_via_seq<'a, A: 'a, B: 'a, C: 'a>( f: impl 'a + FnOnce(A, B) -> C, fa: Self::F<'a, A>, fb: Self::F<'a, B>, ) -> Self::F<'a, C> where Self: 'a; } impl ApplicativeLA2ViaSeq for T { fn _la2_via_seq<'a, A: 'a, B: 'a, C: 'a>( f: impl 'a + FnOnce(A, B) -> C, fa: Self::F<'a, A>, fb: Self::F<'a, B>, ) -> Self::F<'a, C> where Self: 'a, { Self::seq(Self::fmap(|a| |b| f(a, b), fa), fb) } } pub trait ApplicativeSeqViaLA2: ApplicativeLA2 { fn _seq_via_la2<'a, A: 'a, B: 'a>( ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> where Self: 'a; } impl ApplicativeSeqViaLA2 for T { fn _seq_via_la2<'a, A: 'a, B: 'a>( ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> where Self: 'a, { Self::la2(|f, a| f(a), ff, fa) } } pub trait ApplicativeTupleViaLA2: ApplicativeLA2 { fn _tuple_via_la2<'a, A: 'a, B: 'a>( fab: (Self::F<'a, A>, Self::F<'a, B>), ) -> Self::F<'a, (A, B)> where Self: 'a; } impl ApplicativeTupleViaLA2 for T { fn _tuple_via_la2<'a, A: 'a, B: 'a>( (fa, fb): (Self::F<'a, A>, Self::F<'a, B>), ) -> Self::F<'a, (A, B)> where Self: 'a, { Self::la2(|a, b| (a, b), fa, fb) } }