diff --git a/src/func.rs b/src/func.rs index 1ec06f1..23be49b 100644 --- a/src/func.rs +++ b/src/func.rs @@ -383,7 +383,7 @@ pub trait MonadFailAnyExt: MonadFailAny { where Self: 'a, { - ::speculative(wwa, wwb) + >::speculative(wwa, wwb) } } diff --git a/src/func/speculative.rs b/src/func/speculative.rs index ad59f08..246a4ea 100644 --- a/src/func/speculative.rs +++ b/src/func/speculative.rs @@ -5,72 +5,54 @@ type Frwa<'a, A, E0, E1, Fallible> = type Wwa<'a, A, E0, E1, Fallible> = WrapE<'a, WrapE<'a, A, E0, Fallible>, E1, Fallible>; -pub trait SpeculativeFail: MonadFailAny { - fn _speculative_a_wb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( +pub trait SpeculativeFail<'a>: 'a + MonadFailAny { + fn _speculative_a_wb( a: A, wb: WrapE<'a, B, E0, Self>, - ) -> WrapE<'a, (A, B), Result, Self> - where - Self: 'a, - { + ) -> WrapE<'a, (A, B), Result, Self> { Self::map_err( as Functor>::fmap(|b| (a, b), wb), Ok) } - fn _speculative_ra_wb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( + fn _speculative_ra_wb( ra: Result, wb: WrapE<'a, B, E0, Self>, - ) -> WrapE<'a, (A, B), Result, Self> - where - Self: 'a, - { + ) -> WrapE<'a, (A, B), Result, Self> { match ra { Ok(a) => Self::_speculative_a_wb(a, wb), Err(e0) => Self::fail(Ok(e0)), } } - fn _speculative_ra_rwb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( + fn _speculative_ra_rwb( ra: Result, rwb: Result, E1>, - ) -> WrapE<'a, (A, B), Result, Self> - where - Self: 'a, - { + ) -> WrapE<'a, (A, B), Result, Self> { match rwb { Ok(wb) => Self::_speculative_ra_wb(ra, wb), Err(e1) => Self::fail(Err(e1)), } } - fn _speculative_ra_frwb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( + fn _speculative_ra_frwb( ra: Result, frwb: Frwa<'a, B, E0, E1, Self>, - ) -> WrapE<'a, (A, B), Result, Self> - where - Self: 'a, - { + ) -> WrapE<'a, (A, B), Result, Self> { Self::stuff(::bind(frwb, |rwb| { Self::unstuff(Self::_speculative_ra_rwb(ra, rwb)) })) } - fn _speculative_fra_wb<'a, A: 'a, B: 'a, E0: 'a>( + fn _speculative_fra_wb( fra: Wrap<'a, Result, Self::T>, wb: WrapE<'a, B, E0, Self>, - ) -> WrapE<'a, (A, B), E0, Self> - where - Self: 'a, - { + ) -> WrapE<'a, (A, B), E0, Self> { as ApplicativeTuple>::tuple((Self::stuff(fra), wb)) } - fn _speculative_wa_frwb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( + fn _speculative_wa_frwb( wa: WrapE<'a, A, E0, Self>, frwb: Frwa<'a, B, E0, E1, Self>, - ) -> WrapE<'a, (A, B), Result, Self> - where - Self: 'a, - { + ) -> WrapE<'a, (A, B), Result, Self> { Self::stuff(<::T as Monad>::join( <::T as Functor>::fmap( Self::unstuff, @@ -89,26 +71,20 @@ pub trait SpeculativeFail: MonadFailAny { )) } - fn _speculative_frwa_wb<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( + fn _speculative_frwa_wb( frwa: Frwa<'a, A, E0, E1, Self>, wb: WrapE<'a, B, E0, Self>, - ) -> WrapE<'a, (A, B), Result, Self> - where - Self: 'a, - { + ) -> WrapE<'a, (A, B), Result, Self> { > as Functor>::fmap( |(b, a)| (a, b), Self::_speculative_wa_frwb(wb, frwa), ) } - fn speculative<'a, A: 'a, B: 'a, E0: 'a, E1: 'a>( + fn speculative( wwa: Wwa<'a, A, E0, E1, Self>, wwb: Wwa<'a, B, E0, E1, Self>, - ) -> WrapE<'a, (A, B), Result, Self> - where - Self: 'a, - { + ) -> WrapE<'a, (A, B), Result, Self> { Self::stuff(::join(::fmap( Self::unstuff, Self::T::select_map( @@ -125,4 +101,4 @@ pub trait SpeculativeFail: MonadFailAny { } } -impl SpeculativeFail for Fallible {} +impl<'a, Fallible: ?Sized + 'a + MonadFailAny> SpeculativeFail<'a> for Fallible {}