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