65 lines
1.5 KiB
Rust
65 lines
1.5 KiB
Rust
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<T: ApplicativeSeq> 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<T: ApplicativeLA2> 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<T: ApplicativeLA2> 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)
|
|
}
|
|
}
|