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