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