From 9a8472e8fdc1d6a6807483d0fbcf57f8ea481601 Mon Sep 17 00:00:00 2001 From: timofey Date: Sat, 20 May 2023 13:42:58 +0000 Subject: [PATCH] merge `MonadFailOver` into `FutureFailAny` --- src/core.rs | 2 +- src/func.rs | 33 ++++++++++++++------------------- src/func/classes/overload.rs | 5 ++--- src/func/classes/result.rs | 20 ++++++++------------ src/func/classes/tryfuture.rs | 10 ++++------ 5 files changed, 29 insertions(+), 41 deletions(-) diff --git a/src/core.rs b/src/core.rs index c8a7747..47244f4 100644 --- a/src/core.rs +++ b/src/core.rs @@ -42,7 +42,7 @@ pub trait Context { /// Type to allow improved support for result evaluation. /// This is important for async applications stopping early. - type Fallible: MonadFailOver; + type Fallible: MonadFailAny; /// See [`Diagnostic`]. type D: Diagnostic; diff --git a/src/func.rs b/src/func.rs index 25001f7..97e8d58 100644 --- a/src/func.rs +++ b/src/func.rs @@ -278,6 +278,9 @@ pub trait MonadFailAny { /// [`MonadFail`] for a specific error type. type W: MonadFail; + /// Associated infallible [`Monad`]. + type T: Monad; + /// Equivalent of [`Result::map_err`]. fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( wa: as WeakFunctor>::F<'a, A>, @@ -311,6 +314,17 @@ pub trait MonadFailAny { Err(e) => Self::fail(Ok(e)), }) } + fn unstuff<'a, A: 'a, E: 'a>( + wa: as WeakFunctor>::F<'a, A>, + ) -> ::F<'a, Result> + where + Self: 'a; + + fn stuff<'a, A: 'a, E: 'a>( + fa: ::F<'a, Result>, + ) -> as WeakFunctor>::F<'a, A> + where + Self: 'a; } pub trait MonadFailAnyExt: MonadFailAny { @@ -330,25 +344,6 @@ pub trait MonadFailAnyExt: MonadFailAny { impl MonadFailAnyExt for Fallible {} -/// Represents a (collection of) [Monad]\(s), -/// wrapped values of which are interchangeable with another [Monad]'s -/// wrapped [Result]s. -pub trait MonadFailOver: MonadFailAny { - fn unstuff<'a, A: 'a, E: 'a>( - wa: as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> - where - Self: 'a, - T: 'a; - - fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, - ) -> as WeakFunctor>::F<'a, A> - where - Self: 'a, - T: 'a; -} - pub trait SharedFunctor: WeakFunctor { type Shared<'a, A: 'a + Clone>: 'a + Clone where diff --git a/src/func/classes/overload.rs b/src/func/classes/overload.rs index 238958b..35c602b 100644 --- a/src/func/classes/overload.rs +++ b/src/func/classes/overload.rs @@ -214,6 +214,8 @@ struct DeriveFailAny(Ex, Fallible); impl MonadFailAny for DeriveFailAny { type W = OverloadClass>, DeriveFail>; + 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, @@ -250,9 +252,6 @@ impl MonadFailAny for DeriveFailAny { Err(Err(ex)) => Fallible::fail(Err(ex)), }) } -} - -impl MonadFailOver> for DeriveFailAny { fn unstuff<'a, A: 'a, E: 'a>( wa: as WeakFunctor>::F<'a, A>, ) -> as WeakFunctor>::F<'a, Result> diff --git a/src/func/classes/result.rs b/src/func/classes/result.rs index 93826e9..254ef1a 100644 --- a/src/func/classes/result.rs +++ b/src/func/classes/result.rs @@ -215,6 +215,8 @@ impl<'a, A: 'a, E0: 'a> ResultExt<'a, A, E0> for Result { impl MonadFailAny for ResultFailAny { type W = ResultClass; + type T = classes::solo::SoloClass; + fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( wa: as WeakFunctor>::F<'a, A>, f: impl 'a + FnOnce(E0) -> E1, @@ -257,25 +259,21 @@ impl MonadFailAny for ResultFailAny { Err(e) => Err(Err(e)), } } -} -impl MonadFailOver for ResultFailAny { fn unstuff<'a, A: 'a, E: 'a>( wa: as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> + ) -> ::F<'a, Result> where Self: 'a, - classes::solo::SoloClass: 'a, { wa } fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, + fa: ::F<'a, Result>, ) -> as WeakFunctor>::F<'a, A> where Self: 'a, - classes::solo::SoloClass: 'a, { fa } @@ -286,6 +284,8 @@ pub struct ResultFailOver(T); impl MonadFailAny for ResultFailOver { type W = super::composition::CompositionClass>; + type T = T; + fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( wa: as WeakFunctor>::F<'a, A>, f: impl 'a + FnOnce(E0) -> E1, @@ -327,25 +327,21 @@ impl MonadFailAny for ResultFailOver { { T::fmap(::rotate_out, wa) } -} -impl MonadFailOver for ResultFailOver { fn unstuff<'a, A: 'a, E: 'a>( wa: as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> + ) -> ::F<'a, Result> where Self: 'a, - T: 'a, { wa } fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, + fa: ::F<'a, Result>, ) -> as WeakFunctor>::F<'a, A> where Self: 'a, - T: 'a, { fa } diff --git a/src/func/classes/tryfuture.rs b/src/func/classes/tryfuture.rs index c242f22..fd83aeb 100644 --- a/src/func/classes/tryfuture.rs +++ b/src/func/classes/tryfuture.rs @@ -197,6 +197,8 @@ struct FutureFailAny; impl MonadFailAny for FutureFailAny { type W = TryFutureClass; + type T = classes::future::FutureClass; + fn map_err<'a, A: 'a, E0: 'a, E1: 'a>( wa: as WeakFunctor>::F<'a, A>, f: impl 'a + FnOnce(E0) -> E1, @@ -246,25 +248,21 @@ impl MonadFailAny for FutureFailAny { } }) } -} -impl MonadFailOver for FutureFailAny { fn unstuff<'a, A: 'a, E: 'a>( wa: as WeakFunctor>::F<'a, A>, - ) -> ::F<'a, Result> + ) -> ::F<'a, Result> where Self: 'a, - classes::future::FutureClass: 'a, { wa } fn stuff<'a, A: 'a, E: 'a>( - fa: ::F<'a, Result>, + fa: ::F<'a, Result>, ) -> as WeakFunctor>::F<'a, A> where Self: 'a, - classes::future::FutureClass: 'a, { fa }