ApplicativeTuple
lift lifetime
This commit is contained in:
parent
0e3c1f5d45
commit
dab754adf4
@ -150,11 +150,9 @@ pub trait ApplicativeLA2: Functor {
|
||||
}
|
||||
|
||||
/// Part of [`Applicative`] responsible for Rust-style result combination, specifically for tuples.
|
||||
pub trait ApplicativeTuple: Functor {
|
||||
pub trait ApplicativeTuple<'a>: 'a + Functor {
|
||||
/// Similar to Haskell's `listA2` but with [Iterator::collect]-ish semantics.
|
||||
fn tuple<'a, A: 'a, B: 'a>(fab: (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a;
|
||||
fn tuple<A: 'a, B: 'a>(fab: (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>;
|
||||
}
|
||||
|
||||
/// Equivalent of Haskell's `Applicative`.
|
||||
@ -162,7 +160,7 @@ pub trait ApplicativeTuple: Functor {
|
||||
///
|
||||
/// <https://hackage.haskell.org/package/base-4.18.0.0/docs/Control-Applicative.html>
|
||||
pub trait Applicative<'a>:
|
||||
Pure + ApplicativeSeq + ApplicativeLA2 + ApplicativeTuple + ApplicativeSelect<'a>
|
||||
Pure + ApplicativeSeq + ApplicativeLA2 + ApplicativeTuple<'a> + ApplicativeSelect<'a>
|
||||
{
|
||||
/// Equivalent of Haskell's `*>`/`>>`.
|
||||
fn discard_first<A: 'a, B: 'a>(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> {
|
||||
|
@ -63,11 +63,10 @@ impl<U: ApplicativeLA2, V: ApplicativeLA2> ApplicativeLA2 for CompositionInstanc
|
||||
}
|
||||
}
|
||||
|
||||
impl<U: ApplicativeTuple, V: ApplicativeTuple> ApplicativeTuple for CompositionInstance<U, V> {
|
||||
fn tuple<'a, A: 'a, B: 'a>(fab: (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
impl<'a, U: ApplicativeTuple<'a>, V: ApplicativeTuple<'a>> ApplicativeTuple<'a>
|
||||
for CompositionInstance<U, V>
|
||||
{
|
||||
fn tuple<A: 'a, B: 'a>(fab: (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
U::fmap(V::tuple, U::tuple(fab))
|
||||
}
|
||||
}
|
||||
|
@ -98,11 +98,8 @@ impl<E: Effect> ApplicativeLA2 for EffectInstance<E> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<E: Effect> ApplicativeTuple for EffectInstance<E> {
|
||||
fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
{
|
||||
impl<'a, E: 'a + Effect> ApplicativeTuple<'a> for EffectInstance<E> {
|
||||
fn tuple<A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
WithEffect {
|
||||
value: (fa.value, fb.value),
|
||||
effect: E::e_seq(fa.effect, fb.effect),
|
||||
|
@ -63,11 +63,8 @@ impl ApplicativeLA2 for FutureInstance {
|
||||
}
|
||||
}
|
||||
|
||||
impl ApplicativeTuple for FutureInstance {
|
||||
fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
{
|
||||
impl<'a> ApplicativeTuple<'a> for FutureInstance {
|
||||
fn tuple<A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
Box::pin(async { join!(fa, fb) })
|
||||
}
|
||||
}
|
||||
|
@ -59,11 +59,8 @@ impl ApplicativeLA2 for LazyInstance {
|
||||
}
|
||||
}
|
||||
|
||||
impl ApplicativeTuple for LazyInstance {
|
||||
fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
{
|
||||
impl<'a> ApplicativeTuple<'a> for LazyInstance {
|
||||
fn tuple<A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
Box::new(|| (fa(), fb()))
|
||||
}
|
||||
}
|
||||
|
@ -63,11 +63,8 @@ impl ApplicativeLA2 for OptionInstance {
|
||||
}
|
||||
}
|
||||
|
||||
impl ApplicativeTuple for OptionInstance {
|
||||
fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
{
|
||||
impl<'a> ApplicativeTuple<'a> for OptionInstance {
|
||||
fn tuple<A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
Self::pure((fa?, fb?))
|
||||
}
|
||||
}
|
||||
|
@ -75,11 +75,10 @@ impl<T: ApplicativeLA2, O: DeriveApplicative> ApplicativeLA2 for OverloadInstanc
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ApplicativeTuple, O: DeriveApplicative> ApplicativeTuple for OverloadInstance<T, O> {
|
||||
fn tuple<'a, A: 'a, B: 'a>(fab: (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
impl<'a, T: ApplicativeTuple<'a>, O: 'a + DeriveApplicative> ApplicativeTuple<'a>
|
||||
for OverloadInstance<T, O>
|
||||
{
|
||||
fn tuple<A: 'a, B: 'a>(fab: (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
T::tuple(fab)
|
||||
}
|
||||
}
|
||||
|
@ -75,11 +75,8 @@ impl<E> ApplicativeLA2 for ResultInstance<E> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<E> ApplicativeTuple for ResultInstance<E> {
|
||||
fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
{
|
||||
impl<'a, E: 'a> ApplicativeTuple<'a> for ResultInstance<E> {
|
||||
fn tuple<A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
Self::pure((fa?, fb?))
|
||||
}
|
||||
}
|
||||
|
@ -51,11 +51,8 @@ impl ApplicativeLA2 for SoloInstance {
|
||||
}
|
||||
}
|
||||
|
||||
impl ApplicativeTuple for SoloInstance {
|
||||
fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
{
|
||||
impl<'a> ApplicativeTuple<'a> for SoloInstance {
|
||||
fn tuple<A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
(fa, fb)
|
||||
}
|
||||
}
|
||||
|
@ -178,11 +178,8 @@ impl ApplicativeLA2 for StacklessInstance {
|
||||
}
|
||||
}
|
||||
|
||||
impl ApplicativeTuple for StacklessInstance {
|
||||
fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
{
|
||||
impl<'a> ApplicativeTuple<'a> for StacklessInstance {
|
||||
fn tuple<A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
Self::_tuple_via_la2((fa, fb))
|
||||
}
|
||||
}
|
||||
|
@ -73,11 +73,8 @@ impl<E> ApplicativeLA2 for TryFutureInstance<E> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<E> ApplicativeTuple for TryFutureInstance<E> {
|
||||
fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
|
||||
where
|
||||
Self: 'a,
|
||||
{
|
||||
impl<'a, E: 'a> ApplicativeTuple<'a> for TryFutureInstance<E> {
|
||||
fn tuple<A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)> {
|
||||
Box::pin(async { try_join!(fa, fb) })
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user