From 2bf4814b92feaa8c885951ab32698c7e43548f5c Mon Sep 17 00:00:00 2001 From: timofey Date: Sat, 20 May 2023 13:09:15 +0000 Subject: [PATCH] `MonadFailAny::bind` --- src/func.rs | 7 +++++++ src/func/classes/result.rs | 20 ++++++++++++++++++++ src/func/classes/tryfuture.rs | 10 ++++++++++ 3 files changed, 37 insertions(+) diff --git a/src/func.rs b/src/func.rs index 8c001a6..d45ca71 100644 --- a/src/func.rs +++ b/src/func.rs @@ -293,6 +293,13 @@ pub trait MonadFailAny { where Self: 'a; + fn bind<'a, A: 'a, E0: 'a, E1: 'a>( + wa: as WeakFunctor>::F<'a, A>, + f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, A>, + ) -> as WeakFunctor>::F<'a, A> + where + Self: 'a; + fn rotate_out<'a, A: 'a, E0: 'a, E1: 'a>( wa: as WeakFunctor>::F<'a, Result>, ) -> > as WeakFunctor>::F<'a, A> diff --git a/src/func/classes/result.rs b/src/func/classes/result.rs index 2869843..f09178f 100644 --- a/src/func/classes/result.rs +++ b/src/func/classes/result.rs @@ -235,6 +235,16 @@ impl MonadFailAny for ResultFailAny { wa.bind_err(f) } + fn bind<'a, A: 'a, E0: 'a, E1: 'a>( + wa: as WeakFunctor>::F<'a, A>, + f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, A>, + ) -> as WeakFunctor>::F<'a, A> + where + Self: 'a, + { + f(wa) + } + fn rotate_out<'a, A: 'a, E0: 'a, E1: 'a>( wa: as WeakFunctor>::F<'a, Result>, ) -> > as WeakFunctor>::F<'a, A> @@ -299,6 +309,16 @@ impl MonadFailAny for ResultFailOver { }) } + fn bind<'a, A: 'a, E0: 'a, E1: 'a>( + wa: as WeakFunctor>::F<'a, A>, + f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, A>, + ) -> as WeakFunctor>::F<'a, A> + where + Self: 'a, + { + T::bind(wa, f) + } + fn rotate_out<'a, A: 'a, E0: 'a, E1: 'a>( wa: as WeakFunctor>::F<'a, Result>, ) -> > as WeakFunctor>::F<'a, A> diff --git a/src/func/classes/tryfuture.rs b/src/func/classes/tryfuture.rs index b531dfb..b789643 100644 --- a/src/func/classes/tryfuture.rs +++ b/src/func/classes/tryfuture.rs @@ -222,6 +222,16 @@ impl MonadFailAny for FutureFailAny { }) } + fn bind<'a, A: 'a, E0: 'a, E1: 'a>( + wa: as WeakFunctor>::F<'a, A>, + f: impl 'a + FnOnce(Result) -> as WeakFunctor>::F<'a, A>, + ) -> as WeakFunctor>::F<'a, A> + where + Self: 'a, + { + Box::pin(async { f(wa.await).await }) + } + fn rotate_out<'a, A: 'a, E0: 'a, E1: 'a>( wa: as WeakFunctor>::F<'a, Result>, ) -> > as WeakFunctor>::F<'a, A>