Diffstat (limited to 'src/effect.rs')
| -rw-r--r-- | src/effect.rs | 187 |
1 files changed, 105 insertions, 82 deletions
diff --git a/src/effect.rs b/src/effect.rs index 14c13c2..50dab50 100644 --- a/src/effect.rs +++ b/src/effect.rs @@ -100,9 +100,9 @@ pub trait Effect: Join<Effect = Self> + TryJoin<Effect = Self> + Ss + Sized + 's fn ready<'a, T: Ss + 'a>(value: T) -> ErasedEffective<'a, T, Self>; - fn from_future<'a, F: Ss + 'a>(future: F) -> ErasedEffective<'a, F::Output, Self> + fn from_future<'a, F>(future: F) -> ErasedEffective<'a, F::Output, Self> where - F: Future, + F: Ss + 'a + Future, F::Output: Ss + 'a; } @@ -215,35 +215,35 @@ macro_rules! tri { pub use tri; pub trait EffectExt: Effect { - fn repeat_map<'ctx, 'wrap, I: Ss + 'wrap, U: Ss, F: Ss>( - input: I, - f: F, - ) -> ErasedEffective<'wrap, U, Self> + fn repeat_map<'ctx, 'wrap, I, U, F>(input: I, f: F) -> ErasedEffective<'wrap, U, Self> where F: for<'temp> FnMut(&'temp mut I) -> ErasedEffective<'temp, ControlFlow<U>, Self, &'ctx ()>, + I: Ss + 'wrap, + U: Ss, + F: Ss, 'ctx: 'wrap, { Self::ready(input).repeat_map(f) } #[inline(always)] - fn as_ctx<'ctx, 'wrap, I: Ss + 'wrap, U: Ss, F: Ss>( - input: I, - f: F, - ) -> ErasedEffective<'wrap, (I, U), Self> + fn as_ctx<'ctx, 'wrap, I, U, F>(input: I, f: F) -> ErasedEffective<'wrap, (I, U), Self> where F: for<'temp> FnOnce(&'temp mut I) -> ErasedEffective<'temp, U, Self, &'ctx ()>, + I: Ss + 'wrap, + U: Ss, + F: Ss, 'ctx: 'wrap, { Self::ready(input).as_ctx(f) } - fn as_ctx_map<'ctx, 'wrap, I: Ss + 'wrap, U: Ss, F: Ss>( - input: I, - f: F, - ) -> ErasedEffective<'wrap, U, Self> + fn as_ctx_map<'ctx, 'wrap, I, U, F>(input: I, f: F) -> ErasedEffective<'wrap, U, Self> where F: for<'temp> FnOnce(&'temp mut I) -> ErasedEffective<'temp, U, Self, &'ctx ()>, + I: Ss + 'wrap, + U: Ss, + F: Ss, 'ctx: 'wrap, { Self::ready(input).as_ctx_map(f) @@ -269,9 +269,11 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { self.map(|(ctx, _)| ctx) } - fn map<'wrap, U: Ss, F: Ss>(self, f: F) -> ErasedEffective<'wrap, U, Self::Effect> + fn map<'wrap, U, F>(self, f: F) -> ErasedEffective<'wrap, U, Self::Effect> where F: FnOnce(Self::Output) -> U, + U: Ss, + F: Ss, 'lt: 'wrap, { self.r#do( @@ -284,9 +286,11 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { ) } - fn then<'wrap, U: Ss, F: Ss>(self, f: F) -> ErasedEffective<'wrap, U, Self::Effect> + fn then<'wrap, U, F>(self, f: F) -> ErasedEffective<'wrap, U, Self::Effect> where F: FnOnce(Self::Output) -> ErasedEffective<'wrap, U, Self::Effect>, + U: Ss, + F: Ss, 'lt: 'wrap, { self.r#do( @@ -299,10 +303,12 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { ) } - fn or_else<'wrap, U: Ss, F: Ss>(self, f: F) -> ErasedEffective<'wrap, Option<U>, Self::Effect> + fn or_else<'wrap, U, F>(self, f: F) -> ErasedEffective<'wrap, Option<U>, Self::Effect> where Self: Effective<'lt, Output = Option<U>>, F: FnOnce() -> ErasedEffective<'wrap, Option<U>, Self::Effect>, + U: Ss, + F: Ss, 'lt: 'wrap, { self.r#do( @@ -323,8 +329,9 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { ) } + #[allow(clippy::wrong_self_convention)] #[inline(always)] - fn as_ctx<'ctx: 'lt, 'wrap, U: Ss, F: Ss>( + fn as_ctx<'ctx, 'wrap, U, F>( self, f: F, ) -> ErasedEffective<'wrap, (Self::Output, U), Self::Effect> @@ -332,6 +339,9 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { F: for<'temp> FnOnce( &'temp mut Self::Output, ) -> ErasedEffective<'temp, U, Self::Effect, &'ctx ()>, + U: Ss, + F: Ss, + 'ctx: 'lt, 'lt: 'wrap, { self.r#do( @@ -345,14 +355,15 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { ) } - fn as_ctx_map<'ctx: 'lt, 'wrap, U: Ss, F: Ss>( - self, - f: F, - ) -> ErasedEffective<'wrap, U, Self::Effect> + #[allow(clippy::wrong_self_convention)] + fn as_ctx_map<'ctx, 'wrap, U, F>(self, f: F) -> ErasedEffective<'wrap, U, Self::Effect> where F: for<'temp> FnOnce( &'temp mut Self::Output, ) -> ErasedEffective<'temp, U, Self::Effect, &'ctx ()>, + 'ctx: 'lt, + U: Ss, + F: Ss, 'lt: 'wrap, { self.r#do( @@ -365,7 +376,8 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { ) } - fn as_ctx_or_else<'ctx: 'lt, 'wrap, Ctx: Ss, U: Ss, F: Ss>( + #[allow(clippy::wrong_self_convention)] + fn as_ctx_or_else<'ctx, 'wrap, Ctx, U, F>( self, f: F, ) -> ErasedEffective<'wrap, (Ctx, Option<U>), Self::Effect> @@ -374,6 +386,10 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { F: for<'temp> FnOnce( &'temp mut Ctx, ) -> ErasedEffective<'temp, Option<U>, Self::Effect, &'ctx ()>, + 'ctx: 'lt, + Ctx: Ss, + U: Ss, + F: Ss, 'lt: 'wrap, { self.r#do( @@ -394,7 +410,8 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { ) } - fn as_ctx_or_else_map<'ctx: 'lt, 'wrap, Ctx: Ss, U: Ss, F: Ss>( + #[allow(clippy::wrong_self_convention)] + fn as_ctx_or_else_map<'ctx, 'wrap, Ctx, U, F>( self, f: F, ) -> ErasedEffective<'wrap, Option<U>, Self::Effect> @@ -403,6 +420,10 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { F: for<'temp> FnOnce( &'temp mut Ctx, ) -> ErasedEffective<'temp, Option<U>, Self::Effect, &'ctx ()>, + 'ctx: 'lt, + Ctx: Ss, + U: Ss, + F: Ss, 'lt: 'wrap, { self.r#do( @@ -423,7 +444,7 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { ) } - fn repeat<'ctx: 'lt, 'wrap, U: Ss, F: Ss>( + fn repeat<'ctx, 'wrap, U, F>( self, mut f: F, ) -> ErasedEffective<'wrap, (Self::Output, U), Self::Effect> @@ -432,6 +453,9 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { &'temp mut Self::Output, ) -> ErasedEffective<'temp, ControlFlow<U>, Self::Effect, &'ctx ()>, + 'ctx: 'lt, + U: Ss, + F: Ss, 'lt: 'wrap, { self.r#do( @@ -444,15 +468,15 @@ pub trait EffectiveExt<'lt>: Effective<'lt> { ) } - fn repeat_map<'ctx: 'lt, 'wrap, U: Ss, F: Ss>( - self, - mut f: F, - ) -> ErasedEffective<'wrap, U, Self::Effect> + fn repeat_map<'ctx, 'wrap, U, F>(self, mut f: F) -> ErasedEffective<'wrap, U, Self::Effect> where F: for<'temp> FnMut( &'temp mut Self::Output, ) -> ErasedEffective<'temp, ControlFlow<U>, Self::Effect, &'ctx ()>, + 'ctx: 'lt, + U: Ss, + F: Ss, 'lt: 'wrap, { self.r#do( @@ -490,19 +514,19 @@ pub trait Effective<'lt>: Sized + Ss + 'lt { fn r#do< 'ctx: 'lt, 'wrap, - Pre: Ss, - Ctx: Ss, - Owned: Ss, - First: Ss, - FirstOutput: Ss, - FirstPost: Ss, - Done: Ss, - Extra: Ss, - Repeat: Ss, - RepeatOutput: Ss, - RepeatPost: Ss, - Post: Ss, - Return: Ss, + Pre, + Ctx, + Owned, + First, + FirstOutput, + FirstPost, + Done, + Extra, + Repeat, + RepeatOutput, + RepeatPost, + Post, + Return, >( self, pre: Pre, @@ -513,21 +537,26 @@ pub trait Effective<'lt>: Sized + Ss + 'lt { post: Post, ) -> ErasedEffective<'wrap, Return, Self::Effect> where - Pre: FnOnce(Self::Output) -> (Ctx, ControlFlow<Done, Owned>), - First: for<'temp> FnOnce( - &'temp mut Ctx, - Owned, - ) - -> ErasedEffective<'temp, FirstOutput, Self::Effect, &'wrap ()>, - FirstPost: for<'temp> FnOnce(&'temp mut Ctx, FirstOutput) -> ControlFlow<Done, Extra>, - Repeat: for<'temp> FnMut( - &'temp mut Ctx, - &'temp mut Extra, - ) - -> ErasedEffective<'temp, RepeatOutput, Self::Effect, &'wrap ()>, - RepeatPost: - for<'temp> FnMut(&'temp mut Ctx, &'temp mut Extra, RepeatOutput) -> ControlFlow<Done>, - Post: FnOnce(Ctx, Option<Extra>, Done) -> Return, + Pre: Ss + FnOnce(Self::Output) -> (Ctx, ControlFlow<Done, Owned>), + First: Ss + + for<'temp> FnOnce( + &'temp mut Ctx, + Owned, + ) + -> ErasedEffective<'temp, FirstOutput, Self::Effect, &'wrap ()>, + FirstPost: Ss + for<'temp> FnOnce(&'temp mut Ctx, FirstOutput) -> ControlFlow<Done, Extra>, + Repeat: Ss + + for<'temp> FnMut( + &'temp mut Ctx, + &'temp mut Extra, + ) + -> ErasedEffective<'temp, RepeatOutput, Self::Effect, &'wrap ()>, + RepeatPost: Ss + + for<'temp> FnMut(&'temp mut Ctx, &'temp mut Extra, RepeatOutput) -> ControlFlow<Done>, + Post: Ss + FnOnce(Ctx, Option<Extra>, Done) -> Return, + Return: Ss, + RepeatOutput: Ss, + FirstOutput: Ss, 'lt: 'wrap; } @@ -569,18 +598,16 @@ pub trait Join { T1: Effective<'a, Effect = Self::Effect>, T2: Effective<'a, Effect = Self::Effect>; - fn two<'a, T0: Ss + 'a, T1: Ss + 'a>(effectives: (T0, T1)) -> Self::Two<'a, T0, T1> + fn two<'a, T0, T1>(effectives: (T0, T1)) -> Self::Two<'a, T0, T1> where - T0: Effective<'a, Effect = Self::Effect>, - T1: Effective<'a, Effect = Self::Effect>; + T0: Ss + 'a + Effective<'a, Effect = Self::Effect>, + T1: Ss + 'a + Effective<'a, Effect = Self::Effect>; - fn three<'a, T0: Ss + 'a, T1: Ss + 'a, T2: Ss + 'a>( - effectives: (T0, T1, T2), - ) -> Self::Three<'a, T0, T1, T2> + fn three<'a, T0, T1, T2>(effectives: (T0, T1, T2)) -> Self::Three<'a, T0, T1, T2> where - T0: Effective<'a, Effect = Self::Effect>, - T1: Effective<'a, Effect = Self::Effect>, - T2: Effective<'a, Effect = Self::Effect>; + T0: Ss + 'a + Effective<'a, Effect = Self::Effect>, + T1: Ss + 'a + Effective<'a, Effect = Self::Effect>, + T2: Ss + 'a + Effective<'a, Effect = Self::Effect>; } pub trait TryJoin { @@ -605,25 +632,21 @@ pub trait TryJoin { T1: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, T2: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>; - fn two<'a, T0: Ss + 'a, T1: Ss + 'a, F0: Ss + 'a, F1: Ss + 'a>( - cb: (F0, F1), - ) -> Self::Two<'a, T0, T1> + fn two<'a, T0, T1, F0, F1>(cb: (F0, F1)) -> Self::Two<'a, T0, T1> where - T0: TryEffective<'a, Effect = Self::Effect>, - T1: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, - F0: FnOnce() -> T0, - F1: FnOnce() -> T1; + T0: Ss + 'a + TryEffective<'a, Effect = Self::Effect>, + T1: Ss + 'a + TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, + F0: Ss + 'a + FnOnce() -> T0, + F1: Ss + 'a + FnOnce() -> T1; - fn three<'a, T0: Ss + 'a, T1: Ss + 'a, T2: Ss + 'a, F0: Ss + 'a, F1: Ss + 'a, F2: Ss + 'a>( - cb: (F0, F1, F2), - ) -> Self::Three<'a, T0, T1, T2> + fn three<'a, T0, T1, T2, F0, F1, F2>(cb: (F0, F1, F2)) -> Self::Three<'a, T0, T1, T2> where - T0: TryEffective<'a, Effect = Self::Effect>, - T1: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, - T2: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, - F0: FnOnce() -> T0, - F1: FnOnce() -> T1, - F2: FnOnce() -> T2; + T0: Ss + 'a + TryEffective<'a, Effect = Self::Effect>, + T1: Ss + 'a + TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, + T2: Ss + 'a + TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, + F0: Ss + 'a + FnOnce() -> T0, + F1: Ss + 'a + FnOnce() -> T1, + F2: Ss + 'a + FnOnce() -> T2; } pub fn join<'lt, E: Effect, T: Joinable<'lt, E>>(x: T) -> T::Output { |