la2 reorder

This commit is contained in:
AF 2023-05-30 00:00:14 +00:00
parent d6231a26a6
commit 4794dd1d17
15 changed files with 44 additions and 48 deletions

View File

@ -59,8 +59,7 @@ pub trait BinaryTreesMutable<'a>: BinaryTrees<'a> {
return <Self::T as Pure>::pure(tl) return <Self::T as Pure>::pure(tl)
}; };
let ctx = self.clone(); let ctx = self.clone();
<Self::T as Monad>::join(<Self::T as ApplicativeLA2>::la2( Self::T::bind2(self.resolve(&rl), self.resolve(&rr), move |nl, nr| {
move |nl, nr| {
let (tll, tlr, kl) = ctx.split(&nl); let (tll, tlr, kl) = ctx.split(&nl);
let (trl, trr, kr) = ctx.split(&nr); let (trl, trr, kr) = ctx.split(&nr);
let ft = ctx.join(tlr, trl); let ft = ctx.join(tlr, trl);
@ -73,10 +72,7 @@ pub trait BinaryTreesMutable<'a>: BinaryTrees<'a> {
<Self::T as Monad>::bind(ft, move |t| ctx.join_key_tree(t, kr, trr)) <Self::T as Monad>::bind(ft, move |t| ctx.join_key_tree(t, kr, trr))
}; };
ft ft
}, })
self.resolve(&rl),
self.resolve(&rr),
))
} }
fn split_key_empty( fn split_key_empty(

View File

@ -17,10 +17,8 @@ struct SubsetContext<'a, T: MonadFail<'a, ()>, A: 'a, D: 'a + PartialEq> {
impl<'a, T: 'a + MonadFail<'a, ()>, A: 'a, D: 'a + PartialEq> SubsetContext<'a, T, A, D> { impl<'a, T: 'a + MonadFail<'a, ()>, A: 'a, D: 'a + PartialEq> SubsetContext<'a, T, A, D> {
fn on_l(self, (t_subl, t_subr, k_sub): Split<'a, T, A, D>) -> T::F<()> { fn on_l(self, (t_subl, t_subr, k_sub): Split<'a, T, A, D>) -> T::F<()> {
T::la2( T::la2(
and,
algorithms::contains::t_contains(self.comparator, self.t_superl.clone(), k_sub.clone()), algorithms::contains::t_contains(self.comparator, self.t_superl.clone(), k_sub.clone()),
T::la2( T::la2(
and,
t_subset_of_t( t_subset_of_t(
self.comparator, self.comparator,
t_subl, t_subl,
@ -35,13 +33,14 @@ impl<'a, T: 'a + MonadFail<'a, ()>, A: 'a, D: 'a + PartialEq> SubsetContext<'a,
Some(k_sub), Some(k_sub),
self.k_r, self.k_r,
), ),
and,
), ),
and,
) )
} }
fn on_e(self, (t_subl, t_subr, k_sub): Split<'a, T, A, D>) -> T::F<()> { fn on_e(self, (t_subl, t_subr, k_sub): Split<'a, T, A, D>) -> T::F<()> {
T::la2( T::la2(
and,
t_subset_of_t( t_subset_of_t(
self.comparator, self.comparator,
t_subl, t_subl,
@ -56,15 +55,14 @@ impl<'a, T: 'a + MonadFail<'a, ()>, A: 'a, D: 'a + PartialEq> SubsetContext<'a,
Some(k_sub), Some(k_sub),
self.k_r, self.k_r,
), ),
and,
) )
} }
fn on_r(self, (t_subl, t_subr, k_sub): Split<'a, T, A, D>) -> T::F<()> { fn on_r(self, (t_subl, t_subr, k_sub): Split<'a, T, A, D>) -> T::F<()> {
T::la2( T::la2(
and,
algorithms::contains::t_contains(self.comparator, self.t_superr.clone(), k_sub.clone()), algorithms::contains::t_contains(self.comparator, self.t_superr.clone(), k_sub.clone()),
T::la2( T::la2(
and,
t_subset_of_t( t_subset_of_t(
self.comparator, self.comparator,
t_subl, t_subl,
@ -79,7 +77,9 @@ impl<'a, T: 'a + MonadFail<'a, ()>, A: 'a, D: 'a + PartialEq> SubsetContext<'a,
Some(k_sub), Some(k_sub),
self.k_r, self.k_r,
), ),
and,
), ),
and,
) )
} }
@ -134,11 +134,11 @@ pub fn r_subset_of_r<'a, T: MonadFail<'a, ()>, A: 'a, D: 'a + PartialEq>(
k_l: Option<Rc<A>>, k_l: Option<Rc<A>>,
k_r: Option<Rc<A>>, k_r: Option<Rc<A>>,
) -> T::F<()> { ) -> T::F<()> {
T::join(T::la2( T::bind2(
move |n_subset, n_superset| n_subset_of_n(comparator, n_subset, n_superset, k_l, k_r),
r_subset.resolve(), r_subset.resolve(),
r_superset.resolve(), r_superset.resolve(),
)) move |n_subset, n_superset| n_subset_of_n(comparator, n_subset, n_superset, k_l, k_r),
)
} }
pub fn t_subset_of_t<'a, T: MonadFail<'a, ()>, A, D: 'a + PartialEq>( pub fn t_subset_of_t<'a, T: MonadFail<'a, ()>, A, D: 'a + PartialEq>(

View File

@ -86,9 +86,9 @@ pub trait ApplicativeSeq<'a>: Functor<'a> {
pub trait ApplicativeLA2<'a>: Functor<'a> { pub trait ApplicativeLA2<'a>: Functor<'a> {
/// Equivalent of Haskell's `listA2`. /// Equivalent of Haskell's `listA2`.
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C>; ) -> Self::F<C>;
} }
@ -112,7 +112,7 @@ pub trait Applicative<'a>:
/// Equivalent of Haskell's `<*`. /// Equivalent of Haskell's `<*`.
fn discard_second<A: 'a, B: 'a>(fa: Self::F<A>, fb: Self::F<B>) -> Self::F<A> { fn discard_second<A: 'a, B: 'a>(fa: Self::F<A>, fb: Self::F<B>) -> Self::F<A> {
Self::la2(|a, _| a, fa, fb) Self::la2(fa, fb, |a, _| a)
} }
} }
@ -154,7 +154,7 @@ pub trait MonadExt<'a>: Monad<'a> {
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> Self::F<C>, f: impl 'a + FnOnce(A, B) -> Self::F<C>,
) -> Self::F<C> { ) -> Self::F<C> {
Self::join(Self::la2(f, fa, fb)) Self::join(Self::la2(fa, fb, f))
} }
} }

