diff --git a/src/func.rs b/src/func.rs index 8ca9e09..f635756 100644 --- a/src/func.rs +++ b/src/func.rs @@ -119,11 +119,9 @@ pub trait Functor: WeakFunctor { } /// Part of [`Applicative`] responsible for Haskell's value lifting, `pure`. -pub trait Pure: Functor { +pub trait Pure<'a>: 'a + Functor { /// Equivalent of Haskell's `pure`/`return`. - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> - where - Self: 'a; + fn pure(a: A) -> Self::F<'a, A>; } /// Part of [`Applicative`] responsible for Haskell's sequential application `<*>`. @@ -156,7 +154,7 @@ pub trait ApplicativeTuple<'a>: 'a + Functor { /// /// pub trait Applicative<'a>: - Pure + ApplicativeSeq<'a> + ApplicativeLA2<'a> + ApplicativeTuple<'a> + ApplicativeSelect<'a> + Pure<'a> + ApplicativeSeq<'a> + ApplicativeLA2<'a> + ApplicativeTuple<'a> + ApplicativeSelect<'a> { /// Equivalent of Haskell's `*>`/`>>`. fn discard_first(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B> { @@ -234,7 +232,7 @@ pub trait LocalFunctor: WeakFunctor { } /// Stuff wrapped result into another functor. - fn stuff<'a, A: 'a, T: 'a + Pure>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> + fn stuff<'a, A: 'a, T: Pure<'a>>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> where Self: 'a; } diff --git a/src/func/controlflow.rs b/src/func/controlflow.rs index add9313..3fc9fec 100644 --- a/src/func/controlflow.rs +++ b/src/func/controlflow.rs @@ -22,11 +22,8 @@ impl Functor for ControlFlowInstance { } } -impl Pure for ControlFlowInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> - where - Self: 'a, - { +impl<'a, C: 'a> Pure<'a> for ControlFlowInstance { + fn pure(a: A) -> Self::F<'a, A> { ControlFlow::Break(a) } } diff --git a/src/func/instances/composition.rs b/src/func/instances/composition.rs index d1df25f..80b8f2e 100644 --- a/src/func/instances/composition.rs +++ b/src/func/instances/composition.rs @@ -29,11 +29,8 @@ impl Functor for CompositionInstance { } } -impl Pure for CompositionInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> - where - Self: 'a, - { +impl<'a, U: Pure<'a>, V: Pure<'a>> Pure<'a> for CompositionInstance { + fn pure(a: A) -> Self::F<'a, A> { U::pure(V::pure(a)) } } @@ -155,7 +152,7 @@ impl LocalFunctor for CompositionIns U::unstuff(U::fmap(V::unstuff, state)) } - fn stuff<'a, A: 'a, T: 'a + Pure>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> + fn stuff<'a, A: 'a, T: Pure<'a>>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> where Self: 'a, { diff --git a/src/func/instances/effect.rs b/src/func/instances/effect.rs index f2c5558..5a84f62 100644 --- a/src/func/instances/effect.rs +++ b/src/func/instances/effect.rs @@ -55,11 +55,8 @@ impl Functor for EffectInstance { } } -impl Pure for EffectInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> - where - Self: 'a, - { +impl<'a, E: 'a + Effect> Pure<'a> for EffectInstance { + fn pure(a: A) -> Self::F<'a, A> { WithEffect { value: a, effect: E::e_pure(), @@ -153,7 +150,7 @@ impl<'a, E: 'a + Effect> Monad<'a> for EffectInstance { } impl LocalFunctor for EffectInstance { - fn stuff<'a, A: 'a, T: 'a + Pure>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> + fn stuff<'a, A: 'a, T: Pure<'a>>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> where Self: 'a, { diff --git a/src/func/instances/future.rs b/src/func/instances/future.rs index ffda80e..eb33e7f 100644 --- a/src/func/instances/future.rs +++ b/src/func/instances/future.rs @@ -32,8 +32,8 @@ impl Functor for FutureInstance { } } -impl Pure for FutureInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> { +impl<'a> Pure<'a> for FutureInstance { + fn pure(a: A) -> Self::F<'a, A> { Box::pin(async { a }) } } diff --git a/src/func/instances/lazy.rs b/src/func/instances/lazy.rs index 655548c..c615597 100644 --- a/src/func/instances/lazy.rs +++ b/src/func/instances/lazy.rs @@ -34,8 +34,8 @@ impl Functor for LazyInstance { } } -impl Pure for LazyInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> { +impl<'a> Pure<'a> for LazyInstance { + fn pure(a: A) -> Self::F<'a, A> { Box::new(|| a) } } diff --git a/src/func/instances/option.rs b/src/func/instances/option.rs index 6bc19cb..22c517b 100644 --- a/src/func/instances/option.rs +++ b/src/func/instances/option.rs @@ -38,8 +38,8 @@ impl Functor for OptionInstance { } } -impl Pure for OptionInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> { +impl<'a> Pure<'a> for OptionInstance { + fn pure(a: A) -> Self::F<'a, A> { Some(a) } } @@ -119,7 +119,7 @@ impl LocalFunctor for OptionInstance { } } - fn stuff<'a, A: 'a, T: 'a + Pure>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> + fn stuff<'a, A: 'a, T: Pure<'a>>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> where Self: 'a, { diff --git a/src/func/instances/overload.rs b/src/func/instances/overload.rs index 7656998..22af42a 100644 --- a/src/func/instances/overload.rs +++ b/src/func/instances/overload.rs @@ -41,11 +41,8 @@ impl Functor for OverloadInstance { } } -impl Pure for OverloadInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> - where - Self: 'a, - { +impl<'a, T: Pure<'a>, O: 'a + DeriveApplicative> Pure<'a> for OverloadInstance { + fn pure(a: A) -> Self::F<'a, A> { T::pure(a) } } diff --git a/src/func/instances/result.rs b/src/func/instances/result.rs index 915617a..1b3764a 100644 --- a/src/func/instances/result.rs +++ b/src/func/instances/result.rs @@ -41,11 +41,8 @@ impl Functor for ResultInstance { } } -impl Pure for ResultInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> - where - Self: 'a, - { +impl<'a, E: 'a> Pure<'a> for ResultInstance { + fn pure(a: A) -> Self::F<'a, A> { Ok(a) } } @@ -125,7 +122,7 @@ impl LocalFunctor for ResultInstance { } } - fn stuff<'a, A: 'a, T: 'a + Pure>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> + fn stuff<'a, A: 'a, T: Pure<'a>>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> where Self: 'a, { diff --git a/src/func/instances/solo.rs b/src/func/instances/solo.rs index 2b4d7e2..c98a764 100644 --- a/src/func/instances/solo.rs +++ b/src/func/instances/solo.rs @@ -26,8 +26,8 @@ impl Functor for SoloInstance { } } -impl Pure for SoloInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> { +impl<'a> Pure<'a> for SoloInstance { + fn pure(a: A) -> Self::F<'a, A> { a } } @@ -103,7 +103,7 @@ impl LocalFunctor for SoloInstance { state } - fn stuff<'a, A: 'a, T: 'a + Pure>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> + fn stuff<'a, A: 'a, T: Pure<'a>>(fa: Self::F<'a, T::F<'a, A>>) -> T::F<'a, Self::F<'a, A>> where Self: 'a, { diff --git a/src/func/instances/stackless.rs b/src/func/instances/stackless.rs index 1d39554..d40a35d 100644 --- a/src/func/instances/stackless.rs +++ b/src/func/instances/stackless.rs @@ -147,8 +147,8 @@ impl Functor for StacklessInstance { } } -impl Pure for StacklessInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> { +impl<'a> Pure<'a> for StacklessInstance { + fn pure(a: A) -> Self::F<'a, A> { Stackless::from(a) } } diff --git a/src/func/instances/tryfuture.rs b/src/func/instances/tryfuture.rs index 044315c..64218c9 100644 --- a/src/func/instances/tryfuture.rs +++ b/src/func/instances/tryfuture.rs @@ -33,11 +33,8 @@ impl Functor for TryFutureInstance { } } -impl Pure for TryFutureInstance { - fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> - where - Self: 'a, - { +impl<'a, E: 'a> Pure<'a> for TryFutureInstance { + fn pure(a: A) -> Self::F<'a, A> { Box::pin(async { Ok(a) }) } }