diff --git a/src/func.rs b/src/func.rs index ebf5d21..52d81f4 100644 --- a/src/func.rs +++ b/src/func.rs @@ -199,7 +199,8 @@ pub trait MonadFail: Monad { /// Equivalent of Haskell's `fail`. fn fail<'a, A: 'a>(e: E) -> Self::F<'a, A> where - Self: 'a; + Self: 'a, + E: 'a; } /// Equivalent of Haskell's `Alternative`. @@ -238,6 +239,14 @@ pub trait LocalFunctor: WeakFunctor { pub trait MonadFailAny { /// [`MonadFail`] for a specific error type. type W: MonadFail; + + /// Equivalent of [`Result::map_err`]. + 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; } /// Represents a (collection of) [Monad]\(s), diff --git a/src/func/classes/composition.rs b/src/func/classes/composition.rs index 7a7c5ca..fbcb62c 100644 --- a/src/func/classes/composition.rs +++ b/src/func/classes/composition.rs @@ -125,6 +125,7 @@ impl + LocalFunctor> MonadFail for CompositionCl fn fail<'a, A: 'a>(e: E) -> Self::F<'a, A> where Self: 'a, + E: 'a, { U::pure(V::fail(e)) } diff --git a/src/func/classes/result.rs b/src/func/classes/result.rs index d4ad469..8d63020 100644 --- a/src/func/classes/result.rs +++ b/src/func/classes/result.rs @@ -163,6 +163,16 @@ pub struct ResultFailAny; impl MonadFailAny for ResultFailAny { type W = ResultClass; + + 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, + { + wa.map_err(f) + } } impl MonadFailOver for ResultFailAny { @@ -191,6 +201,16 @@ pub struct ResultFailOver(T); impl MonadFailAny for ResultFailOver { type W = super::composition::CompositionClass>; + + 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, + { + T::fmap(|a| a.map_err(f), wa) + } } impl MonadFailOver for ResultFailOver {