View File

@ -33,7 +33,7 @@ pub trait ApplicativeSeqViaLA2<'a>: ApplicativeLA2<'a> {
ff: Self::F<impl 'a + FnOnce(A) -> B>, ff: Self::F<impl 'a + FnOnce(A) -> B>,
fa: Self::F<A>, fa: Self::F<A>,
) -> Self::F<B> { ) -> Self::F<B> {
Self::la2(|f, a| f(a), ff, fa) Self::la2(ff, fa, |f, a| f(a))
} }
} }
@ -41,7 +41,7 @@ impl<'a, T: ApplicativeLA2<'a>> ApplicativeSeqViaLA2<'a> for T {}
pub trait ApplicativeTupleViaLA2<'a>: ApplicativeLA2<'a> { pub trait ApplicativeTupleViaLA2<'a>: ApplicativeLA2<'a> {
fn _tuple_via_la2<A: 'a, B: 'a>((fa, fb): (Self::F<A>, Self::F<B>)) -> Self::F<(A, B)> { fn _tuple_via_la2<A: 'a, B: 'a>((fa, fb): (Self::F<A>, Self::F<B>)) -> Self::F<(A, B)> {
Self::la2(|a, b| (a, b), fa, fb) Self::la2(fa, fb, |a, b| (a, b))
} }
} }

View File

@ -39,7 +39,7 @@ impl<'a, U: ApplicativeLA2<'a>, V: ApplicativeSeq<'a>> ApplicativeSeq<'a>
for CompositionInstance<U, V> for CompositionInstance<U, V>
{ {
fn seq<A: 'a, B: 'a>(ff: Self::F<impl 'a + FnOnce(A) -> B>, fa: Self::F<A>) -> Self::F<B> { fn seq<A: 'a, B: 'a>(ff: Self::F<impl 'a + FnOnce(A) -> B>, fa: Self::F<A>) -> Self::F<B> {
U::la2(|uf, ua| V::seq(uf, ua), ff, fa) U::la2(ff, fa, V::seq)
} }
} }
@ -47,11 +47,11 @@ impl<'a, U: ApplicativeLA2<'a>, V: ApplicativeLA2<'a>> ApplicativeLA2<'a>
for CompositionInstance<U, V> for CompositionInstance<U, V>
{ {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
U::la2(|ua, ub| V::la2(f, ua, ub), fa, fb) U::la2(fa, fb, |ua, ub| V::la2(ua, ub, f))
} }
} }
@ -80,11 +80,11 @@ impl<'a, U: ApplicativeSelect<'a>, V: Functor<'a>> ApplicativeSelect<'a>
impl<'a, U: Applicative<'a>, V: Applicative<'a>> Applicative<'a> for CompositionInstance<U, V> { impl<'a, U: Applicative<'a>, V: Applicative<'a>> Applicative<'a> for CompositionInstance<U, V> {
fn discard_first<A: 'a, B: 'a>(fa: Self::F<A>, fb: Self::F<B>) -> Self::F<B> { fn discard_first<A: 'a, B: 'a>(fa: Self::F<A>, fb: Self::F<B>) -> Self::F<B> {
U::la2(|ua, ub| V::discard_first(ua, ub), fa, fb) U::la2(fa, fb, V::discard_first)
} }
fn discard_second<A: 'a, B: 'a>(fa: Self::F<A>, fb: Self::F<B>) -> Self::F<A> { fn discard_second<A: 'a, B: 'a>(fa: Self::F<A>, fb: Self::F<B>) -> Self::F<A> {
U::la2(|ua, ub| V::discard_second(ua, ub), fa, fb) U::la2(fa, fb, V::discard_second)
} }
} }

