diff --git a/src/flow/binary.rs b/src/flow/binary.rs index 176173d..9c8918e 100644 --- a/src/flow/binary.rs +++ b/src/flow/binary.rs @@ -90,13 +90,13 @@ pub trait BinaryTreesMutable<'a>: BinaryTrees<'a> { match self.comparator().pick_smaller(&key, &k) { Comparison::L => { ::bind(self.clone().split_key(tl, key), move |(tll, tlr)| { - ::fmap(|t| (tll, t), self.join_key_tree(tlr, k, tr)) + ::fmap(self.join_key_tree(tlr, k, tr), |t| (tll, t)) }) } Comparison::E => ::pure((tl, tr)), Comparison::R => { ::bind(self.clone().split_key(tr, key), move |(trl, trr)| { - ::fmap(|t| (t, trr), self.join_key_tree(tl, k, trl)) + ::fmap(self.join_key_tree(tl, k, trl), |t| (t, trr)) }) } } diff --git a/src/flow/speculative.rs b/src/flow/speculative.rs index 025c15f..37e42dc 100644 --- a/src/flow/speculative.rs +++ b/src/flow/speculative.rs @@ -10,7 +10,7 @@ trait SpeculativeFailImpl<'a>: MonadFailAny<'a> { a: A, wb: WrapE<'a, B, E0, Self>, ) -> WrapE<'a, (A, B), Result, Self> { - Self::map_err( as Functor>::fmap(|b| (a, b), wb), Ok) + Self::map_err( as Functor>::fmap(wb, |b| (a, b)), Ok) } fn _speculative_ra_wb( @@ -55,7 +55,6 @@ trait SpeculativeFailImpl<'a>: MonadFailAny<'a> { ) -> WrapE<'a, (A, B), Result, Self> { Self::stuff(<::T as Monad>::join( <::T as Functor>::fmap( - Self::unstuff, Self::T::select_map(Self::unstuff(wa), frwb, |selected| match selected { Selected::A(ra, frwb) => Self::_speculative_ra_frwb(ra, frwb), Selected::B(fra, Ok(wb)) => { @@ -63,6 +62,7 @@ trait SpeculativeFailImpl<'a>: MonadFailAny<'a> { } Selected::B(_, Err(e1)) => Self::fail(Err(e1)), }), + Self::unstuff, ), )) } @@ -72,8 +72,8 @@ trait SpeculativeFailImpl<'a>: MonadFailAny<'a> { wb: WrapE<'a, B, E0, Self>, ) -> WrapE<'a, (A, B), Result, Self> { > as Functor>::fmap( - |(b, a)| (a, b), Self::_speculative_wa_frwb(wb, frwa), + |(b, a)| (a, b), ) } @@ -82,7 +82,6 @@ trait SpeculativeFailImpl<'a>: MonadFailAny<'a> { wwb: Wwa<'a, B, E0, E1, Self>, ) -> WrapE<'a, (A, B), Result, Self> { Self::stuff(::join(::fmap( - Self::unstuff, Self::T::select_map( Self::unstuff(wwa), Self::unstuff(wwb), @@ -93,6 +92,7 @@ trait SpeculativeFailImpl<'a>: MonadFailAny<'a> { Selected::B(_, Err(e1)) => Self::fail(Err(e1)), }, ), + Self::unstuff, ))) } } diff --git a/src/flow/traversible/unbalanced.rs b/src/flow/traversible/unbalanced.rs index 24ebcfa..a68e37c 100644 --- a/src/flow/traversible/unbalanced.rs +++ b/src/flow/traversible/unbalanced.rs @@ -94,10 +94,9 @@ impl<'a, T: Monad<'a>, A: 'a> TraversibleBinaryReference<'a, T, A, UnbalancedDat for UnbalancedReference<'a, T, A> { fn resolve(&self) -> Wrap<'a, Rc>, T> { - ::fmap( - |rc| rc as Rc>, - self.0(), - ) + ::fmap(self.0(), |rc| { + rc as Rc> + }) } fn data(&self) -> UnbalancedData { diff --git a/src/func.rs b/src/func.rs index e2cb46c..95d2d96 100644 --- a/src/func.rs +++ b/src/func.rs @@ -57,11 +57,11 @@ pub trait Functor<'a>: WeakFunctor<'a> { /// Equivalent or Haskell's `fmap`. /// Due to Rust limitations, it's not a `function->function` conversion. /// For that see [`derivations::fmap`]. - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F; + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F; /// Equivalent of Haskell's `$>`/`<$`. fn replace(fa: Self::F, b: B) -> Self::F { - Self::fmap(|_| b, fa) + Self::fmap(fa, |_| b) } /// Equivalent of Haskell's `void`. diff --git a/src/func/applicative_select.rs b/src/func/applicative_select.rs index 31367fb..d1bacaf 100644 --- a/src/func/applicative_select.rs +++ b/src/func/applicative_select.rs @@ -11,7 +11,7 @@ pub type SelectedWrapped<'a, A, B, T> = Wrap<'a, Selected<'a, A, B, T>, T>; /// Part of [`Applicative`] responsible for choosing the first value. pub trait ApplicativeSelect<'a>: Functor<'a> { fn select(fa: Self::F, fb: Self::F) -> SelectedWrapped<'a, A, B, Self> { - Self::fmap(|a| Selected::A(a, fb), fa) + Self::fmap(fa, |a| Selected::A(a, fb)) } } @@ -22,7 +22,7 @@ pub trait ApplicativeSelectExt<'a>: ApplicativeSelect<'a> { fb: Self::F, f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C, ) -> Self::F { - Self::fmap(f, Self::select(fa, fb)) + Self::fmap(Self::select(fa, fb), f) } } diff --git a/src/func/controlflow.rs b/src/func/controlflow.rs index 8acff0a..f00a042 100644 --- a/src/func/controlflow.rs +++ b/src/func/controlflow.rs @@ -11,7 +11,7 @@ impl WeakFunctorAny for ControlFlowInstance { } impl<'a, C: 'a> Functor<'a> for ControlFlowInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { match fa { ControlFlow::Continue(c) => ControlFlow::Continue(c), ControlFlow::Break(a) => ControlFlow::Break(f(a)), @@ -43,15 +43,12 @@ impl<'a, T: ?Sized + Functor<'a>, A: 'a, B: 'a, F: 'a + FnMut(A) -> T::F IterativeWrapped<'a, Self> { let fstate = self.1(self.0); - T::fmap( - move |state| match state { - ControlFlow::Continue(next_a) => { - ControlFlow::Continue(BindableMut::new(next_a, self.1)) - } - ControlFlow::Break(b) => ControlFlow::Break(b), - }, - fstate, - ) + T::fmap(fstate, move |state| match state { + ControlFlow::Continue(next_a) => { + ControlFlow::Continue(BindableMut::new(next_a, self.1)) + } + ControlFlow::Break(b) => ControlFlow::Break(b), + }) } } diff --git a/src/func/derivations.rs b/src/func/derivations.rs index f29425f..d15bdfb 100644 --- a/src/func/derivations.rs +++ b/src/func/derivations.rs @@ -6,7 +6,7 @@ use super::*; pub fn fmap<'a, T: Functor<'a>, A: 'a, B: 'a>( f: impl 'a + FnOnce(A) -> B, ) -> impl FnOnce(Wrap<'a, A, T>) -> Wrap<'a, B, T> { - move |fa| T::fmap(f, fa) + move |fa| T::fmap(fa, f) } /// Equivalent of Haskell's `fmap`. `function-function` equivalent of [Monad::bind]. @@ -22,7 +22,7 @@ pub trait ApplicativeLA2ViaSeq<'a>: ApplicativeSeq<'a> { fa: Self::F, fb: Self::F, ) -> Self::F { - Self::seq(Self::fmap(|a| |b| f(a, b), fa), fb) + Self::seq(Self::fmap(fa, |a| |b| f(a, b)), fb) } } diff --git a/src/func/instances/composition.rs b/src/func/instances/composition.rs index b088d43..012bca6 100644 --- a/src/func/instances/composition.rs +++ b/src/func/instances/composition.rs @@ -15,16 +15,16 @@ impl<'a, U: WeakFunctor<'a>, V: WeakFunctor<'a>> WeakFunctor<'a> for Composition } impl<'a, U: Functor<'a>, V: Functor<'a>> Functor<'a> for CompositionInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { - U::fmap(|ua| V::fmap(f, ua), fa) + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { + U::fmap(fa, |ua| V::fmap(ua, f)) } fn replace(fa: Self::F, b: B) -> Self::F { - U::fmap(|ua| V::replace(ua, b), fa) + U::fmap(fa, |ua| V::replace(ua, b)) } fn void(fa: Self::F) -> Self::F<()> { - U::fmap(|ua| V::void(ua), fa) + U::fmap(fa, |ua| V::void(ua)) } } @@ -59,7 +59,7 @@ impl<'a, U: ApplicativeTuple<'a>, V: ApplicativeTuple<'a>> ApplicativeTuple<'a> for CompositionInstance { fn tuple(fab: (Self::F, Self::F)) -> Self::F<(A, B)> { - U::fmap(V::tuple, U::tuple(fab)) + U::fmap(U::tuple(fab), V::tuple) } } @@ -68,13 +68,10 @@ impl<'a, U: ApplicativeSelect<'a>, V: Functor<'a>> ApplicativeSelect<'a> for CompositionInstance { fn select(fa: Self::F, fb: Self::F) -> SelectedWrapped<'a, A, B, Self> { - U::fmap( - |selected| match selected { - Selected::A(ua, fb) => V::fmap(|a| Selected::A(a, fb), ua), - Selected::B(fa, ub) => V::fmap(|b| Selected::B(fa, b), ub), - }, - U::select(fa, fb), - ) + U::fmap(U::select(fa, fb), |selected| match selected { + Selected::A(ua, fb) => V::fmap(ua, |a| Selected::A(a, fb)), + Selected::B(fa, ub) => V::fmap(ub, |b| Selected::B(fa, b)), + }) } } @@ -90,7 +87,7 @@ impl<'a, U: Applicative<'a>, V: Applicative<'a>> Applicative<'a> for Composition impl<'a, U: Monad<'a>, V: Monad<'a> + LocalFunctor<'a>> Monad<'a> for CompositionInstance { fn bind(fa: Self::F, f: impl 'a + FnOnce(A) -> Self::F) -> Self::F { - U::bind(fa, |ua| U::fmap(V::join, V::stuff::<_, U>(V::fmap(f, ua)))) + U::bind(fa, |ua| U::fmap(V::stuff::<_, U>(V::fmap(ua, f)), V::join)) } fn iterate(f: impl Iterative<'a, T = Self, B = B>) -> Self::F { @@ -105,7 +102,7 @@ impl<'a, U: Monad<'a>, V: Monad<'a> + LocalFunctor<'a>> Monad<'a> for Compositio /// U V A /// ``` fn join(ffa: Self::F>) -> Self::F { - U::join(U::fmap(|ufa| U::fmap(V::join, V::stuff::<_, U>(ufa)), ffa)) + U::join(U::fmap(ffa, |ufa| U::fmap(V::stuff::<_, U>(ufa), V::join))) } } @@ -123,13 +120,10 @@ impl< fn next(self) -> IterativeWrapped<'a, Self> { let fstate = self.0.next(); - U::fmap( - |ustate| match V::unstuff(ustate) { - ControlFlow::Continue(next_f) => ControlFlow::Continue(Self(next_f)), - ControlFlow::Break(b) => ControlFlow::Break(b), - }, - fstate, - ) + U::fmap(fstate, |ustate| match V::unstuff(ustate) { + ControlFlow::Continue(next_f) => ControlFlow::Continue(Self(next_f)), + ControlFlow::Break(b) => ControlFlow::Break(b), + }) } } @@ -146,11 +140,11 @@ impl<'a, U: LocalFunctor<'a> + Functor<'a>, V: LocalFunctor<'a>> LocalFunctor<'a for CompositionInstance { fn unstuff(state: Self::F>) -> ControlFlow, A> { - U::unstuff(U::fmap(V::unstuff, state)) + U::unstuff(U::fmap(state, V::unstuff)) } fn stuff>(fa: Self::F>) -> T::F> { - U::stuff::<_, T>(U::fmap(V::stuff::<_, T>, fa)) + U::stuff::<_, T>(U::fmap(fa, V::stuff::<_, T>)) } } @@ -160,10 +154,10 @@ impl<'a, U: SharedFunctor<'a> + Functor<'a>, V: SharedFunctor<'a>> SharedFunctor type Shared = U::Shared>; fn share(fa: Self::F) -> Self::Shared { - U::share(U::fmap(V::share, fa)) + U::share(U::fmap(fa, V::share)) } fn unshare(sa: Self::Shared) -> Self::F { - U::fmap(V::unshare, U::unshare(sa)) + U::fmap(U::unshare(sa), V::unshare) } } diff --git a/src/func/instances/effect.rs b/src/func/instances/effect.rs index 3ec6c03..327b56c 100644 --- a/src/func/instances/effect.rs +++ b/src/func/instances/effect.rs @@ -46,7 +46,7 @@ impl WeakFunctorAny for EffectInstance { } impl<'a, E: 'a> Functor<'a> for EffectInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { WithEffect { value: f(fa.value), effect: fa.effect, @@ -146,12 +146,9 @@ impl<'a, E: 'a + Effect> Monad<'a> for EffectInstance { impl<'a, E: 'a> LocalFunctor<'a> for EffectInstance { fn stuff>(fa: Self::F>) -> T::F> { - T::fmap( - |a| WithEffect { - value: a, - effect: fa.effect, - }, - fa.value, - ) + T::fmap(fa.value, |a| WithEffect { + value: a, + effect: fa.effect, + }) } } diff --git a/src/func/instances/future.rs b/src/func/instances/future.rs index 359188e..039ac7f 100644 --- a/src/func/instances/future.rs +++ b/src/func/instances/future.rs @@ -23,7 +23,7 @@ impl WeakFunctorAny for FutureInstance { } impl<'a> Functor<'a> for FutureInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { Box::pin(async { f(fa.await) }) } diff --git a/src/func/instances/lazy.rs b/src/func/instances/lazy.rs index 9c5952c..9e7f0d3 100644 --- a/src/func/instances/lazy.rs +++ b/src/func/instances/lazy.rs @@ -20,7 +20,7 @@ impl WeakFunctorAny for LazyInstance { } impl<'a> Functor<'a> for LazyInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { Box::new(|| f(fa())) } diff --git a/src/func/instances/option.rs b/src/func/instances/option.rs index 3d72077..1606382 100644 --- a/src/func/instances/option.rs +++ b/src/func/instances/option.rs @@ -21,7 +21,7 @@ impl WeakFunctorAny for OptionInstance { } impl<'a> Functor<'a> for OptionInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { fa.map(f) } @@ -108,7 +108,7 @@ impl<'a> LocalFunctor<'a> for OptionInstance { fn stuff>(fa: Self::F>) -> T::F> { match fa { - Some(ua) => T::fmap(Some, ua), + Some(ua) => T::fmap(ua, Some), None => T::pure(None), } } @@ -145,12 +145,12 @@ mod option_tests { #[test] fn fmap_f_none_is_none() { - assert_eq!(T::fmap(|_: ()| (), None), None); + assert_eq!(T::fmap(None, |_: ()| ()), None); } #[test] fn fmap_f_some_a_is_some_f_a() { - assert_eq!(T::fmap(|x| x * x, Some(2)), Some(4)); + assert_eq!(T::fmap(Some(2), |x| x * x), Some(4)); } #[test] diff --git a/src/func/instances/overload.rs b/src/func/instances/overload.rs index 7e28693..b403436 100644 --- a/src/func/instances/overload.rs +++ b/src/func/instances/overload.rs @@ -25,8 +25,8 @@ impl<'a, T: WeakFunctor<'a>, O: 'a + DeriveWeakFunctor> WeakFunctor<'a> for Over } impl<'a, T: Functor<'a>, O: 'a + DeriveFunctor> Functor<'a> for OverloadInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { - T::fmap(f, fa) + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { + T::fmap(fa, f) } fn replace(fa: Self::F, b: B) -> Self::F { @@ -109,13 +109,10 @@ impl<'a, T: Monad<'a>, O: 'a + DeriveMonad, F: Iterative<'a, T = OverloadInstanc type T = T; fn next(self) -> IterativeWrapped<'a, Self> { - T::fmap( - |state| match state { - ControlFlow::Continue(next_f) => ControlFlow::Continue(Self::new(next_f)), - ControlFlow::Break(b) => ControlFlow::Break(b), - }, - self.0.next(), - ) + T::fmap(self.0.next(), |state| match state { + ControlFlow::Continue(next_f) => ControlFlow::Continue(Self::new(next_f)), + ControlFlow::Break(b) => ControlFlow::Break(b), + }) } } @@ -152,7 +149,7 @@ impl<'a, Ex: 'a, Fallible: MonadFailAny<'a>> MonadFailAny<'a> for DeriveFailAny< type T = Fallible::W; fn unstuff(wa: WrapE<'a, A, E, Self>) -> Wrap<'a, Result, Self::T> { - Fallible::bind_err( as Functor>::fmap(Ok, wa), |err| match err { + Fallible::bind_err( as Functor>::fmap(wa, Ok), |err| match err { Ok(e) => Fallible::pure(Err(e)), Err(ex) => Fallible::fail(ex), }) diff --git a/src/func/instances/result.rs b/src/func/instances/result.rs index dd2a721..4d0ef84 100644 --- a/src/func/instances/result.rs +++ b/src/func/instances/result.rs @@ -21,7 +21,7 @@ impl WeakFunctorAny for ResultInstance { } impl<'a, E: 'a> Functor<'a> for ResultInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { fa.map(f) } @@ -108,7 +108,7 @@ impl<'a, E: 'a> LocalFunctor<'a> for ResultInstance { fn stuff>(fa: Self::F>) -> T::F> { match fa { - Ok(ua) => T::fmap(Ok, ua), + Ok(ua) => T::fmap(ua, Ok), Err(e) => T::pure(Err(e)), } } @@ -199,7 +199,7 @@ impl<'a, T: Monad<'a>> MonadFailAny<'a> for ResultFailOver { wa: WrapE<'a, A, E0, Self>, f: impl 'a + FnOnce(E0) -> E1, ) -> WrapE<'a, A, E1, Self> { - T::fmap(|a| a.map_err(f), wa) + T::fmap(wa, |a| a.map_err(f)) } fn bind_err( @@ -222,6 +222,6 @@ impl<'a, T: Monad<'a>> MonadFailAny<'a> for ResultFailOver { fn rotate_out( wa: WrapE<'a, Result, E0, Self>, ) -> WrapE<'a, A, Result, Self> { - T::fmap(::rotate_out, wa) + T::fmap(wa, ::rotate_out) } } diff --git a/src/func/instances/solo.rs b/src/func/instances/solo.rs index 82369d9..3cf8677 100644 --- a/src/func/instances/solo.rs +++ b/src/func/instances/solo.rs @@ -16,7 +16,7 @@ impl WeakFunctorAny for SoloInstance { } impl<'a> Functor<'a> for SoloInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { f(fa) } diff --git a/src/func/instances/stackless.rs b/src/func/instances/stackless.rs index 37b4092..325fc94 100644 --- a/src/func/instances/stackless.rs +++ b/src/func/instances/stackless.rs @@ -126,7 +126,7 @@ impl WeakFunctorAny for StacklessInstance { } impl<'a> Functor<'a> for StacklessInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { fa.map(f) } diff --git a/src/func/instances/tryfuture.rs b/src/func/instances/tryfuture.rs index c2333c5..2d45ac4 100644 --- a/src/func/instances/tryfuture.rs +++ b/src/func/instances/tryfuture.rs @@ -22,7 +22,7 @@ impl WeakFunctorAny for TryFutureInstance { } impl<'a, E: 'a> Functor<'a> for TryFutureInstance { - fn fmap(f: impl 'a + FnOnce(A) -> B, fa: Self::F) -> Self::F { + fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { Box::pin(async { Ok(f(fa.await?)) }) } diff --git a/src/func/tests.rs b/src/func/tests.rs index 2f17a31..7a3dd3c 100644 --- a/src/func/tests.rs +++ b/src/func/tests.rs @@ -90,7 +90,7 @@ impl AddAssign for R { pub fn fmap_respects_identity<'a, T: Functor<'a> + Eqr<'a>, A: 'a + Debug + PartialEq>( fa0: impl Fn() -> T::F, ) -> R { - T::eqr("identity: fmap id == id", T::fmap(|a| a, fa0()), fa0()) + T::eqr("identity: fmap id == id", T::fmap(fa0(), |a| a), fa0()) } pub fn fmap_respects_composition< @@ -106,8 +106,8 @@ pub fn fmap_respects_composition< ) -> R { T::eqr( "composition: fmap (f . g) == fmap f . fmap g", - T::fmap(move |a| f(g(a)), fa0()), - T::fmap(f, T::fmap(g, fa0())), + T::fmap(fa0(), move |a| f(g(a))), + T::fmap(T::fmap(fa0(), g), f), ) } @@ -203,7 +203,7 @@ pub fn fmap_can_be_expressed_via_seq< ) -> R { T::eqr( "fmap via seq: fmap f x = pure f <*> x", - T::fmap(f, fa0()), + T::fmap(fa0(), f), T::seq(T::pure(f), fa0()), ) } @@ -289,7 +289,7 @@ pub fn fmap_can_be_expressed_via_bind< ) -> R { T::eqr( "fmap via bind: fmap f xs = xs >>= return . f", - T::fmap(f, fa0()), + T::fmap(fa0(), f), T::bind(fa0(), move |a| T::pure(f(a))), ) } diff --git a/src/rcore/resolver_origin.rs b/src/rcore/resolver_origin.rs index 4b2cfa0..2ab3aeb 100644 --- a/src/rcore/resolver_origin.rs +++ b/src/rcore/resolver_origin.rs @@ -28,17 +28,14 @@ fn _resolve_origin<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>( origin: Rc>, ) -> Resolution<'a, Ctx, A> { let resolution = origin.r_resolver.clone().resolve(origin.r_address); - Ctx::T::fmap( - move |resolved| { - let (src, resolver) = resolved.map_err(ResolutionError::Lookup)?; - let mentionable = origin - .r_factory - .parse_slice(&src, resolver) - .map_err(ResolutionError::Parse)?; - Ok(Rc::new(mentionable)) - }, - resolution, - ) + Ctx::T::fmap(resolution, move |resolved| { + let (src, resolver) = resolved.map_err(ResolutionError::Lookup)?; + let mentionable = origin + .r_factory + .parse_slice(&src, resolver) + .map_err(ResolutionError::Parse)?; + Ok(Rc::new(mentionable)) + }) } impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Origin<'a, Ctx> for ResolverOrigin<'a, Ctx, F> { diff --git a/src/rstd/cast.rs b/src/rstd/cast.rs index 8758070..c40fcac 100644 --- a/src/rstd/cast.rs +++ b/src/rstd/cast.rs @@ -143,7 +143,7 @@ where Ok(point) => point, Err(cast_error) => return cast_error.pure::(), }; - Ctx::T::fmap(cast_resolved, point.resolve()) + Ctx::T::fmap(point.resolve(), cast_resolved) } } @@ -179,6 +179,7 @@ where Ctx::LookupError: From>, { Ctx::T::fmap( + typeless_origin.clone().resolve(), move |resolved| match resolved { Ok(typeless_mentionable) => match typeless_mentionable.cast(factory) { Ok(mentionable) => Ok(Rc::new(mentionable)), @@ -189,7 +190,6 @@ where ResolutionError::Parse(parse_error) => CastError::Typeless(parse_error).into(), })), }, - typeless_origin.clone().resolve(), ) } diff --git a/src/rstd/collections/avl/binary.rs b/src/rstd/collections/avl/binary.rs index cb44ffe..03e4542 100644 --- a/src/rstd/collections/avl/binary.rs +++ b/src/rstd/collections/avl/binary.rs @@ -76,15 +76,12 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlTree<'a, Ctx, A> { impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlReference<'a, Ctx, A> { pub fn resolve(&self) -> Resolution<'a, Ctx, AvlNode<'a, Ctx, A>> { let parent_height = self.parent_height; - ::fmap( - move |resolution| { - let node = resolution?; - node.matches_height(parent_height) - .map_err(ResolutionError::Parse)?; - Ok(node) - }, - self.node.resolve(), - ) + ::fmap(self.node.resolve(), move |resolution| { + let node = resolution?; + node.matches_height(parent_height) + .map_err(ResolutionError::Parse)?; + Ok(node) + }) } } diff --git a/src/rstd/collections/avl/bounds.rs b/src/rstd/collections/avl/bounds.rs index 39528dc..96ddb88 100644 --- a/src/rstd/collections/avl/bounds.rs +++ b/src/rstd/collections/avl/bounds.rs @@ -248,35 +248,32 @@ pub type BrKeySplit<'a, Ctx, A> = BoundResolution<'a, Ctx, A, BoundKeySplit<'a, impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> BoundReference<'a, Ctx, A> { pub fn resolve(&self, comparator: Rc>) -> BrNode<'a, Ctx, A> { let bounds = self.bounds.clone(); - ::fmap( - move |resolution| { - let node = resolution - .map_err(|err| match err { - ResolutionError::Lookup(lookup) => ResolutionError::Lookup(lookup), - ResolutionError::Parse(avl) => ResolutionError::Parse(BoundError::Avl(avl)), - })? - .as_ref() - .clone(); - let (bl, br) = bounds - .clone() - .split(&node.key, comparator.as_ref()) - .map_err(BoundError::Bounds) - .map_err(ResolutionError::Parse)?; - Ok(BoundNode { - l: BoundTree { - tree: node.l, - bounds: bl, - }, - r: BoundTree { - tree: node.r, - bounds: br, - }, - key: node.key, - bounds, - }) - }, - self.reference.resolve(), - ) + ::fmap(self.reference.resolve(), move |resolution| { + let node = resolution + .map_err(|err| match err { + ResolutionError::Lookup(lookup) => ResolutionError::Lookup(lookup), + ResolutionError::Parse(avl) => ResolutionError::Parse(BoundError::Avl(avl)), + })? + .as_ref() + .clone(); + let (bl, br) = bounds + .clone() + .split(&node.key, comparator.as_ref()) + .map_err(BoundError::Bounds) + .map_err(ResolutionError::Parse)?; + Ok(BoundNode { + l: BoundTree { + tree: node.l, + bounds: bl, + }, + r: BoundTree { + tree: node.r, + bounds: br, + }, + key: node.key, + bounds, + }) + }) } pub fn equal(lhs: &Self, rhs: &Self, comparator: &impl Comparator) -> bool { diff --git a/src/rstd/collections/rbtree/subset.rs b/src/rstd/collections/rbtree/subset.rs index effcc77..eea0b20 100644 --- a/src/rstd/collections/rbtree/subset.rs +++ b/src/rstd/collections/rbtree/subset.rs @@ -94,10 +94,9 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Rc, A, RefData>>, SubsetMonad<'a, Ctx, A>, > { - as Functor>::fmap( - |resolved| resolved as Rc>, - Ctx::stuff(self.resolve()), - ) + as Functor>::fmap(Ctx::stuff(self.resolve()), |resolved| { + resolved as Rc> + }) } fn data(&self) -> RefData { @@ -116,10 +115,9 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Rc, A, RefData>>, SubsetMonad<'a, Ctx, A>, > { - as Functor>::fmap( - |resolved| resolved as Rc>, - Ctx::stuff(self.resolve()), - ) + as Functor>::fmap(Ctx::stuff(self.resolve()), |resolved| { + resolved as Rc> + }) } fn data(&self) -> RefData { @@ -138,10 +136,9 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Rc, A, RefData>>, SubsetMonad<'a, Ctx, A>, > { - as Functor>::fmap( - |resolved| resolved as Rc>, - Ctx::stuff(self.resolve()), - ) + as Functor>::fmap(Ctx::stuff(self.resolve()), |resolved| { + resolved as Rc> + }) } fn data(&self) -> RefData { diff --git a/src/rstd/collections/stack.rs b/src/rstd/collections/stack.rs index dc31d11..129ee98 100644 --- a/src/rstd/collections/stack.rs +++ b/src/rstd/collections/stack.rs @@ -157,19 +157,16 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> ExtStack<'a, Ctx, A> for Sta fn vec(self) -> StackVecWrapped<'a, Ctx, A> { Ctx::T::iterate_mut((vec![], self), |(mut vec, stack)| match stack { Nullable::Null(_) => Ctx::T::pure(ControlFlow::Break(Ok(vec))), - Nullable::NotNull(point) => Ctx::T::fmap( - |resolved| { - let node = match resolved { - Ok(node) => node, - Err(error) => { - return ControlFlow::Break(Err(error)); - } - }; - vec.push(node.element.clone()); - ControlFlow::Continue((vec, node.rest.clone())) - }, - point.resolve(), - ), + Nullable::NotNull(point) => Ctx::T::fmap(point.resolve(), |resolved| { + let node = match resolved { + Ok(node) => node, + Err(error) => { + return ControlFlow::Break(Err(error)); + } + }; + vec.push(node.element.clone()); + ControlFlow::Continue((vec, node.rest.clone())) + }), }) } } diff --git a/src/rstd/tracing/traceable.rs b/src/rstd/tracing/traceable.rs index 3156f3c..44ceb02 100644 --- a/src/rstd/tracing/traceable.rs +++ b/src/rstd/tracing/traceable.rs @@ -14,14 +14,11 @@ impl<'a, Ctx: Context<'a, T = TracedInstance>> TracedResolver<'a, Ctx> { impl<'a, Ctx: Context<'a, T = TracedInstance>> Resolver<'a, Ctx> for TracedResolver<'a, Ctx> { fn resolve(self: Rc, address: Address) -> HashResolution<'a, Ctx> { - TracedInstance::fmap( - |resolved| { - let (src, resolver) = resolved?; - let delayed: Rc> = Rc::new(TracedResolver { resolver }); - Ok((src, delayed)) - }, - self.resolver.clone().resolve(address), - ) + TracedInstance::fmap(self.resolver.clone().resolve(address), |resolved| { + let (src, resolver) = resolved?; + let delayed: Rc> = Rc::new(TracedResolver { resolver }); + Ok((src, delayed)) + }) .after_resolution() } } diff --git a/src/rstd/wrapped_origin.rs b/src/rstd/wrapped_origin.rs index a7eb324..8bfe660 100644 --- a/src/rstd/wrapped_origin.rs +++ b/src/rstd/wrapped_origin.rs @@ -42,18 +42,13 @@ fn map_resolve<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>, B: Mentionable<'a, map_ok: impl 'a + Fn(Rc) -> B, map_err: impl 'a + Fn(ParseError<'a, Ctx, A::Fctr>) -> ParseError<'a, Ctx, B::Fctr>, ) -> Resolution<'a, Ctx, B> { - Ctx::T::fmap( - move |resolved| match resolved { - Ok(mentionable) => Ok(Rc::new(map_ok(mentionable))), - Err(ResolutionError::Parse(parse_error)) => { - Err(ResolutionError::Parse(map_err(parse_error))) - } - Err(ResolutionError::Lookup(lookup_error)) => { - Err(ResolutionError::Lookup(lookup_error)) - } - }, - resolve(), - ) + Ctx::T::fmap(resolve(), move |resolved| match resolved { + Ok(mentionable) => Ok(Rc::new(map_ok(mentionable))), + Err(ResolutionError::Parse(parse_error)) => { + Err(ResolutionError::Parse(map_err(parse_error))) + } + Err(ResolutionError::Lookup(lookup_error)) => Err(ResolutionError::Lookup(lookup_error)), + }) } struct WrappedOrigin<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> { diff --git a/src/testing/counted.rs b/src/testing/counted.rs index af3e7ab..13a833b 100644 --- a/src/testing/counted.rs +++ b/src/testing/counted.rs @@ -67,15 +67,12 @@ impl<'a> CountedResolver<'a> { impl<'a> Resolver<'a, TestContextCounted> for CountedResolver<'a> { fn resolve(self: Rc, address: Address) -> HashResolution<'a, TestContextCounted> { - CountedInstance::fmap( - |resolved| { - let (src, resolver) = resolved?; - let delayed: Rc> = - Rc::new(CountedResolver { resolver }); - Ok((src, delayed)) - }, - self.resolver.clone().resolve(address), - ) + CountedInstance::fmap(self.resolver.clone().resolve(address), |resolved| { + let (src, resolver) = resolved?; + let delayed: Rc> = + Rc::new(CountedResolver { resolver }); + Ok((src, delayed)) + }) .add(1) } } diff --git a/src/testing/inject.rs b/src/testing/inject.rs index addbda9..1cdbcee 100644 --- a/src/testing/inject.rs +++ b/src/testing/inject.rs @@ -16,6 +16,7 @@ impl<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> Resolver<'a, Ctx> for InjectedRes fn resolve(self: Rc, address: crate::rcore::Address) -> HashResolution<'a, Ctx> { let inject = self.inject.clone(); ::fmap( + self.resolver.clone().resolve(address), |resolved| match resolved { Ok((source, resolver)) => Ok(( source, @@ -23,7 +24,6 @@ impl<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> Resolver<'a, Ctx> for InjectedRes )), Err(e) => Err(e), }, - self.resolver.clone().resolve(address), ) } }