Diffstat (limited to 'src/walk.rs')
| -rw-r--r-- | src/walk.rs | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/walk.rs b/src/walk.rs index 10f96cd..fa7fcae 100644 --- a/src/walk.rs +++ b/src/walk.rs @@ -2,13 +2,15 @@ pub mod walkers; use core::fmt::Debug; -use effectful::{bound::{IsSend, IsSync}, environment::{DynBind, Environment, NativeForm}}; - -use crate::{ - protocol::DynVisitor, - Flow, +use effectful::{ + bound::{IsSend, IsSync}, + effective::Effective, + environment::{DynBind, Environment, NativeForm}, + higher_ranked::Mut, }; +use crate::{protocol::DynVisitor, Flow}; + /// A type that can be walked. pub trait Walk<'ctx, M, E: Environment>: Sized { /// The walker for the type. @@ -82,9 +84,15 @@ pub struct DynWalkerAdapter<'ctx, W: Walker<'ctx, E>, E: Environment> { state: DynWalkerState<'ctx, W, E>, } -unsafe impl<'ctx, W: Walker<'ctx, E>, E: Environment> IsSend<E::NeedSend> for DynWalkerAdapter<'ctx, W, E> {} +unsafe impl<'ctx, W: Walker<'ctx, E>, E: Environment> IsSend<E::NeedSend> + for DynWalkerAdapter<'ctx, W, E> +{ +} -unsafe impl<'ctx, W: Walker<'ctx, E>, E: Environment> IsSync<E::NeedSync> for DynWalkerAdapter<'ctx, W, E> {} +unsafe impl<'ctx, W: Walker<'ctx, E>, E: Environment> IsSync<E::NeedSync> + for DynWalkerAdapter<'ctx, W, E> +{ +} impl<'ctx, W: Walker<'ctx, E>, E: Environment> DynWalkerAdapter<'ctx, W, E> { #[inline(always)] @@ -115,7 +123,9 @@ impl<'ctx, W: Walker<'ctx, E>, E: Environment> DynWalkerAdapter<'ctx, W, E> { } } -impl<'ctx, W: Walker<'ctx, E>, E: Environment> WalkerObjSafe<'ctx, E> for DynWalkerAdapter<'ctx, W, E> { +impl<'ctx, W: Walker<'ctx, E>, E: Environment> WalkerObjSafe<'ctx, E> + for DynWalkerAdapter<'ctx, W, E> +{ #[inline(always)] fn walk<'a: 'c, 'b: 'c, 'c>( &'a mut self, @@ -128,11 +138,11 @@ impl<'ctx, W: Walker<'ctx, E>, E: Environment> WalkerObjSafe<'ctx, E> for DynWal core::mem::replace(&mut self.state, DynWalkerState::Walking) { E::value((self, visitor)) - .update(|(this, visitor)| { + .update(walker, |walker, (this, visitor)| { // Walk the walker. walker .walk(visitor.cast()) - .map(|value| match value { + .map(this, |this, value| match value { Ok(value) => { this.state = DynWalkerState::Done(value); Flow::Done @@ -147,7 +157,7 @@ impl<'ctx, W: Walker<'ctx, E>, E: Environment> WalkerObjSafe<'ctx, E> for DynWal }) .cast() }) - .map(|(_, value)| value) + .map((), |_, (_, value)| value) .cast() } else { // Can't do anything if the walker has already been walked. |