diff --git a/src/func.rs b/src/func.rs index e01dcb3..cfb166d 100644 --- a/src/func.rs +++ b/src/func.rs @@ -162,7 +162,7 @@ pub trait ApplicativeTuple: Functor { /// /// pub trait Applicative<'a>: - 'a + Pure + ApplicativeSeq + ApplicativeLA2 + ApplicativeTuple + ApplicativeSelect + Pure + ApplicativeSeq + ApplicativeLA2 + ApplicativeTuple + ApplicativeSelect<'a> { /// Equivalent of Haskell's `*>`/`>>`. fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { diff --git a/src/func/applicative_select.rs b/src/func/applicative_select.rs index bdaf72d..e0dead9 100644 --- a/src/func/applicative_select.rs +++ b/src/func/applicative_select.rs @@ -7,19 +7,16 @@ pub enum Selected<'a, A: 'a, B: 'a, T: ?Sized + 'a + WeakFunctor> { pub type SelectedWrapped<'a, A, B, T> = Wrap<'a, Selected<'a, A, B, T>, T>; -pub trait ApplicativeSelect: Functor { - fn select<'a, A: 'a, B: 'a>( +pub trait ApplicativeSelect<'a>: 'a + Functor { + fn select( fa: Self::F<'a, A>, fb: Self::F<'a, B>, - ) -> SelectedWrapped<'a, A, B, Self> - where - Self: 'a, - { + ) -> SelectedWrapped<'a, A, B, Self> { Self::fmap(|a| Selected::A(a, fb), fa) } } -pub trait ApplicativeSelectExt<'a>: 'a + ApplicativeSelect { +pub trait ApplicativeSelectExt<'a>: ApplicativeSelect<'a> { fn select_map( f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C, fa: Self::F<'a, A>, @@ -29,4 +26,4 @@ pub trait ApplicativeSelectExt<'a>: 'a + ApplicativeSelect { } } -impl<'a, T: 'a + ApplicativeSelect> ApplicativeSelectExt<'a> for T {} +impl<'a, T: ApplicativeSelect<'a>> ApplicativeSelectExt<'a> for T {} diff --git a/src/func/instances/composition.rs b/src/func/instances/composition.rs index 86f47ab..679193d 100644 --- a/src/func/instances/composition.rs +++ b/src/func/instances/composition.rs @@ -72,14 +72,13 @@ impl ApplicativeTuple for CompositionI } } -impl ApplicativeSelect for CompositionInstance { - fn select<'a, A: 'a, B: 'a>( +impl<'a, U: ApplicativeSelect<'a>, V: 'a + Functor> ApplicativeSelect<'a> + for CompositionInstance +{ + fn select( fa: Self::F<'a, A>, fb: Self::F<'a, B>, - ) -> SelectedWrapped<'a, A, B, Self> - where - Self: 'a, - { + ) -> SelectedWrapped<'a, A, B, Self> { U::fmap( |selected| match selected { Selected::A(ua, fb) => V::fmap(|a| Selected::A(a, fb), ua), diff --git a/src/func/instances/effect.rs b/src/func/instances/effect.rs index 6b53cf2..1c063c7 100644 --- a/src/func/instances/effect.rs +++ b/src/func/instances/effect.rs @@ -110,7 +110,7 @@ impl ApplicativeTuple for EffectInstance { } } -impl ApplicativeSelect for EffectInstance {} +impl<'a, E: 'a + Effect> ApplicativeSelect<'a> for EffectInstance {} impl<'a, E: 'a + Effect> Applicative<'a> for EffectInstance { fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { diff --git a/src/func/instances/future.rs b/src/func/instances/future.rs index 5c5f374..8eee7a9 100644 --- a/src/func/instances/future.rs +++ b/src/func/instances/future.rs @@ -72,14 +72,11 @@ impl ApplicativeTuple for FutureInstance { } } -impl ApplicativeSelect for FutureInstance { - fn select<'a, A: 'a, B: 'a>( +impl<'a> ApplicativeSelect<'a> for FutureInstance { + fn select( fa: Self::F<'a, A>, fb: Self::F<'a, B>, - ) -> SelectedWrapped<'a, A, B, Self> - where - Self: 'a, - { + ) -> SelectedWrapped<'a, A, B, Self> { Box::pin(async { match select(fa, fb).await { Either::Left((a, fb)) => Selected::A(a, fb), diff --git a/src/func/instances/lazy.rs b/src/func/instances/lazy.rs index b37a753..759f837 100644 --- a/src/func/instances/lazy.rs +++ b/src/func/instances/lazy.rs @@ -68,7 +68,7 @@ impl ApplicativeTuple for LazyInstance { } } -impl ApplicativeSelect for LazyInstance {} +impl<'a> ApplicativeSelect<'a> for LazyInstance {} impl<'a> Applicative<'a> for LazyInstance { fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { diff --git a/src/func/instances/option.rs b/src/func/instances/option.rs index fbcaae5..119a5c6 100644 --- a/src/func/instances/option.rs +++ b/src/func/instances/option.rs @@ -72,7 +72,7 @@ impl ApplicativeTuple for OptionInstance { } } -impl ApplicativeSelect for OptionInstance {} +impl<'a> ApplicativeSelect<'a> for OptionInstance {} impl<'a> Applicative<'a> for OptionInstance { fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { diff --git a/src/func/instances/overload.rs b/src/func/instances/overload.rs index f737963..2688fde 100644 --- a/src/func/instances/overload.rs +++ b/src/func/instances/overload.rs @@ -84,7 +84,23 @@ impl ApplicativeTuple for OverloadIns } } -impl ApplicativeSelect for OverloadInstance {} +impl<'a, T: ApplicativeSelect<'a>, O: 'a + DeriveApplicative> ApplicativeSelect<'a> + for OverloadInstance +{ + fn select( + fa: Self::F<'a, A>, + fb: Self::F<'a, B>, + ) -> SelectedWrapped<'a, A, B, Self> { + T::select_map( + |selected| match selected { + Selected::A(a, fb) => Selected::A(a, fb), + Selected::B(fa, b) => Selected::B(fa, b), + }, + fa, + fb, + ) + } +} impl<'a, T: Applicative<'a>, O: 'a + DeriveApplicative> Applicative<'a> for OverloadInstance { fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { diff --git a/src/func/instances/result.rs b/src/func/instances/result.rs index 034f248..4a1722d 100644 --- a/src/func/instances/result.rs +++ b/src/func/instances/result.rs @@ -84,7 +84,7 @@ impl ApplicativeTuple for ResultInstance { } } -impl ApplicativeSelect for ResultInstance {} +impl<'a, E: 'a> ApplicativeSelect<'a> for ResultInstance {} impl<'a, E: 'a> Applicative<'a> for ResultInstance { fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { diff --git a/src/func/instances/solo.rs b/src/func/instances/solo.rs index 7758681..f973b4b 100644 --- a/src/func/instances/solo.rs +++ b/src/func/instances/solo.rs @@ -60,7 +60,7 @@ impl ApplicativeTuple for SoloInstance { } } -impl ApplicativeSelect for SoloInstance {} +impl<'a> ApplicativeSelect<'a> for SoloInstance {} impl<'a> Applicative<'a> for SoloInstance { fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { diff --git a/src/func/instances/stackless.rs b/src/func/instances/stackless.rs index 2a3915d..4d6de93 100644 --- a/src/func/instances/stackless.rs +++ b/src/func/instances/stackless.rs @@ -187,7 +187,7 @@ impl ApplicativeTuple for StacklessInstance { } } -impl ApplicativeSelect for StacklessInstance {} +impl<'a> ApplicativeSelect<'a> for StacklessInstance {} impl<'a> Applicative<'a> for StacklessInstance { fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { diff --git a/src/func/instances/tryfuture.rs b/src/func/instances/tryfuture.rs index d09d671..c22f24c 100644 --- a/src/func/instances/tryfuture.rs +++ b/src/func/instances/tryfuture.rs @@ -82,14 +82,11 @@ impl ApplicativeTuple for TryFutureInstance { } } -impl ApplicativeSelect for TryFutureInstance { - fn select<'a, A: 'a, B: 'a>( +impl<'a, E: 'a> ApplicativeSelect<'a> for TryFutureInstance { + fn select( fa: Self::F<'a, A>, fb: Self::F<'a, B>, - ) -> SelectedWrapped<'a, A, B, Self> - where - Self: 'a, - { + ) -> SelectedWrapped<'a, A, B, Self> { Box::pin(async { match try_select(fa, fb).await { Ok(Either::Left((a, fb))) => Ok(Selected::A(a, fb)),