Diffstat (limited to 'src/protocol.rs')
| -rw-r--r-- | src/protocol.rs | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/protocol.rs b/src/protocol.rs index f06f095..26ec664 100644 --- a/src/protocol.rs +++ b/src/protocol.rs @@ -38,6 +38,28 @@ use crate::any::AnyTrait; pub mod visitor; pub mod walker; -pub type Visitor<'a, 'ctx> = &'a mut dyn AnyTrait<'ctx>; -pub type Walker<'a, 'ctx> = &'a mut dyn AnyTrait<'ctx>; -pub type ControlFlow<B = (), C = ()> = core::ops::ControlFlow<B, C>; +#[cfg(not(feature = "std"))] +use alloc::boxed::Box; + +pub type Visitor<'ctx> = dyn AnyTrait<'ctx>; +pub type Walker<'ctx> = dyn AnyTrait<'ctx>; + +pub trait Effect { + type ControlFlow<'a, C, B>; +} +pub type ControlFlowFor<'a, E = SyncEffect, C = (), B = ()> = <E as Effect>::ControlFlow<'a, C, B>; + +pub enum SyncEffect {} + +impl Effect for SyncEffect { + type ControlFlow<'a, C, B> = core::ops::ControlFlow<B, C>; +} + +#[cfg(feature = "alloc")] +pub enum AsyncEffect {} + +#[cfg(feature = "alloc")] +impl Effect for AsyncEffect { + type ControlFlow<'a, C, B> = + core::pin::Pin<Box<dyn core::future::Future<Output = core::ops::ControlFlow<B, C>> + 'a>>; +} |