From a935ba68f50937e39cdbeae4bb319be19d39e490 Mon Sep 17 00:00:00 2001 From: timofey Date: Thu, 25 May 2023 13:46:56 +0000 Subject: [PATCH] more type aliases --- src/flow/binary.rs | 2 +- src/flow/traversible.rs | 2 +- src/flow/traversible/unbalanced.rs | 6 +- src/func.rs | 46 ++++++------ src/func/applicative_select.rs | 2 +- src/func/controlflow.rs | 2 +- src/func/instances/composition.rs | 2 +- src/func/instances/overload.rs | 81 ++++++++++---------- src/func/instances/result.rs | 104 ++++++++++++-------------- src/func/instances/tryfuture.rs | 52 ++++++------- src/func/speculative.rs | 32 ++++---- src/rcore.rs | 11 ++- src/rcore/origin.rs | 4 +- src/rcore/resolution.rs | 6 +- src/rcore/resolver_origin.rs | 2 +- src/rstd.rs | 26 ++----- src/rstd/cast.rs | 3 +- src/rstd/collections/pair.rs | 9 +-- src/rstd/collections/rbtree/subset.rs | 12 +-- src/rstd/collections/stack.rs | 2 +- src/rstd/fallible.rs | 2 +- src/rstd/inlining.rs | 2 +- src/rstd/inlining/static_pair.rs | 4 +- src/rstd/wrapped_origin.rs | 28 ++----- 24 files changed, 199 insertions(+), 243 deletions(-) diff --git a/src/flow/binary.rs b/src/flow/binary.rs index 946c59f..a73f972 100644 --- a/src/flow/binary.rs +++ b/src/flow/binary.rs @@ -9,7 +9,7 @@ pub type KeyRc<'a, BT> = Rc<>::Key>; pub type Split<'a, BT> = (TreeRc<'a, BT>, TreeRc<'a, BT>, KeyRc<'a, BT>); -pub type Wrapped<'a, BT, A> = <>::T as WeakFunctor>::F<'a, A>; +pub type Wrapped<'a, BT, A> = Wrap<'a, A, >::T>; pub trait BinaryTrees<'a>: 'a { type Node: 'a; diff --git a/src/flow/traversible.rs b/src/flow/traversible.rs index 5be1623..fb506cf 100644 --- a/src/flow/traversible.rs +++ b/src/flow/traversible.rs @@ -58,7 +58,7 @@ pub trait TraversibleBinaryNode<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>: 'a } pub trait TraversibleBinaryReference<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>: 'a { - fn resolve(&self) -> ::F<'a, Rc>>; + fn resolve(&self) -> Wrap<'a, Rc>, T>; /// This should be enough to compare reference for equality. fn data(&self) -> D; diff --git a/src/flow/traversible/unbalanced.rs b/src/flow/traversible/unbalanced.rs index 691a7d5..aa3a41a 100644 --- a/src/flow/traversible/unbalanced.rs +++ b/src/flow/traversible/unbalanced.rs @@ -23,7 +23,7 @@ pub struct UnbalancedNode<'a, T: 'a + Monad, A: 'a> { key: Rc, } -pub type UnbalancedResolution<'a, T, A> = ::F<'a, Rc>>; +pub type UnbalancedResolution<'a, T, A> = Wrap<'a, Rc>, T>; pub struct UnbalancedReference<'a, T: 'a + Monad, A: 'a>( Box UnbalancedResolution<'a, T, A>>, @@ -89,9 +89,7 @@ impl<'a, T: 'a + Monad, A: 'a> TraversibleBinaryNode<'a, T, A, UnbalancedData> impl<'a, T: 'a + Monad, A: 'a> TraversibleBinaryReference<'a, T, A, UnbalancedData> for UnbalancedReference<'a, T, A> { - fn resolve( - &self, - ) -> ::F<'a, Rc>> { + fn resolve(&self) -> Wrap<'a, Rc>, T> { ::fmap( |rc| rc as Rc>, self.0(), diff --git a/src/func.rs b/src/func.rs index d1292d9..e107078 100644 --- a/src/func.rs +++ b/src/func.rs @@ -39,6 +39,8 @@ pub trait WeakFunctor { Self: 'a; } +pub type Wrap<'a, A, T> = ::F<'a, A>; + /// Rust-specific implementation of [`Functor`], respecting `move` semantics. /// /// Cannot insantiate for e.g. multi-element collections: @@ -276,23 +278,19 @@ pub trait MonadFailAny { /// Associated infallible [`Monad`]. type T: Monad; - fn unstuff<'a, A: 'a, E: 'a>( - wa: as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> + fn unstuff<'a, A: 'a, E: 'a>(wa: WrapE<'a, A, E, Self>) -> Wrap<'a, Result, Self::T> where Self: 'a; - fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, - ) -> as WeakFunctor>::F<'a, A> + fn stuff<'a, A: 'a, E: 'a>(fa: Wrap<'a, Result, Self::T>) -> WrapE<'a, A, E, Self> where Self: 'a; /// Equivalent of [`Result::map_err`]. fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, + wa: WrapE<'a, A, E0, Self>, f: impl 'a + FnOnce(E0) -> E1, - ) -> as WeakFunctor>::F<'a, A> + ) -> WrapE<'a, A, E1, Self> where Self: 'a, { @@ -301,9 +299,9 @@ pub trait MonadFailAny { /// Equivalent of `catch`/`except`. To inject errors on success, see [`MonadFailAny::bind`]. fn bind_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(E0) -> as WeakFunctor>::F<'a, A>, - ) -> as WeakFunctor>::F<'a, A> + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(E0) -> WrapE<'a, A, E1, Self>, + ) -> WrapE<'a, A, E1, Self> where Self: 'a, { @@ -319,9 +317,9 @@ pub trait MonadFailAny { /// Note: Reasonably it is expected to lack fail semantics for the underlying result. /// Therefore the default implementation descends into the non-fail monad [`MonadFailAny::T`]. fn bind<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, B>, - ) -> as WeakFunctor>::F<'a, B> + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(Result) -> WrapE<'a, B, E1, Self>, + ) -> WrapE<'a, B, E1, Self> where Self: 'a, { @@ -334,8 +332,8 @@ pub trait MonadFailAny { /// /// Note: default implementation doesn't depend on [`Monad::join`]. fn join<'a, A: 'a, E0: 'a, E1: 'a>( - wwa: as WeakFunctor>::F<'a, as WeakFunctor>::F<'a, A>>, - ) -> > as WeakFunctor>::F<'a, A> + wwa: WrapE<'a, WrapE<'a, A, E0, Self>, E1, Self>, + ) -> WrapE<'a, A, Result, Self> where Self: 'a, { @@ -347,8 +345,8 @@ pub trait MonadFailAny { /// Lift the error. fn rotate_out<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, Result>, - ) -> > as WeakFunctor>::F<'a, A> + wa: WrapE<'a, Result, E0, Self>, + ) -> WrapE<'a, A, Result, Self> where Self: 'a, { @@ -359,15 +357,17 @@ pub trait MonadFailAny { } } +pub type WrapE<'a, A, E, Fallible> = Wrap<'a, A, ::W>; + pub trait MonadFailAnyExt: MonadFailAny { - fn pure<'a, E: 'a, A: 'a>(a: A) -> as WeakFunctor>::F<'a, A> + fn pure<'a, E: 'a, A: 'a>(a: A) -> WrapE<'a, A, E, Self> where Self: 'a, { as Pure>::pure(a) } - fn fail<'a, E: 'a, A: 'a>(e: E) -> as WeakFunctor>::F<'a, A> + fn fail<'a, E: 'a, A: 'a>(e: E) -> WrapE<'a, A, E, Self> where Self: 'a, { @@ -375,9 +375,9 @@ pub trait MonadFailAnyExt: MonadFailAny { } fn speculative<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( - wwa: as WeakFunctor>::F<'a, as WeakFunctor>::F<'a, A>>, - wwb: as WeakFunctor>::F<'a, as WeakFunctor>::F<'a, B>>, - ) -> > as WeakFunctor>::F<'a, (A, B)> + wwa: WrapE<'a, WrapE<'a, A, E0, Self>, E1, Self>, + wwb: WrapE<'a, WrapE<'a, B, E0, Self>, E1, Self>, + ) -> WrapE<'a, (A, B), Result, Self> where Self: 'a, { diff --git a/src/func/applicative_select.rs b/src/func/applicative_select.rs index c270e30..d5de629 100644 --- a/src/func/applicative_select.rs +++ b/src/func/applicative_select.rs @@ -5,7 +5,7 @@ pub enum Selected<'a, A: 'a, B: 'a, T: ?Sized + 'a + WeakFunctor> { B(T::F<'a, A>, B), } -pub type SelectedWrapped<'a, A, B, T> = ::F<'a, Selected<'a, A, B, T>>; +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>( diff --git a/src/func/controlflow.rs b/src/func/controlflow.rs index 0a162ea..add9313 100644 --- a/src/func/controlflow.rs +++ b/src/func/controlflow.rs @@ -73,7 +73,7 @@ impl< /// Next [Iterative] state, wrapped. pub type IterativeWrapped<'a, F> = - <>::T as WeakFunctor>::F<'a, ControlFlow<>::B, F>>; + Wrap<'a, ControlFlow<>::B, F>, >::T>; /// Value passed to [`Monad::iterate`]. pub trait Iterative<'a>: 'a + Sized { diff --git a/src/func/instances/composition.rs b/src/func/instances/composition.rs index c513def..2796733 100644 --- a/src/func/instances/composition.rs +++ b/src/func/instances/composition.rs @@ -142,7 +142,7 @@ impl< F: Iterative<'a, T = CompositionInstance>, > Iterative<'a> for ComposedIterative { - type B = ::F<'a, F::B>; + type B = Wrap<'a, F::B, V>; type T = U; fn next(self) -> IterativeWrapped<'a, Self> { diff --git a/src/func/instances/overload.rs b/src/func/instances/overload.rs index afe7cfc..cf3acb3 100644 --- a/src/func/instances/overload.rs +++ b/src/func/instances/overload.rs @@ -176,45 +176,7 @@ impl MonadFailAny for DeriveFailAny { type T = Fallible::W; - fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(E0) -> E1, - ) -> as WeakFunctor>::F<'a, A> - where - Self: 'a, - { - Fallible::map_err(wa, |err| err.map(f)) - } - - fn bind_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(E0) -> as WeakFunctor>::F<'a, A>, - ) -> as WeakFunctor>::F<'a, A> - where - Self: 'a, - { - Fallible::bind_err(wa, |err| match err { - Ok(e0) => f(e0), - Err(ex) => Fallible::fail(Err(ex)), - }) - } - - fn bind<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, B>, - ) -> as WeakFunctor>::F<'a, B> - where - Self: 'a, - { - Fallible::bind(wa, |result| match result { - Ok(a) => f(Ok(a)), - Err(Ok(e0)) => f(Err(e0)), - Err(Err(ex)) => Fallible::fail(Err(ex)), - }) - } - fn unstuff<'a, A: 'a, E: 'a>( - wa: as WeakFunctor>::F<'a, A>, - ) -> as WeakFunctor>::F<'a, Result> + fn unstuff<'a, A: 'a, E: 'a>(wa: WrapE<'a, A, E, Self>) -> Wrap<'a, Result, Self::T> where Self: 'a, Fallible::W: 'a, @@ -225,9 +187,7 @@ impl MonadFailAny for DeriveFailAny { }) } - fn stuff<'a, A: 'a, E: 'a>( - fa: as WeakFunctor>::F<'a, Result>, - ) -> as WeakFunctor>::F<'a, A> + fn stuff<'a, A: 'a, E: 'a>(fa: Wrap<'a, Result, Self::T>) -> WrapE<'a, A, E, Self> where Self: 'a, Fallible::W: 'a, @@ -238,6 +198,43 @@ impl MonadFailAny for DeriveFailAny { Err(ex) => Fallible::fail(Err(ex)), }) } + + fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(E0) -> E1, + ) -> WrapE<'a, A, E1, Self> + where + Self: 'a, + { + Fallible::map_err(wa, |err| err.map(f)) + } + + fn bind_err<'a, A: 'a, E0: 'a, E1: 'a>( + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(E0) -> WrapE<'a, A, E1, Self>, + ) -> WrapE<'a, A, E1, Self> + where + Self: 'a, + { + Fallible::bind_err(wa, |err| match err { + Ok(e0) => f(e0), + Err(ex) => Fallible::fail(Err(ex)), + }) + } + + fn bind<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(Result) -> WrapE<'a, B, E1, Self>, + ) -> WrapE<'a, B, E1, Self> + where + Self: 'a, + { + Fallible::bind(wa, |result| match result { + Ok(a) => f(Ok(a)), + Err(Ok(e0)) => f(Err(e0)), + Err(Err(ex)) => Fallible::fail(Err(ex)), + }) + } } impl SharedFunctor for OverloadInstance { diff --git a/src/func/instances/result.rs b/src/func/instances/result.rs index 60637fc..a646080 100644 --- a/src/func/instances/result.rs +++ b/src/func/instances/result.rs @@ -189,10 +189,24 @@ impl MonadFailAny for ResultFailAny { type T = instances::solo::SoloInstance; + fn unstuff<'a, A: 'a, E: 'a>(wa: WrapE<'a, A, E, Self>) -> Wrap<'a, Result, Self::T> + where + Self: 'a, + { + wa + } + + fn stuff<'a, A: 'a, E: 'a>(fa: Wrap<'a, Result, Self::T>) -> WrapE<'a, A, E, Self> + where + Self: 'a, + { + fa + } + fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, + wa: WrapE<'a, A, E0, Self>, f: impl 'a + FnOnce(E0) -> E1, - ) -> as WeakFunctor>::F<'a, A> + ) -> WrapE<'a, A, E1, Self> where Self: 'a, { @@ -200,9 +214,9 @@ impl MonadFailAny for ResultFailAny { } fn bind_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(E0) -> as WeakFunctor>::F<'a, A>, - ) -> as WeakFunctor>::F<'a, A> + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(E0) -> WrapE<'a, A, E1, Self>, + ) -> WrapE<'a, A, E1, Self> where Self: 'a, { @@ -210,9 +224,9 @@ impl MonadFailAny for ResultFailAny { } fn bind<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, B>, - ) -> as WeakFunctor>::F<'a, B> + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(Result) -> WrapE<'a, B, E1, Self>, + ) -> WrapE<'a, B, E1, Self> where Self: 'a, { @@ -220,8 +234,8 @@ impl MonadFailAny for ResultFailAny { } fn rotate_out<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, Result>, - ) -> > as WeakFunctor>::F<'a, A> + wa: WrapE<'a, Result, E0, Self>, + ) -> WrapE<'a, A, Result, Self> where Self: 'a, { @@ -231,24 +245,6 @@ impl MonadFailAny for ResultFailAny { Err(e) => Err(Err(e)), } } - - fn unstuff<'a, A: 'a, E: 'a>( - wa: as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> - where - Self: 'a, - { - wa - } - - fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, - ) -> as WeakFunctor>::F<'a, A> - where - Self: 'a, - { - fa - } } pub struct ResultFailOver(T); @@ -258,10 +254,24 @@ impl MonadFailAny for ResultFailOver { type T = T; + fn unstuff<'a, A: 'a, E: 'a>(wa: WrapE<'a, A, E, Self>) -> Wrap<'a, Result, Self::T> + where + Self: 'a, + { + wa + } + + fn stuff<'a, A: 'a, E: 'a>(fa: Wrap<'a, Result, Self::T>) -> WrapE<'a, A, E, Self> + where + Self: 'a, + { + fa + } + fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, + wa: WrapE<'a, A, E0, Self>, f: impl 'a + FnOnce(E0) -> E1, - ) -> as WeakFunctor>::F<'a, A> + ) -> WrapE<'a, A, E1, Self> where Self: 'a, { @@ -269,9 +279,9 @@ impl MonadFailAny for ResultFailOver { } fn bind_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(E0) -> as WeakFunctor>::F<'a, A>, - ) -> as WeakFunctor>::F<'a, A> + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(E0) -> WrapE<'a, A, E1, Self>, + ) -> WrapE<'a, A, E1, Self> where Self: 'a, { @@ -282,9 +292,9 @@ impl MonadFailAny for ResultFailOver { } fn bind<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, B>, - ) -> as WeakFunctor>::F<'a, B> + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(Result) -> WrapE<'a, B, E1, Self>, + ) -> WrapE<'a, B, E1, Self> where Self: 'a, { @@ -292,29 +302,11 @@ impl MonadFailAny for ResultFailOver { } fn rotate_out<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, Result>, - ) -> > as WeakFunctor>::F<'a, A> + wa: WrapE<'a, Result, E0, Self>, + ) -> WrapE<'a, A, Result, Self> where Self: 'a, { T::fmap(::rotate_out, wa) } - - fn unstuff<'a, A: 'a, E: 'a>( - wa: as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> - where - Self: 'a, - { - wa - } - - fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, - ) -> as WeakFunctor>::F<'a, A> - where - Self: 'a, - { - fa - } } diff --git a/src/func/instances/tryfuture.rs b/src/func/instances/tryfuture.rs index 7228f7b..c198681 100644 --- a/src/func/instances/tryfuture.rs +++ b/src/func/instances/tryfuture.rs @@ -187,10 +187,24 @@ impl MonadFailAny for FutureFailAny { type T = instances::future::FutureInstance; + fn unstuff<'a, A: 'a, E: 'a>(wa: WrapE<'a, A, E, Self>) -> Wrap<'a, Result, Self::T> + where + Self: 'a, + { + wa + } + + fn stuff<'a, A: 'a, E: 'a>(fa: Wrap<'a, Result, Self::T>) -> WrapE<'a, A, E, Self> + where + Self: 'a, + { + fa + } + fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, + wa: WrapE<'a, A, E0, Self>, f: impl 'a + FnOnce(E0) -> E1, - ) -> as WeakFunctor>::F<'a, A> + ) -> WrapE<'a, A, E1, Self> where Self: 'a, { @@ -198,9 +212,9 @@ impl MonadFailAny for FutureFailAny { } fn bind_err<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(E0) -> as WeakFunctor>::F<'a, A>, - ) -> as WeakFunctor>::F<'a, A> + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(E0) -> WrapE<'a, A, E1, Self>, + ) -> WrapE<'a, A, E1, Self> where Self: 'a, { @@ -213,9 +227,9 @@ impl MonadFailAny for FutureFailAny { } fn bind<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, - f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, B>, - ) -> as WeakFunctor>::F<'a, B> + wa: WrapE<'a, A, E0, Self>, + f: impl 'a + FnOnce(Result) -> WrapE<'a, B, E1, Self>, + ) -> WrapE<'a, B, E1, Self> where Self: 'a, { @@ -223,8 +237,8 @@ impl MonadFailAny for FutureFailAny { } fn rotate_out<'a, A: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, Result>, - ) -> > as WeakFunctor>::F<'a, A> + wa: WrapE<'a, Result, E0, Self>, + ) -> WrapE<'a, A, Result, Self> where Self: 'a, { @@ -236,22 +250,4 @@ impl MonadFailAny for FutureFailAny { } }) } - - fn unstuff<'a, A: 'a, E: 'a>( - wa: as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> - where - Self: 'a, - { - wa - } - - fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, - ) -> as WeakFunctor>::F<'a, A> - where - Self: 'a, - { - fa - } } diff --git a/src/func/speculative.rs b/src/func/speculative.rs index 4c26d89..bb3cd8c 100644 --- a/src/func/speculative.rs +++ b/src/func/speculative.rs @@ -1,15 +1,13 @@ use super::*; -type Fwa<'a, A, E0, E1, Fallible> = <::T as WeakFunctor>::F< - 'a, - Result<<::W as WeakFunctor>::F<'a, A>, E1>, ->; +type Fwa<'a, A, E0, E1, Fallible> = + Wrap<'a, Result, E1>, ::T>; pub trait SpeculativeFail: MonadFailAny { fn _speculative_a_wb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( a: Result, - wb: Result< as WeakFunctor>::F<'a, B>, E1>, - ) -> > as WeakFunctor>::F<'a, (A, B)> + wb: Result, E1>, + ) -> WrapE<'a, (A, B), Result, Self> where Self: 'a, { @@ -25,7 +23,7 @@ pub trait SpeculativeFail: MonadFailAny { fn _speculative_a_fwb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( a: Result, fwb: Fwa<'a, B, E0, E1, Self>, - ) -> > as WeakFunctor>::F<'a, (A, B)> + ) -> WrapE<'a, (A, B), Result, Self> where Self: 'a, { @@ -35,9 +33,9 @@ pub trait SpeculativeFail: MonadFailAny { } fn _speculative_fa_wb<'a, A: 'a, B: 'a, E0: 'a>( - fa: ::F<'a, Result>, - wb: as WeakFunctor>::F<'a, B>, - ) -> as WeakFunctor>::F<'a, (A, B)> + fa: Wrap<'a, Result, Self::T>, + wb: WrapE<'a, B, E0, Self>, + ) -> WrapE<'a, (A, B), E0, Self> where Self: 'a, { @@ -45,9 +43,9 @@ pub trait SpeculativeFail: MonadFailAny { } fn _speculative_wa_fwb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( - wa: as WeakFunctor>::F<'a, A>, + wa: WrapE<'a, A, E0, Self>, fwb: Fwa<'a, B, E0, E1, Self>, - ) -> > as WeakFunctor>::F<'a, (A, B)> + ) -> WrapE<'a, (A, B), Result, Self> where Self: 'a, { @@ -70,8 +68,8 @@ pub trait SpeculativeFail: MonadFailAny { fn _speculative_fwa_wb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( fwa: Fwa<'a, A, E0, E1, Self>, - wb: as WeakFunctor>::F<'a, B>, - ) -> > as WeakFunctor>::F<'a, (A, B)> + wb: WrapE<'a, B, E0, Self>, + ) -> WrapE<'a, (A, B), Result, Self> where Self: 'a, { @@ -82,9 +80,9 @@ pub trait SpeculativeFail: MonadFailAny { } fn speculative<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( - wwa: as WeakFunctor>::F<'a, as WeakFunctor>::F<'a, A>>, - wwb: as WeakFunctor>::F<'a, as WeakFunctor>::F<'a, B>>, - ) -> > as WeakFunctor>::F<'a, (A, B)> + wwa: WrapE<'a, WrapE<'a, A, E0, Self>, E1, Self>, + wwb: WrapE<'a, WrapE<'a, B, E0, Self>, E1, Self>, + ) -> WrapE<'a, (A, B), Result, Self> where Self: 'a, { diff --git a/src/rcore.rs b/src/rcore.rs index 6da5419..76e4185 100644 --- a/src/rcore.rs +++ b/src/rcore.rs @@ -55,7 +55,7 @@ pub trait Context { } /// Helper alias for [`WeakFunctor::F`] of [`Context::T`]. -pub type Wrapped<'a, Ctx, A> = <::T as WeakFunctor>::F<'a, A>; +pub type Wrapped<'a, Ctx, A> = Wrap<'a, A, ::T>; /// Fundamental trait for ADN objects. pub trait Mentionable<'a, Ctx: 'a + Context>: 'a + Serializable { @@ -76,9 +76,10 @@ pub trait Mentionable<'a, Ctx: 'a + Context>: 'a + Serializable { fn points_typed(&self, points: &mut impl TakesPoints<'a, Ctx>); } +pub type Fctr<'a, Ctx, A> = >::Fctr; + /// Shorthand for the type of vaalues returned by [`Factory::deserialize`]. -pub type ParseResult<'a, Ctx, F> = - Result<>::Mtbl, >::ParseError>; +pub type ParseResult<'a, Ctx, F> = Result, >::ParseError>; /// Trait representing deserialisation rules for [Mentionable]s. /// Crucial for [`crate::rstd::typeless`]. @@ -99,6 +100,10 @@ pub trait Factory<'a, Ctx: 'a + Context>: 'a + Send + Sync + Clone { fn unexpected_tail(&self, tail: &[u8]) -> Self::ParseError; } +pub type Mtbl<'a, Ctx, F> = >::Mtbl; + +pub type ParseError<'a, Ctx, F> = >::ParseError; + /// Extension trait for factories. pub trait ExtFactory<'a, Ctx: 'a + Context>: Factory<'a, Ctx> { /// Parse the object from a slice. diff --git a/src/rcore/origin.rs b/src/rcore/origin.rs index 7bdade0..001de0d 100644 --- a/src/rcore/origin.rs +++ b/src/rcore/origin.rs @@ -5,7 +5,9 @@ pub trait Origin<'a, Ctx: 'a + Context>: 'a { /// Type of the associated object. type Mtbl: Mentionable<'a, Ctx>; /// Value of the associated factory. - fn factory(&self) -> >::Fctr; + fn factory(&self) -> OFctr<'a, Ctx, Self>; /// Try resolving the value. fn resolve(self: Rc) -> Resolution<'a, Ctx, Self::Mtbl>; } + +pub type OFctr<'a, Ctx, O> = Fctr<'a, Ctx, >::Mtbl>; diff --git a/src/rcore/resolution.rs b/src/rcore/resolution.rs index 969127b..e3f67d2 100644 --- a/src/rcore/resolution.rs +++ b/src/rcore/resolution.rs @@ -10,10 +10,8 @@ pub enum ResolutionError { } /// See [`ResolutionResult`]. -pub type ResolutionFailure<'a, Ctx, A> = ResolutionError< - ::LookupError<'a>, - <>::Fctr as Factory<'a, Ctx>>::ParseError, ->; +pub type ResolutionFailure<'a, Ctx, A> = + ResolutionError<::LookupError<'a>, ParseError<'a, Ctx, Fctr<'a, Ctx, A>>>; /// Result yielded by [`Origin`]. pub type ResolutionResult<'a, Ctx, A> = Result, ResolutionFailure<'a, Ctx, A>>; diff --git a/src/rcore/resolver_origin.rs b/src/rcore/resolver_origin.rs index ac3b897..57bd1af 100644 --- a/src/rcore/resolver_origin.rs +++ b/src/rcore/resolver_origin.rs @@ -44,7 +44,7 @@ fn _resolve_origin<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>>( impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> Origin<'a, Ctx> for ResolverOrigin<'a, Ctx, F> { type Mtbl = F::Mtbl; - fn factory(&self) -> >::Fctr { + fn factory(&self) -> OFctr<'a, Ctx, Self> { self.r_factory.clone() } diff --git a/src/rstd.rs b/src/rstd.rs index b3e0134..4b35c02 100644 --- a/src/rstd.rs +++ b/src/rstd.rs @@ -44,35 +44,23 @@ impl ExtSerializable for S { pub trait FallibleContext: Context { /// Convert a fallible wrapped into a wrapped result. fn unstuff<'a, A: 'a, E: 'a>( - wa: <::W as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> - where - Self: 'a; - - /// Convert a wrapped result into a fallible wrapped. - fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, - ) -> <::W as WeakFunctor>::F<'a, A> - where - Self: 'a; -} - -impl FallibleContext for Ctx { - fn unstuff<'a, A: 'a, E: 'a>( - wa: <::W as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> + wa: WrapE<'a, A, E, Self::Fallible>, + ) -> Wrap<'a, Result, Self::T> where Self: 'a, { Self::Fallible::unstuff(wa) } + /// Convert a wrapped result into a fallible wrapped. fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, - ) -> <::W as WeakFunctor>::F<'a, A> + fa: Wrap<'a, Result, Self::T>, + ) -> WrapE<'a, A, E, Self::Fallible> where Self: 'a, { Self::Fallible::stuff(fa) } } + +impl FallibleContext for Ctx {} diff --git a/src/rstd/cast.rs b/src/rstd/cast.rs index 53d7e6b..1a6688f 100644 --- a/src/rstd/cast.rs +++ b/src/rstd/cast.rs @@ -148,8 +148,7 @@ where } /// Returned by [`TypelessMentionable::cast`]. -pub type CastResult<'a, Ctx, A> = - Result>::Fctr as Factory<'a, Ctx>>::ParseError>; +pub type CastResult<'a, Ctx, A> = Result>>; impl<'a, Ctx: Context> TypelessMentionable<'a, Ctx> where diff --git a/src/rstd/collections/pair.rs b/src/rstd/collections/pair.rs index cc69b86..634846e 100644 --- a/src/rstd/collections/pair.rs +++ b/src/rstd/collections/pair.rs @@ -57,10 +57,7 @@ where type B = B; type FA = A::Fctr; type FB = B::Fctr; - type ParseError = PairParseError< - >::ParseError, - >::ParseError, - >; + type ParseError = PairParseError, ParseError<'a, Ctx, B::Fctr>>; fn factories(factory_data: &Self::FactoryData) -> (&Self::FA, &Self::FB) { (&factory_data.a, &factory_data.b) @@ -72,14 +69,14 @@ where fn from_error_a( _factory_data: &Self::FactoryData, - error: >::ParseError, + error: ParseError<'a, Ctx, Self::FA>, ) -> Self::ParseError { PairParseError::A(error) } fn from_error_b( _factory_data: &Self::FactoryData, - error: >::ParseError, + error: ParseError<'a, Ctx, Self::FB>, ) -> Self::ParseError { PairParseError::B(error) } diff --git a/src/rstd/collections/rbtree/subset.rs b/src/rstd/collections/rbtree/subset.rs index c8f1c00..fc88d70 100644 --- a/src/rstd/collections/rbtree/subset.rs +++ b/src/rstd/collections/rbtree/subset.rs @@ -6,8 +6,7 @@ use crate::rstd::{fallible::*, *}; use super::*; -pub type TPE<'a, Ctx, A> = - TreeParseError<<>::Fctr as Factory<'a, Ctx>>::ParseError>; +pub type TPE<'a, Ctx, A> = TreeParseError>>; pub type TreeFaiure<'a, Ctx, A> = ResolutionError<::LookupError<'a>, TPE<'a, Ctx, A>>; @@ -90,9 +89,10 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> { fn resolve( &self, - ) -> as WeakFunctor>::F< + ) -> Wrap< 'a, Rc, A, RefData>>, + SubsetMonad<'a, Ctx, A>, > { as Functor>::fmap( |resolved| resolved as Rc>, @@ -111,9 +111,10 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> { fn resolve( &self, - ) -> as WeakFunctor>::F< + ) -> Wrap< 'a, Rc, A, RefData>>, + SubsetMonad<'a, Ctx, A>, > { as Functor>::fmap( |resolved| resolved as Rc>, @@ -132,9 +133,10 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> { fn resolve( &self, - ) -> as WeakFunctor>::F< + ) -> Wrap< 'a, Rc, A, RefData>>, + SubsetMonad<'a, Ctx, A>, > { as Functor>::fmap( |resolved| resolved as Rc>, diff --git a/src/rstd/collections/stack.rs b/src/rstd/collections/stack.rs index abf2687..c825d3e 100644 --- a/src/rstd/collections/stack.rs +++ b/src/rstd/collections/stack.rs @@ -80,7 +80,7 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> Factory<'a, Ctx> { type Mtbl = StackNode<'a, Ctx, A>; - type ParseError = StackParseError<>::ParseError>; + type ParseError = StackParseError>; fn deserialize( &self, diff --git a/src/rstd/fallible.rs b/src/rstd/fallible.rs index 1482858..b5d8b6b 100644 --- a/src/rstd/fallible.rs +++ b/src/rstd/fallible.rs @@ -6,4 +6,4 @@ use super::*; pub type FallibleMonad = <::Fallible as MonadFailAny>::W; /// Preferred [Wrapped] [Result]. -pub type FallibleWrapped<'a, Ctx, A, E> = as WeakFunctor>::F<'a, A>; +pub type FallibleWrapped<'a, Ctx, A, E> = Wrap<'a, A, FallibleMonad>; diff --git a/src/rstd/inlining.rs b/src/rstd/inlining.rs index cc611e6..7b73880 100644 --- a/src/rstd/inlining.rs +++ b/src/rstd/inlining.rs @@ -131,7 +131,7 @@ impl From

for CheckedParseError

{ /// Returned by [`CheckedParse::deserialize_checked`]. pub type CheckedParseResult<'a, Ctx, F> = - Result<>::Mtbl, CheckedParseError<>::ParseError>>; + Result, CheckedParseError>>; /// Extension trait for factories that ensures fixed size read. pub trait CheckedParse<'a, Ctx: 'a + Context>: FixedSizeFactory + Factory<'a, Ctx> { diff --git a/src/rstd/inlining/static_pair.rs b/src/rstd/inlining/static_pair.rs index adb65ba..c40e18e 100644 --- a/src/rstd/inlining/static_pair.rs +++ b/src/rstd/inlining/static_pair.rs @@ -50,12 +50,12 @@ pub trait StaticPair<'a, Ctx: 'a + Context>: /// Regularise the error returned while parsing the first element. fn from_error_a( factory_data: &Self::FactoryData, - error: >::ParseError, + error: ParseError<'a, Ctx, Self::FA>, ) -> Self::ParseError; /// Regularise the error returned while parsing the second element. fn from_error_b( factory_data: &Self::FactoryData, - error: >::ParseError, + error: ParseError<'a, Ctx, Self::FB>, ) -> Self::ParseError; /// Derive factory data from the object data. fn factory_data(&self) -> Self::FactoryData; diff --git a/src/rstd/wrapped_origin.rs b/src/rstd/wrapped_origin.rs index 2d26af6..28a8992 100644 --- a/src/rstd/wrapped_origin.rs +++ b/src/rstd/wrapped_origin.rs @@ -18,25 +18,8 @@ pub trait MappableOrigin<'a, Ctx: 'a + Context>: Origin<'a, Ctx> { + Send + Sync + Clone - + Fn( - <>::Fctr as Factory<'a, Ctx>>::ParseError, - ) -> >::ParseError, - map_factory: impl 'a + FnOnce(>::Fctr) -> B::Fctr, - ) -> Rc>; -} - -impl<'a, Ctx: 'a + Context, O: ?Sized + Origin<'a, Ctx>> MappableOrigin<'a, Ctx> for O { - fn map>( - self: Rc, - map_ok: impl 'a + Send + Sync + Clone + Fn(Rc) -> B, - map_err: impl 'a - + Send - + Sync - + Clone - + Fn( - <>::Fctr as Factory<'a, Ctx>>::ParseError, - ) -> >::ParseError, - map_factory: impl 'a + FnOnce(>::Fctr) -> B::Fctr, + + Fn(ParseError<'a, Ctx, OFctr<'a, Ctx, Self>>) -> ParseError<'a, Ctx, B::Fctr>, + map_factory: impl 'a + FnOnce(OFctr<'a, Ctx, Self>) -> B::Fctr, ) -> Rc> { let origin = self.clone(); let origin: WrappedOrigin<'a, Ctx, B> = WrappedOrigin { @@ -52,11 +35,12 @@ impl<'a, Ctx: 'a + Context, O: ?Sized + Origin<'a, Ctx>> MappableOrigin<'a, Ctx> } } +impl<'a, Ctx: 'a + Context, O: ?Sized + Origin<'a, Ctx>> MappableOrigin<'a, Ctx> for O {} + fn map_resolve<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>, B: Mentionable<'a, Ctx>>( resolve: impl 'a + Fn() -> Resolution<'a, Ctx, A>, map_ok: impl 'a + Fn(Rc) -> B, - map_err: impl 'a - + Fn(>::ParseError) -> >::ParseError, + 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 { @@ -80,7 +64,7 @@ struct WrappedOrigin<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> { impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> Origin<'a, Ctx> for WrappedOrigin<'a, Ctx, A> { type Mtbl = A; - fn factory(&self) -> >::Fctr { + fn factory(&self) -> Fctr<'a, Ctx, Self::Mtbl> { self.w_factory.clone() }