Diffstat (limited to 'src/walk.rs')
| -rw-r--r-- | src/walk.rs | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/src/walk.rs b/src/walk.rs index 441410f..159e9ea 100644 --- a/src/walk.rs +++ b/src/walk.rs @@ -46,10 +46,10 @@ pub trait Walker<'ctx, E: Effect>: WalkerTypes + Send + Sync { } pub trait WalkerObjSafe<'ctx, E: Effect>: Send { - fn walk<'a, 'b: 'a>( + fn walk<'a: 'c, 'b: 'c, 'c>( &'a mut self, visitor: DynVisitor<'b, 'ctx>, - ) -> ErasedEffective<'b, Flow, E> + ) -> ErasedEffective<'c, Flow, E> where Self: 'a; } @@ -98,7 +98,7 @@ impl<W: WalkerTypes> DynWalkerAdapter<W> { } #[inline(always)] - pub fn into_innter(self) -> Result<W, DynWalkerError<W>> { + pub fn into_inner(self) -> Result<W, DynWalkerError<W>> { match self.state { DynWalkerState::Walking => Err(DynWalkerError::WalkNeverFinished), DynWalkerState::Pending(walker) => Ok(walker), @@ -110,33 +110,41 @@ impl<W: WalkerTypes> DynWalkerAdapter<W> { impl<'ctx, W: Walker<'ctx, E>, E: Effect> WalkerObjSafe<'ctx, E> for DynWalkerAdapter<W> { #[inline(always)] - fn walk<'a, 'b: 'a>(&'a mut self, visitor: DynVisitor<'b, 'ctx>) -> ErasedEffective<'b, Flow, E> + fn walk<'a: 'c, 'b: 'c, 'c>( + &'a mut self, + visitor: DynVisitor<'b, 'ctx>, + ) -> ErasedEffective<'c, Flow, E> where Self: 'a, { - 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 - // } - // }) + if let DynWalkerState::Pending(walker) = + core::mem::replace(&mut self.state, DynWalkerState::Walking) + { + E::ready((self, visitor)) + .as_ctx(|(this, visitor)| { + // Walk the walker. + walker + .walk(visitor.cast()) + .map(|value| match value { + Ok(value) => { + this.state = DynWalkerState::Done(value); + Flow::Done + } + Err(err) => { + this.state = DynWalkerState::Err(err); + + // Signal that control flow should stop as soon as possible as we + // are in an error state. + Flow::Err + } + }) + .into_erased() + }) + .map(|(_, value)| value) + .into_erased() + } else { + // Can't do anything if the walker has already been walked. + E::ready(Flow::Done).into_erased() + } } } |