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