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