Diffstat (limited to 'src/effect/blocking.rs')
-rw-r--r--src/effect/blocking.rs140
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()),
};