View File

@ -82,9 +82,9 @@ impl<'a, E: 'a + Effect> ApplicativeSeq<'a> for EffectInstance<E> {
impl<'a, E: 'a + Effect> ApplicativeLA2<'a> for EffectInstance<E> { impl<'a, E: 'a + Effect> ApplicativeLA2<'a> for EffectInstance<E> {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
WithEffect { WithEffect {
value: f(fa.value, fb.value), value: f(fa.value, fb.value),

View File

@ -52,9 +52,9 @@ impl<'a> ApplicativeSeq<'a> for FutureInstance {
impl<'a> ApplicativeLA2<'a> for FutureInstance { impl<'a> ApplicativeLA2<'a> for FutureInstance {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
Box::pin(async { Box::pin(async {
let (a, b) = join!(fa, fb); let (a, b) = join!(fa, fb);

View File

@ -49,9 +49,9 @@ impl<'a> ApplicativeSeq<'a> for LazyInstance {
impl<'a> ApplicativeLA2<'a> for LazyInstance { impl<'a> ApplicativeLA2<'a> for LazyInstance {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
Box::new(|| f(fa(), fb())) Box::new(|| f(fa(), fb()))
} }

View File

@ -50,9 +50,9 @@ impl<'a> ApplicativeSeq<'a> for OptionInstance {
impl<'a> ApplicativeLA2<'a> for OptionInstance { impl<'a> ApplicativeLA2<'a> for OptionInstance {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
Self::pure(f(fa?, fb?)) Self::pure(f(fa?, fb?))
} }

View File

@ -56,11 +56,11 @@ impl<'a, T: ApplicativeLA2<'a>, O: 'a + DeriveApplicative> ApplicativeLA2<'a>
for OverloadInstance<T, O> for OverloadInstance<T, O>
{ {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
T::la2(f, fa, fb) T::la2(fa, fb, f)
} }
} }

View File

@ -50,9 +50,9 @@ impl<'a, E: 'a> ApplicativeSeq<'a> for ResultInstance<E> {
impl<'a, E: 'a> ApplicativeLA2<'a> for ResultInstance<E> { impl<'a, E: 'a> ApplicativeLA2<'a> for ResultInstance<E> {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
Self::pure(f(fa?, fb?)) Self::pure(f(fa?, fb?))
} }

View File

@ -44,9 +44,9 @@ impl<'a> ApplicativeSeq<'a> for SoloInstance {
impl<'a> ApplicativeLA2<'a> for SoloInstance { impl<'a> ApplicativeLA2<'a> for SoloInstance {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
f(fa, fb) f(fa, fb)
} }

View File

@ -157,9 +157,9 @@ impl<'a> ApplicativeSeq<'a> for StacklessInstance {
impl<'a> ApplicativeLA2<'a> for StacklessInstance { impl<'a> ApplicativeLA2<'a> for StacklessInstance {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
Self::_la2_via_seq(f, fa, fb) Self::_la2_via_seq(f, fa, fb)
} }

View File

@ -51,9 +51,9 @@ impl<'a, E: 'a> ApplicativeSeq<'a> for TryFutureInstance<E> {
impl<'a, E: 'a> ApplicativeLA2<'a> for TryFutureInstance<E> { impl<'a, E: 'a> ApplicativeLA2<'a> for TryFutureInstance<E> {
fn la2<A: 'a, B: 'a, C: 'a>( fn la2<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(A, B) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
Box::pin(async { Box::pin(async {
let (a, b) = try_join!(fa, fb)?; let (a, b) = try_join!(fa, fb)?;

View File

@ -188,7 +188,7 @@ pub fn seq_can_be_expressed_via_la2<
T::eqr( T::eqr(
"seq via la2: (<*>) = liftA2 id", "seq via la2: (<*>) = liftA2 id",
T::seq(ff0(), fa0()), T::seq(ff0(), fa0()),
T::la2(|f, a| f(a), ff0(), fa0()), T::la2(ff0(), fa0(), |f, a| f(a)),
) )
} }
@ -224,7 +224,7 @@ pub fn discard_can_be_expressed_via_seq_or_la2<
) + T::eqr( ) + T::eqr(
"discard via la2: u <* v = liftA2 const u v", "discard via la2: u <* v = liftA2 const u v",
T::discard_second(fb0(), fa0()), T::discard_second(fb0(), fa0()),
T::la2(|b, _| b, fb0(), fa0()), T::la2(fb0(), fa0(), |b, _| b),
) )
} }