Diffstat (limited to 'src/effect.rs')
-rw-r--r--src/effect.rs187
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 {