Diffstat (limited to 'src/walk.rs')
-rw-r--r--src/walk.rs59
1 files changed, 32 insertions, 27 deletions
diff --git a/src/walk.rs b/src/walk.rs
index 4c2042c..a7ace88 100644
--- a/src/walk.rs
+++ b/src/walk.rs
@@ -1,7 +1,7 @@
pub mod walkers;
use crate::{
- effect::{Effect, Future},
+ effect::{Effect, ObjSafe},
protocol::DynVisitor,
Flow,
};
@@ -40,13 +40,13 @@ pub trait Walker<'ctx, E: Effect>: WalkerTypes + Send + Sync {
fn walk<'a>(
self,
visitor: DynVisitor<'a, 'ctx>,
- ) -> Future<'a, Result<Self::Output, Self::Error>, E>
+ ) -> ObjSafe<'a, Result<Self::Output, Self::Error>, E>
where
Self: 'a;
}
pub trait WalkerObjSafe<'ctx, E: Effect>: Send {
- fn walk<'a>(&'a mut self, visitor: DynVisitor<'a, 'ctx>) -> Future<'a, Flow, E>
+ fn walk<'a>(&'a mut self, visitor: DynVisitor<'a, 'ctx>) -> ObjSafe<'a, Flow, E>
where
Self: 'a;
}
@@ -77,12 +77,14 @@ pub struct DynWalkerAdapter<W: WalkerTypes> {
}
impl<W: WalkerTypes> DynWalkerAdapter<W> {
+ #[inline(always)]
pub fn new(walker: W) -> Self {
Self {
state: DynWalkerState::Pending(walker),
}
}
+ #[inline(always)]
pub fn finish(self) -> Result<W::Output, DynWalkerError<W>> {
match self.state {
DynWalkerState::Walking => Err(DynWalkerError::WalkNeverFinished),
@@ -92,6 +94,7 @@ impl<W: WalkerTypes> DynWalkerAdapter<W> {
}
}
+ #[inline(always)]
pub fn into_innter(self) -> Result<W, DynWalkerError<W>> {
match self.state {
DynWalkerState::Walking => Err(DynWalkerError::WalkNeverFinished),
@@ -103,32 +106,34 @@ impl<W: WalkerTypes> DynWalkerAdapter<W> {
}
impl<'ctx, W: Walker<'ctx, E>, E: Effect> WalkerObjSafe<'ctx, E> for DynWalkerAdapter<W> {
- fn walk<'a>(&'a mut self, visitor: DynVisitor<'a, 'ctx>) -> Future<'a, Flow, E>
+ #[inline(always)]
+ fn walk<'a>(&'a mut self, visitor: DynVisitor<'a, 'ctx>) -> ObjSafe<'a, Flow, E>
where
Self: 'a,
{
- E::wrap(async {
- if let DynWalkerState::Pending(walker) =
- core::mem::replace(&mut self.state, DynWalkerState::Walking)
- {
- // Walk the walker.
- match walker.walk(visitor).await {
- Ok(value) => {
- self.state = DynWalkerState::Done(value);
- Flow::Done
- }
- Err(err) => {
- self.state = DynWalkerState::Err(err);
-
- // Signal that control flow should stop as soon as possible as we
- // are in an error state.
- Flow::Err
- }
- }
- } else {
- // Can't do anything if the walker has already been walked.
- Flow::Done
- }
- })
+ todo!()
+ // E::wrap(async {
+ // if let DynWalkerState::Pending(walker) =
+ // core::mem::replace(&mut self.state, DynWalkerState::Walking)
+ // {
+ // // Walk the walker.
+ // match walker.walk(visitor).await {
+ // Ok(value) => {
+ // self.state = DynWalkerState::Done(value);
+ // Flow::Done
+ // }
+ // Err(err) => {
+ // self.state = DynWalkerState::Err(err);
+ //
+ // // Signal that control flow should stop as soon as possible as we
+ // // are in an error state.
+ // Flow::Err
+ // }
+ // }
+ // } else {
+ // // Can't do anything if the walker has already been walked.
+ // Flow::Done
+ // }
+ // })
}
}