Diffstat (limited to 'src/walk.rs')
| -rw-r--r-- | src/walk.rs | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/src/walk.rs b/src/walk.rs index 159e9ea..9f4a828 100644 --- a/src/walk.rs +++ b/src/walk.rs @@ -1,7 +1,7 @@ pub mod walkers; use crate::{ - effect::{Effect, Effective, ErasedEffective}, + effect::{all_ctx, merge_ctx, Effect, Effective, ErasedEffective}, protocol::DynVisitor, Flow, }; @@ -121,25 +121,29 @@ impl<'ctx, W: Walker<'ctx, E>, E: Effect> WalkerObjSafe<'ctx, E> for DynWalkerAd 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() - }) + .as_ctx( + all_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() + }, + merge_ctx, + ) .map(|(_, value)| value) .into_erased() } else { |