From f1cdbcc2d0da5296b37e22c51eb926c4c389a92c Mon Sep 17 00:00:00 2001 From: timofey Date: Sat, 20 May 2023 06:02:51 +0000 Subject: [PATCH] `Fail` --- src/func.rs | 15 ++++++++++----- src/func/classes/composition.rs | 2 +- src/func/classes/option.rs | 2 +- src/func/classes/result.rs | 2 +- src/func/classes/solo.rs | 2 +- src/func/classes/tryfuture.rs | 2 +- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/func.rs b/src/func.rs index 5c7d872..6d5d013 100644 --- a/src/func.rs +++ b/src/func.rs @@ -223,10 +223,8 @@ pub trait Monad: Applicative { } } -/// Equivalent of Haskell's `MonadFail`. -/// -/// -pub trait MonadFail: Monad { +/// Part of [`MonadFail`] responsible for Haskell's `fail`. +pub trait Fail: WeakFunctor { /// Equivalent of Haskell's `fail`. fn fail<'a, A: 'a>(e: E) -> Self::F<'a, A> where @@ -234,6 +232,13 @@ pub trait MonadFail: Monad { E: 'a; } +/// Equivalent of Haskell's `MonadFail`. Auto-implemented for all [`Fail`]`+`[`Monad`]. +/// +/// +pub trait MonadFail: Monad + Fail {} + +impl> MonadFail for T {} + /// Equivalent of Haskell's `Alternative`. /// Lacks `some`/`many` definitions due to [`FnOnce`] category semantics. /// @@ -296,7 +301,7 @@ pub trait MonadFailAny { { > as Monad>::bind(Self::map_err(wa, Err), |fa| match fa { Ok(a) => > as Pure>::pure(a), - Err(e) => > as MonadFail>>::fail(Ok(e)), + Err(e) => > as Fail>>::fail(Ok(e)), }) } } diff --git a/src/func/classes/composition.rs b/src/func/classes/composition.rs index b22a1b0..0e23c3f 100644 --- a/src/func/classes/composition.rs +++ b/src/func/classes/composition.rs @@ -189,7 +189,7 @@ impl< } } -impl + LocalFunctor> MonadFail for CompositionClass { +impl + LocalFunctor> Fail for CompositionClass { fn fail<'a, A: 'a>(e: E) -> Self::F<'a, A> where Self: 'a, diff --git a/src/func/classes/option.rs b/src/func/classes/option.rs index d598d33..758da1d 100644 --- a/src/func/classes/option.rs +++ b/src/func/classes/option.rs @@ -164,7 +164,7 @@ impl LocalFunctor for OptionClass { } } -impl MonadFail<()> for OptionClass { +impl Fail<()> for OptionClass { fn fail<'a, A: 'a>(_e: ()) -> Self::F<'a, A> where Self: 'a, diff --git a/src/func/classes/result.rs b/src/func/classes/result.rs index d778bcb..2869843 100644 --- a/src/func/classes/result.rs +++ b/src/func/classes/result.rs @@ -188,7 +188,7 @@ impl LocalFunctor for ResultClass { } } -impl MonadFail for ResultClass { +impl Fail for ResultClass { fn fail<'a, A: 'a>(e: E) -> Self::F<'a, A> where Self: 'a, diff --git a/src/func/classes/solo.rs b/src/func/classes/solo.rs index 4fb78fa..b631c2a 100644 --- a/src/func/classes/solo.rs +++ b/src/func/classes/solo.rs @@ -145,7 +145,7 @@ impl LocalFunctor for SoloClass { } } -impl MonadFail for SoloClass { +impl Fail for SoloClass { fn fail<'a, A: 'a>(e: std::convert::Infallible) -> Self::F<'a, A> where Self: 'a, diff --git a/src/func/classes/tryfuture.rs b/src/func/classes/tryfuture.rs index fb8cf97..b531dfb 100644 --- a/src/func/classes/tryfuture.rs +++ b/src/func/classes/tryfuture.rs @@ -182,7 +182,7 @@ impl SharedFunctor for TryFutureClass { } } -impl MonadFail for TryFutureClass { +impl Fail for TryFutureClass { fn fail<'a, A: 'a>(e: E) -> Self::F<'a, A> where Self: 'a,