Diffstat (limited to 'src/protocol.rs')
-rw-r--r--src/protocol.rs106
1 files changed, 60 insertions, 46 deletions
diff --git a/src/protocol.rs b/src/protocol.rs
index 7ff6988..4ad6d8d 100644
--- a/src/protocol.rs
+++ b/src/protocol.rs
@@ -35,14 +35,14 @@
use core::{
future::Future,
+ marker::PhantomData,
pin::{pin, Pin},
ptr,
task::{Context, Poll, RawWaker, RawWakerVTable, Waker},
- marker::PhantomData,
};
use crate::any::AnyTrait;
-use crate::hkt::{type_class, hkt};
+use crate::hkt::{hkt, type_class};
pub mod visitor;
pub mod walker;
@@ -50,25 +50,18 @@ pub mod walker;
#[cfg(all(feature = "alloc", not(feature = "std")))]
use alloc::boxed::Box;
-pub type Visitor<'a, 'ctx, Effect> = any_trait_send_obj::T<'a, 'ctx, <Effect as self::Effect<'ctx>>::VisitorHkt>;
-pub type Walker<'a, 'ctx, Effect> = any_trait_send_obj::T<'a, 'ctx, <Effect as self::Effect<'ctx>>::WalkerHkt>;
-
-pub trait AnyTraitObj<'a, 'ctx: 'a>: AnyTraitSendObj<'a, 'ctx> {
- fn from_obj(value: &'a mut (dyn AnyTrait<'ctx> + 'a)) -> Self;
-}
+pub type Visitor<'a, 'ctx, Effect> =
+ as_obj::T<'a, 'ctx, <Effect as self::EffectAnyTrait<'ctx>>::AnyTrait>;
+pub type Walker<'a, 'ctx, Effect> =
+ as_obj::T<'a, 'ctx, <Effect as self::EffectAnyTrait<'ctx>>::AnyTrait>;
-pub trait AnyTraitSendObj<'a, 'ctx: 'a> {
- fn from_obj_send(value: &'a mut (dyn AnyTrait<'ctx> + Send + 'a)) -> Self;
+pub trait AsObj<'a, 'ctx: 'a> {
fn as_obj(&self) -> &dyn AnyTrait<'ctx>;
fn as_obj_mut(&mut self) -> &mut dyn AnyTrait<'ctx>;
fn into_obj(self) -> &'a mut dyn AnyTrait<'ctx>;
}
-impl<'a, 'ctx: 'a> AnyTraitSendObj<'a, 'ctx> for &'a mut (dyn AnyTrait<'ctx> + 'a) {
- fn from_obj_send(value: &'a mut (dyn AnyTrait<'ctx> + Send + 'a)) -> Self {
- value
- }
-
+impl<'a, 'ctx: 'a> AsObj<'a, 'ctx> for &'a mut (dyn AnyTrait<'ctx> + 'a) {
fn as_obj(&self) -> &dyn AnyTrait<'ctx> {
*self
}
@@ -82,11 +75,7 @@ impl<'a, 'ctx: 'a> AnyTraitSendObj<'a, 'ctx> for &'a mut (dyn AnyTrait<'ctx> + '
}
}
-impl<'a, 'ctx: 'a> AnyTraitSendObj<'a, 'ctx> for &'a mut (dyn AnyTrait<'ctx> + Send + 'a) {
- fn from_obj_send(value: &'a mut (dyn AnyTrait<'ctx> + Send + 'a)) -> Self {
- value
- }
-
+impl<'a, 'ctx: 'a> AsObj<'a, 'ctx> for &'a mut (dyn AnyTrait<'ctx> + Send + 'a) {
fn as_obj(&self) -> &dyn AnyTrait<'ctx> {
*self
}
@@ -100,43 +89,65 @@ impl<'a, 'ctx: 'a> AnyTraitSendObj<'a, 'ctx> for &'a mut (dyn AnyTrait<'ctx> + S
}
}
-impl<'a, 'ctx: 'a> AnyTraitObj<'a, 'ctx> for &'a mut (dyn AnyTrait<'ctx> + 'a) {
- fn from_obj(value: &'a mut (dyn AnyTrait<'ctx> + 'a)) -> Self {
- value
- }
-}
-
-type_class!(for<'lt, 'ctx> pub any_trait_send_obj: AnyTraitSendObj<'lt, 'ctx>);
+type_class!(for<'lt, 'ctx> pub as_obj: AsObj<'lt, 'ctx>);
type_class!(for<'lt, 'ctx> pub any_t);
-pub trait Effect<'ctx, C = (), B = ()>: 'static {
- type VisitorHkt: any_trait_send_obj::Hkt<'ctx>;
- type WalkerHkt: any_trait_send_obj::Hkt<'ctx>;
- type ControlFlowHkt: any_t::Hkt<'ctx>;
+pub trait EffectAnyTrait<'ctx>: 'static {
+ /// The `dyn AnyTrait<'ctx>` for the effect.
+ ///
+ /// this allows adding extra bounds to the trait object.
+ type AnyTrait: as_obj::Hkt<'ctx>;
}
-pub type ControlFlowFor<'a, 'ctx, E = SyncEffect, C = (), B = ()> =
- any_t::T<'a, 'ctx, <E as Effect<'ctx, C, B>>::ControlFlowHkt>;
+/// Trait for effects.
+pub trait Effect<'ctx, T>: EffectAnyTrait<'ctx> {
+ /// The type functions return for this effect.
+ ///
+ /// This type should resolve into a `T`.
+ type Yield: any_t::Hkt<'ctx>;
+}
+
+pub type Yield<'a, 'ctx, T, E> = any_t::T<'a, 'ctx, <E as Effect<'ctx, T>>::Yield>;
pub enum SyncEffect {}
-hkt!((any_trait_send_obj): for<'a, 'ctx> pub AnyTraitSendObjHkt => &'a mut (dyn AnyTrait<'ctx> + Send + 'a));
-hkt!((any_trait_send_obj): for<'a, 'ctx> pub AnyTraitObjHkt => &'a mut (dyn AnyTrait<'ctx> + 'a));
+hkt!((as_obj): for<'a, 'ctx> pub AnyTraitSendObj => &'a mut (dyn AnyTrait<'ctx> + Send + 'a));
+hkt!((as_obj): for<'a, 'ctx> pub AnyTraitObj => &'a mut (dyn AnyTrait<'ctx> + 'a));
-hkt!((any_t): for<'a, 'ctx> pub SyncControlFlowHkt[C, B] => core::ops::ControlFlow<B, C>);
+hkt!((any_t): for<'a, 'ctx> pub SyncYield[T] => T);
-impl<'ctx, C, B> Effect<'ctx, C, B> for SyncEffect {
- type ControlFlowHkt = SyncControlFlowHkt<'ctx, C, B>;
+impl<'ctx, T> Effect<'ctx, T> for SyncEffect {
+ type Yield = SyncYield<'ctx, T>;
+}
- type VisitorHkt = AnyTraitObjHkt<'ctx>;
+impl<'ctx> EffectAnyTrait<'ctx> for SyncEffect {
+ type AnyTrait = AnyTraitObj<'ctx>;
+}
- type WalkerHkt = AnyTraitObjHkt<'ctx>;
+#[cfg(feature = "alloc")]
+hkt!((any_t): for<'a, 'ctx> pub AsyncSendYield[T] =>
+ core::pin::Pin<
+ Box<dyn core::future::Future<Output = T> + Send + 'a>,
+ >
+);
+
+#[cfg(feature = "alloc")]
+pub enum AsyncSendEffect {}
+
+#[cfg(feature = "alloc")]
+impl<'ctx, T> Effect<'ctx, T> for AsyncSendEffect {
+ type Yield = AsyncSendYield<'ctx, T>;
+}
+
+#[cfg(feature = "alloc")]
+impl<'ctx> EffectAnyTrait<'ctx> for AsyncSendEffect {
+ type AnyTrait = AnyTraitSendObj<'ctx>;
}
#[cfg(feature = "alloc")]
-hkt!((any_t): for<'a, 'ctx> pub AsyncControlFlowHkt[C, B] =>
+hkt!((any_t): for<'a, 'ctx> pub AsyncYield[T] =>
core::pin::Pin<
- Box<dyn core::future::Future<Output = core::ops::ControlFlow<B, C>> + Send + 'a>,
+ Box<dyn core::future::Future<Output = T> + 'a>,
>
);
@@ -144,8 +155,11 @@ hkt!((any_t): for<'a, 'ctx> pub AsyncControlFlowHkt[C, B] =>
pub enum AsyncEffect {}
#[cfg(feature = "alloc")]
-impl<'ctx, C, B> Effect<'ctx, C, B> for AsyncEffect {
- type VisitorHkt = AnyTraitSendObjHkt<'ctx>;
- type WalkerHkt = AnyTraitSendObjHkt<'ctx>;
- type ControlFlowHkt = AsyncControlFlowHkt<'ctx, C, B>;
+impl<'ctx, T> Effect<'ctx, T> for AsyncEffect {
+ type Yield = AsyncYield<'ctx, T>;
+}
+
+#[cfg(feature = "alloc")]
+impl<'ctx> EffectAnyTrait<'ctx> for AsyncEffect {
+ type AnyTrait = AnyTraitObj<'ctx>;
}