Diffstat (limited to 'src/protocol.rs')
| -rw-r--r-- | src/protocol.rs | 106 |
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>; } |