Diffstat (limited to 'src/effect/blocking.rs')
| -rw-r--r-- | src/effect/blocking.rs | 140 |
1 files changed, 70 insertions, 70 deletions
diff --git a/src/effect/blocking.rs b/src/effect/blocking.rs index abadfb2..661fd12 100644 --- a/src/effect/blocking.rs +++ b/src/effect/blocking.rs @@ -18,10 +18,14 @@ pub struct Blocking<B>(Marker<B>); #[repr(transparent)] pub struct Value<T, B>(pub T, Marker<B>); -impl<'lt, T: Send + Sync, B: BlockOn> ErasedForLt<'lt, T, Blocking<B>, &'lt T> for Value<T, B> { +impl<'lt, T: Send + Sync, B: BlockOn, O> ErasedForLt<'lt, T, Blocking<B>, &'lt (T, O), O> for Value<T, B> { type T = Value<T, B>; } +impl<T: Send + Sync, B: BlockOn> ErasedHrt<T, Blocking<B>> for Value<T, B> { + type T<O> = Self; +} + impl<B: BlockOn> Effect for Blocking<B> { type Erased<T: Send + Sync> = Value<T, B>; @@ -46,7 +50,7 @@ impl<B: BlockOn> Effect for Blocking<B> { } impl<'lt, U: Send + Sync + 'lt, B: BlockOn> Effective<'lt> for Value<U, B> { - fn into_erased(self) -> ErasedEffective<'lt, Self::Output, Self::Effect> { + fn into_erased<X>(self) -> ErasedEffective<'lt, Self::Output, Self::Effect, X> { self } @@ -60,13 +64,35 @@ impl<'lt, U: Send + Sync + 'lt, B: BlockOn> Effective<'lt> for Value<U, B> { core::future::ready(self.0) } + type Loop<'ctx: 'a, 'a, T: Send + Sync + 'a, F: Send + Sync + 'a> + = Value<(U, T), B> + where + F: for<'b> FnMut(&'b mut Self::Output) -> ErasedEffective<'b, ControlFlow<T>, Self::Effect>, + 'lt: 'a; + + fn r#loop<'ctx: 'a, 'a, T: Send + Sync + 'a, F: Send + Sync + 'a>(self, mut cb: F) -> Self::Loop<'ctx, 'a, T, F> + where + F: for<'b> FnMut(&'b mut Self::Output) -> ErasedEffective<'b, ControlFlow<T>, Self::Effect>, + 'lt: 'a, + { + let mut this = self.0; + + loop { + if let ControlFlow::Break(value) = cb(&mut this).0 { + return Value((this, value), Default::default()); + } + } + } + type Map<'a, T: Send + Sync + 'a, F: Send + Sync + 'a> = Value<T, B> where - F: FnOnce(Self::Output) -> T; + F: FnOnce(Self::Output) -> T, + 'lt: 'a; fn map<'a, T: Send + Sync + 'a, F: Send + Sync + 'a>(self, cb: F) -> Self::Map<'a, T, F> where F: FnOnce(Self::Output) -> T, + 'lt: 'a, { Value(cb(self.0), Default::default()) } @@ -74,7 +100,8 @@ impl<'lt, U: Send + Sync + 'lt, B: BlockOn> Effective<'lt> for Value<U, B> { type Then<'a, T: Send + Sync + 'a, V: Send + Sync + 'a, F: Send + Sync + 'a> = Value<T, B> where F: FnOnce(Self::Output) -> V, - V: Effective<'a, Output = T, Effect = Self::Effect>; + V: Effective<'a, Output = T, Effect = Self::Effect>, + 'lt: 'a; fn then<'a, T: Send + Sync + 'a, V: Send + Sync + 'a, F: Send + Sync + 'a>( self, @@ -83,18 +110,19 @@ impl<'lt, U: Send + Sync + 'lt, B: BlockOn> Effective<'lt> for Value<U, B> { where F: FnOnce(Self::Output) -> V, V: Effective<'a, Output = T, Effect = Self::Effect>, + 'lt: 'a, { - cb(self.0).into_erased() + cb(self.0).into_erased::<()>() } - type AsCtx<'a, T: Send + Sync + 'a, F: Send + Sync + 'a> = Value<(U, T), B> + type AsCtx<'ctx: 'a, 'a, T: Send + Sync + 'a, F: Send + Sync + 'a> = Value<(U, T), B> where - F: for<'b> FnOnce(&'b mut Self::Output) -> ErasedEffective<'b, T, Self::Effect>, + F: for<'b> FnOnce(&'b mut Self::Output) -> ErasedEffective<'b, T, Self::Effect, (&'b mut Self::Output, &'ctx ())>, 'lt: 'a; - fn as_ctx<'a, T: Send + Sync + 'a, F: Send + Sync + 'a>(self, cb: F) -> Self::AsCtx<'a, T, F> + fn as_ctx<'ctx: 'a, 'a, T: Send + Sync + 'a, F: Send + Sync + 'a>(self, cb: F) -> Self::AsCtx<'ctx, 'a, T, F> where - F: for<'b> FnOnce(&'b mut Self::Output) -> ErasedEffective<'b, T, Self::Effect>, + F: for<'b> FnOnce(&'b mut Self::Output) -> ErasedEffective<'b, T, Self::Effect, (&'b mut Self::Output, &'ctx ())>, 'lt: 'a, { let mut this = self.0; @@ -117,49 +145,28 @@ impl<B: BlockOn> Join for Blocking<B> { T1: Effective<'a, Effect = Self::Effect>, T2: Effective<'a, Effect = Self::Effect>; - fn two< - 'a, - T0: Send + Sync + 'a, - T1: Send + Sync + 'a, - F0: Send + Sync + 'a, - F1: Send + Sync + 'a, - >( - cb: (F0, F1), - ) -> Self::Two<'a, T0, T1> + fn two<'a, T0: Send + Sync + 'a, T1: Send + Sync + 'a>(cb: (T0, T1)) -> Self::Two<'a, T0, T1> where T0: Effective<'a, Effect = Self::Effect>, T1: Effective<'a, Effect = Self::Effect>, - F0: FnOnce() -> T0, - F1: FnOnce() -> T1, { - let v0 = (cb.0)().into_erased().0; - let v1 = (cb.1)().into_erased().0; + let v0 = cb.0.into_erased::<()>().0; + let v1 = cb.1.into_erased::<()>().0; Value((v0, v1), Default::default()) } - fn three< - 'a, - T0: Send + Sync + 'a, - T1: Send + Sync + 'a, - T2: Send + Sync + 'a, - F0: Send + Sync + 'a, - F1: Send + Sync + 'a, - F2: Send + Sync + 'a, - >( - cb: (F0, F1, F2), + fn three<'a, T0: Send + Sync + 'a, T1: Send + Sync + 'a, T2: Send + Sync + 'a>( + cb: (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>, - F0: FnOnce() -> T0, - F1: FnOnce() -> T1, - F2: FnOnce() -> T2, { - let v0 = (cb.0)().into_erased().0; - let v1 = (cb.1)().into_erased().0; - let v2 = (cb.2)().into_erased().0; + let v0 = cb.0.into_erased::<()>().0; + let v1 = cb.1.into_erased::<()>().0; + let v2 = cb.2.into_erased::<()>().0; Value((v0, v1, v2), Default::default()) } @@ -168,41 +175,38 @@ impl<B: BlockOn> Join for Blocking<B> { impl<B: BlockOn> TryJoin for Blocking<B> { type Effect = Blocking<B>; - type Two<'a, Err: Send + Sync + 'a, V0: Send + Sync + 'a, V1: Send + Sync + 'a, T0: Send + Sync + 'a, T1: Send + Sync + 'a> = Value<Result<(T0, T1), Err>, B> + type Two<'a, T0: Send + Sync + 'a, T1: Send + Sync + 'a> = Value<Result<(T0::Ok, T1::Ok), T0::Err>, B> where - V0: Effective<'a, Output = Result<T0, Err>, Effect = Self::Effect>, - V1: Effective<'a, Output = Result<T1, Err>, Effect = Self::Effect>; + T0: TryEffective<'a, Effect = Self::Effect>, + T1: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>; - type Three<'a, Err: Send + Sync + 'a, V0: Send + Sync + 'a, V1: Send + Sync + 'a, V2: Send + Sync + 'a, T0: Send + Sync + 'a, T1: Send + Sync + 'a, T2: Send + Sync + 'a> = Value<Result<(T0, T1, T2), Err>, B> + type Three<'a, T0: Send + Sync + 'a, T1: Send + Sync + 'a, T2: Send + Sync + 'a> = Value<Result<(T0::Ok, T1::Ok, T2::Ok), T0::Err>, B> where - V0: Effective<'a, Output = Result<T0, Err>, Effect = Self::Effect>, - V1: Effective<'a, Output = Result<T1, Err>, Effect = Self::Effect>, - V2: Effective<'a, Output = Result<T2, Err>, Effect = Self::Effect>; + T0: TryEffective<'a, Effect = Self::Effect>, + T1: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, + T2: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>; fn two< 'a, - Err: Send + Sync + 'a, T0: Send + Sync + 'a, T1: Send + Sync + 'a, - V0: Send + Sync + 'a, - V1: Send + Sync + 'a, F0: Send + Sync + 'a, F1: Send + Sync + 'a, >( cb: (F0, F1), - ) -> Self::Two<'a, Err, V0, V1, T0, T1> + ) -> Self::Two<'a, T0, T1> where - V0: Effective<'a, Output = Result<T0, Err>, Effect = Self::Effect>, - V1: Effective<'a, Output = Result<T1, Err>, Effect = Self::Effect>, - F0: FnOnce() -> V0, - F1: FnOnce() -> V1, + T0: TryEffective<'a, Effect = Self::Effect>, + T1: TryEffective<'a, Err = T0::Err, Effect = Self::Effect>, + F0: FnOnce() -> T0, + F1: FnOnce() -> T1, { - let v0 = match (cb.0)().into_erased().0 { + let v0 = match (cb.0)().into_erased::<()>().0 { Ok(v) => v, Err(err) => return Value(Err(err), Default::default()), }; - let v1 = match (cb.1)().into_erased().0 { + let v1 = match (cb.1)().into_erased::<()>().0 { Ok(v) => v, Err(err) => return Value(Err(err), Default::default()), }; @@ -212,38 +216,34 @@ impl<B: BlockOn> TryJoin for Blocking<B> { fn three< 'a, - Err: Send + Sync + 'a, T0: Send + Sync + 'a, T1: Send + Sync + 'a, T2: Send + Sync + 'a, - V0: Send + Sync + 'a, - V1: Send + Sync + 'a, - V2: Send + Sync + 'a, F0: Send + Sync + 'a, F1: Send + Sync + 'a, F2: Send + Sync + 'a, >( cb: (F0, F1, F2), - ) -> Self::Three<'a, Err, V0, V1, V2, T0, T1, T2> - where - V0: Effective<'a, Output = Result<T0, Err>, Effect = Self::Effect>, - V1: Effective<'a, Output = Result<T1, Err>, Effect = Self::Effect>, - V2: Effective<'a, Output = Result<T2, Err>, Effect = Self::Effect>, - F0: FnOnce() -> V0, - F1: FnOnce() -> V1, - F2: FnOnce() -> V2, + ) -> 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, { - let v0 = match (cb.0)().into_erased().0 { + let v0 = match (cb.0)().into_erased::<()>().0 { Ok(v) => v, Err(err) => return Value(Err(err), Default::default()), }; - let v1 = match (cb.1)().into_erased().0 { + let v1 = match (cb.1)().into_erased::<()>().0 { Ok(v) => v, Err(err) => return Value(Err(err), Default::default()), }; - let v2 = match (cb.2)().into_erased().0 { + let v2 = match (cb.2)().into_erased::<()>().0 { Ok(v) => v, Err(err) => return Value(Err(err), Default::default()), }; |