Diffstat (limited to 'src/effect/async.rs')
| -rw-r--r-- | src/effect/async.rs | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/effect/async.rs b/src/effect/async.rs index 1a910d4..c1a6f06 100644 --- a/src/effect/async.rs +++ b/src/effect/async.rs @@ -5,11 +5,13 @@ use pin_project::pin_project; use crate::hkt::Marker; +use self::blocking::Spin; + use super::*; -pub enum Async {} +pub struct Async<B = Spin>(Marker<B>); -pub struct ErasedFutureHrt<T>(Marker<T>); +pub struct ErasedFutureHrt<T, B>(Marker<(T, B)>); enum ErasedFutureKind<'lt, T> { Boxed(Pin<Box<dyn Future<Output = T> + Send + Sync + 'lt>>), @@ -17,8 +19,9 @@ enum ErasedFutureKind<'lt, T> { } #[must_use] -pub struct ErasedFuture<'lt, T> { +pub struct ErasedFuture<'lt, T, B> { kind: ErasedFutureKind<'lt, T>, + _marker: Marker<B>, } #[pin_project(project = EffectFutureKindProj)] @@ -49,20 +52,25 @@ impl<'lt, T> Future for EffectFuture<'lt, T> { } } -impl<'lt, T: Ss, O> Erased::ForLt<'lt, T, Async, &'lt (T, O)> for ErasedFutureHrt<T> { - type Effective = ErasedFuture<'lt, T>; +impl<'lt, T: Ss, B: BlockOn, O> Erased::ForLt<'lt, T, Async<B>, &'lt (T, O)> + for ErasedFutureHrt<T, B> +{ + type Effective = ErasedFuture<'lt, T, B>; } -impl<T: Ss> Erased::Hkt<T, Async> for ErasedFutureHrt<T> { +impl<T: Ss, B: BlockOn> Erased::Hkt<T, Async<B>> for ErasedFutureHrt<T, B> { type Hrt<O> = Self; } -impl Effect for Async { - type Erased<T: Ss> = ErasedFutureHrt<T>; +impl<B: BlockOn> Effect for Async<B> { + type BlockOn = B; + + type Erased<T: Ss> = ErasedFutureHrt<T, B>; fn ready<'a, T: Ss + 'a>(value: T) -> ErasedEffective<'a, T, Self> { ErasedFuture { kind: ErasedFutureKind::Ready(value), + _marker: Default::default(), } } @@ -73,11 +81,12 @@ impl Effect for Async { { ErasedFuture { kind: ErasedFutureKind::Boxed(Box::pin(future)), + _marker: Default::default(), } } } -impl<'lt, U: Ss + 'lt> Effective<'lt> for ErasedFuture<'lt, U> { +impl<'lt, U: Ss + 'lt, B: BlockOn> Effective<'lt> for ErasedFuture<'lt, U, B> { fn cast<'wrap, X>(self) -> ErasedEffective<'wrap, Self::Output, Self::Effect, X> where 'lt: 'wrap, @@ -85,7 +94,7 @@ impl<'lt, U: Ss + 'lt> Effective<'lt> for ErasedFuture<'lt, U> { self } - type Effect = Async; + type Effect = Async<B>; type Output = U; @@ -183,17 +192,19 @@ impl<'lt, U: Ss + 'lt> Effective<'lt> for ErasedFuture<'lt, U> { ErasedFuture { kind: ErasedFutureKind::Boxed(Box::pin(fut)), + _marker: Default::default(), } } fn ready(value: Self::Output) -> Self { ErasedFuture { kind: ErasedFutureKind::Ready(value), + _marker: Default::default(), } } } -impl Join for Async { +impl<B: BlockOn> Join for Async<B> { type Effect = Self; fn two<'a, T0, T1>( @@ -229,7 +240,7 @@ impl Join for Async { } } -impl TryJoin for Async { +impl<B: BlockOn> TryJoin for Async<B> { type Effect = Self; fn two<'a, T0, T1, F0, F1>( |