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