radn-rs/src/func/derivations.rs

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)
}
}