From 6aa149ee6afd9c721a1a76cc708557ee299fb6fa Mon Sep 17 00:00:00 2001 From: timofey Date: Sun, 26 Mar 2023 11:59:50 +0000 Subject: [PATCH] `impl` sugar --- src/core.rs | 5 +++-- src/func.rs | 28 ++++++++++++++-------------- src/func/classes/compositionclass.rs | 24 +++++++++++++++++++----- src/func/classes/futureclass.rs | 14 +++++++------- src/func/classes/lazyclass.rs | 14 +++++++------- src/func/classes/optionclass.rs | 14 +++++++------- src/func/classes/resultclass.rs | 14 +++++++------- src/func/classes/soloclass.rs | 17 ++++++++--------- src/func/clone_func.rs | 4 ++-- 9 files changed, 74 insertions(+), 60 deletions(-) diff --git a/src/core.rs b/src/core.rs index 6a4ccd9..3672435 100644 --- a/src/core.rs +++ b/src/core.rs @@ -1,4 +1,4 @@ -use std::{rc::Rc, error::Error}; +use std::{error::Error, rc::Rc}; use crate::func::*; @@ -38,7 +38,8 @@ pub trait Factory: Clone { type Mtbl: Mentionable; type ParseError: Error; - fn deserialize(&self, deserializer: F) -> Result; + fn deserialize(&self, deserializer: F) + -> Result; } pub trait Origin<'a, Ctx: Context>: 'a { diff --git a/src/func.rs b/src/func.rs index 47c3533..f7cb9c5 100644 --- a/src/func.rs +++ b/src/func.rs @@ -23,7 +23,7 @@ pub trait WeakFunctor { /// } /// /// impl Functor for VecClass { -/// fn fmap<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>(f: F, fa: Self::F<'a, A>) -> Self::F<'a, B> { +/// fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B> /// fa.into_iter().map(f).collect() /// } /// } @@ -41,8 +41,8 @@ pub trait WeakFunctor { /// } /// /// impl CloneFunctor for VecClass { -/// fn clone_fmap<'a, A: 'a + Clone, B: 'a + Clone, F: 'a + Fn(A) -> B>( -/// f: F, +/// fn clone_fmap<'a, A: 'a + Clone, B: 'a + Clone>( +/// f: impl 'a + Fn(A) -> B, /// fa: Self::ClF<'a, A>, /// ) -> Self::ClF<'a, B> { /// fa.into_iter().map(f).collect() @@ -51,7 +51,7 @@ pub trait WeakFunctor { /// ``` pub trait Functor: WeakFunctor { - fn fmap<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>(f: F, fa: Self::F<'a, A>) -> Self::F<'a, B> + fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B> where Self: 'a; @@ -71,14 +71,14 @@ pub trait Functor: WeakFunctor { } pub trait ApplicativeSeq: Functor { - fn seq<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>( - ff: Self::F<'a, F>, + fn seq<'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; - fn _la2<'a, A: 'a, B: 'a, C: 'a, F: 'a + FnOnce(A, B) -> C>( - f: F, + fn _la2<'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> @@ -90,15 +90,15 @@ pub trait ApplicativeSeq: Functor { } pub trait ApplicativeLA2: Functor { - fn la2<'a, A: 'a, B: 'a, C: 'a, F: 'a + FnOnce(A, B) -> C>( - f: F, + fn la2<'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; - fn _seq<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>( - ff: Self::F<'a, F>, + fn _seq<'a, A: 'a, B: 'a>( + ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> where @@ -127,9 +127,9 @@ pub trait Applicative: Functor + ApplicativeSeq + ApplicativeLA2 { } pub trait Monad: Applicative { - fn bind<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> Self::F<'a, B>>( + fn bind<'a, A: 'a, B: 'a>( fa: Self::F<'a, A>, - f: F, + f: impl 'a + FnOnce(A) -> Self::F<'a, B>, ) -> Self::F<'a, B> where Self: 'a; diff --git a/src/func/classes/compositionclass.rs b/src/func/classes/compositionclass.rs index 0539ff8..31ed9b5 100644 --- a/src/func/classes/compositionclass.rs +++ b/src/func/classes/compositionclass.rs @@ -7,7 +7,7 @@ impl WeakFunctor for CompositionClass { } impl Functor for CompositionClass { - fn fmap<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>(f: F, fa: Self::F<'a, A>) -> Self::F<'a, B> + fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B> where Self: 'a, { @@ -30,8 +30,8 @@ impl Functor for CompositionClass { } impl ApplicativeSeq for CompositionClass { - fn seq<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>( - ff: Self::F<'a, F>, + fn seq<'a, A: 'a, B: 'a>( + ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> where @@ -42,8 +42,8 @@ impl ApplicativeSeq for CompositionClass ApplicativeLA2 for CompositionClass { - fn la2<'a, A: 'a, B: 'a, C: 'a, F: 'a + FnOnce(A, B) -> C>( - f: F, + fn la2<'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> @@ -53,3 +53,17 @@ impl ApplicativeLA2 for CompositionClass(f: impl 'a + Fn(i16) -> i32, g: impl 'a + Fn(i8) -> i16) -> impl 'a + Fn(i8) -> i32 { + move |x| f(g(x)) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_compose() { + assert_eq!(compose(|x| (x + 5).into(), |x| (x + 3).into())(2), 10); + } +} diff --git a/src/func/classes/futureclass.rs b/src/func/classes/futureclass.rs index c62c7d2..cfc83d1 100644 --- a/src/func/classes/futureclass.rs +++ b/src/func/classes/futureclass.rs @@ -11,7 +11,7 @@ impl WeakFunctor for FutureClass { } impl Functor for FutureClass { - fn fmap<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>(f: F, fa: Self::F<'a, A>) -> Self::F<'a, B> { + fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B> { Box::pin(async { f(fa.await) }) } @@ -24,8 +24,8 @@ impl Functor for FutureClass { } impl ApplicativeSeq for FutureClass { - fn seq<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>( - ff: Self::F<'a, F>, + fn seq<'a, A: 'a, B: 'a>( + ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> { Box::pin(async { @@ -36,8 +36,8 @@ impl ApplicativeSeq for FutureClass { } impl ApplicativeLA2 for FutureClass { - fn la2<'a, A: 'a, B: 'a, C: 'a, F: 'a + FnOnce(A, B) -> C>( - f: F, + fn la2<'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> { @@ -63,9 +63,9 @@ impl Applicative for FutureClass { } impl Monad for FutureClass { - fn bind<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> Self::F<'a, B>>( + fn bind<'a, A: 'a, B: 'a>( fa: Self::F<'a, A>, - f: F, + f: impl 'a + FnOnce(A) -> Self::F<'a, B>, ) -> Self::F<'a, B> { Box::pin(async { f(fa.await).await }) } diff --git a/src/func/classes/lazyclass.rs b/src/func/classes/lazyclass.rs index f1ed914..124e1d0 100644 --- a/src/func/classes/lazyclass.rs +++ b/src/func/classes/lazyclass.rs @@ -7,7 +7,7 @@ impl WeakFunctor for LazyClass { } impl Functor for LazyClass { - fn fmap<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>(f: F, fa: Self::F<'a, A>) -> Self::F<'a, B> { + fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B> { Box::new(|| f(fa())) } @@ -23,8 +23,8 @@ impl Functor for LazyClass { } impl ApplicativeSeq for LazyClass { - fn seq<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>( - ff: Self::F<'a, F>, + fn seq<'a, A: 'a, B: 'a>( + ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> { Box::new(|| ff()(fa())) @@ -32,8 +32,8 @@ impl ApplicativeSeq for LazyClass { } impl ApplicativeLA2 for LazyClass { - fn la2<'a, A: 'a, B: 'a, C: 'a, F: 'a + FnOnce(A, B) -> C>( - f: F, + fn la2<'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> { @@ -58,9 +58,9 @@ impl Applicative for LazyClass { } impl Monad for LazyClass { - fn bind<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> Self::F<'a, B>>( + fn bind<'a, A: 'a, B: 'a>( fa: Self::F<'a, A>, - f: F, + f: impl 'a + FnOnce(A) -> Self::F<'a, B>, ) -> Self::F<'a, B> { Box::new(|| f(fa())()) } diff --git a/src/func/classes/optionclass.rs b/src/func/classes/optionclass.rs index c246b70..2e1988c 100644 --- a/src/func/classes/optionclass.rs +++ b/src/func/classes/optionclass.rs @@ -7,7 +7,7 @@ impl WeakFunctor for OptionClass { } impl Functor for OptionClass { - fn fmap<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>(f: F, fa: Self::F<'a, A>) -> Self::F<'a, B> { + fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B> { fa.map(f) } @@ -17,8 +17,8 @@ impl Functor for OptionClass { } impl ApplicativeSeq for OptionClass { - fn seq<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>( - ff: Self::F<'a, F>, + fn seq<'a, A: 'a, B: 'a>( + ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> { Self::pure(ff?(fa?)) @@ -26,8 +26,8 @@ impl ApplicativeSeq for OptionClass { } impl ApplicativeLA2 for OptionClass { - fn la2<'a, A: 'a, B: 'a, C: 'a, F: 'a + FnOnce(A, B) -> C>( - f: F, + fn la2<'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> { @@ -52,9 +52,9 @@ impl Applicative for OptionClass { } impl Monad for OptionClass { - fn bind<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> Self::F<'a, B>>( + fn bind<'a, A: 'a, B: 'a>( fa: Self::F<'a, A>, - f: F, + f: impl 'a + FnOnce(A) -> Self::F<'a, B>, ) -> Self::F<'a, B> { f(fa?) } diff --git a/src/func/classes/resultclass.rs b/src/func/classes/resultclass.rs index e59715f..1fcf4e3 100644 --- a/src/func/classes/resultclass.rs +++ b/src/func/classes/resultclass.rs @@ -7,7 +7,7 @@ impl WeakFunctor for ResultClass { } impl Functor for ResultClass { - fn fmap<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>(f: F, fa: Self::F<'a, A>) -> Self::F<'a, B> { + fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B> { fa.map(f) } @@ -17,8 +17,8 @@ impl Functor for ResultClass { } impl ApplicativeSeq for ResultClass { - fn seq<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>( - ff: Self::F<'a, F>, + fn seq<'a, A: 'a, B: 'a>( + ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> { Self::pure(ff?(fa?)) @@ -26,8 +26,8 @@ impl ApplicativeSeq for ResultClass { } impl ApplicativeLA2 for ResultClass { - fn la2<'a, A: 'a, B: 'a, C: 'a, F: 'a + FnOnce(A, B) -> C>( - f: F, + fn la2<'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> { @@ -52,9 +52,9 @@ impl Applicative for ResultClass { } impl Monad for ResultClass { - fn bind<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> Self::F<'a, B>>( + fn bind<'a, A: 'a, B: 'a>( fa: Self::F<'a, A>, - f: F, + f: impl 'a + FnOnce(A) -> Self::F<'a, B>, ) -> Self::F<'a, B> { f(fa?) } diff --git a/src/func/classes/soloclass.rs b/src/func/classes/soloclass.rs index f04d3e0..95776a9 100644 --- a/src/func/classes/soloclass.rs +++ b/src/func/classes/soloclass.rs @@ -7,7 +7,7 @@ impl WeakFunctor for SoloClass { } impl Functor for SoloClass { - fn fmap<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>(f: F, fa: Self::F<'a, A>) -> Self::F<'a, B> { + fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B> { f(fa) } @@ -22,8 +22,8 @@ impl Functor for SoloClass { } impl ApplicativeSeq for SoloClass { - fn seq<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> B>( - ff: Self::F<'a, F>, + fn seq<'a, A: 'a, B: 'a>( + ff: Self::F<'a, impl 'a + FnOnce(A) -> B>, fa: Self::F<'a, A>, ) -> Self::F<'a, B> { ff(fa) @@ -31,8 +31,8 @@ impl ApplicativeSeq for SoloClass { } impl ApplicativeLA2 for SoloClass { - fn la2<'a, A: 'a, B: 'a, C: 'a, F: 'a + FnOnce(A, B) -> C>( - f: F, + fn la2<'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> { @@ -57,15 +57,14 @@ impl Applicative for SoloClass { } impl Monad for SoloClass { - fn bind<'a, A: 'a, B: 'a, F: 'a + FnOnce(A) -> Self::F<'a, B>>( + fn bind<'a, A: 'a, B: 'a>( fa: Self::F<'a, A>, - f: F, + f: impl 'a + FnOnce(A) -> Self::F<'a, B>, ) -> Self::F<'a, B> { f(fa) } - fn join<'a, A: 'a>(ffa: Self::F<'a, Self::F<'a, A>>) -> Self::F<'a, A> - { + fn join<'a, A: 'a>(ffa: Self::F<'a, Self::F<'a, A>>) -> Self::F<'a, A> { ffa } } diff --git a/src/func/clone_func.rs b/src/func/clone_func.rs index 31bc5fb..56a374f 100644 --- a/src/func/clone_func.rs +++ b/src/func/clone_func.rs @@ -3,8 +3,8 @@ pub trait CloneWeakFunctor { } pub trait CloneFunctor: CloneWeakFunctor { - fn clone_fmap<'a, A: 'a + Clone, B: 'a + Clone, F: 'a + Fn(A) -> B>( - f: F, + fn clone_fmap<'a, A: 'a + Clone, B: 'a + Clone>( + f: impl 'a + Fn(A) -> B, fa: Self::ClF<'a, A>, ) -> Self::ClF<'a, B>;