Diffstat (limited to 'src/protocol/visitor/request_hint.rs')
-rw-r--r--src/protocol/visitor/request_hint.rs37
1 files changed, 23 insertions, 14 deletions
diff --git a/src/protocol/visitor/request_hint.rs b/src/protocol/visitor/request_hint.rs
index 5adcf8c..2fd6255 100644
--- a/src/protocol/visitor/request_hint.rs
+++ b/src/protocol/visitor/request_hint.rs
@@ -1,4 +1,9 @@
-use effectful::{closure::Capture, environment::{DynBind, Environment, NativeForm}};
+use effectful::{
+ effective::Effective,
+ environment::{DynBind, Environment, NativeForm},
+ for_lt,
+ higher_ranked::Mut,
+};
use crate::{
any::TypeName,
@@ -50,17 +55,21 @@ pub fn request_hint<'ctx: 'visitor + 'walker, 'visitor: 'e, 'walker: 'e, 'e, E:
visitor: DynVisitor<'visitor, 'ctx, E>,
walker: DynWalker<'walker, 'ctx, E>,
) -> NativeForm<'e, VisitResult<DynWalker<'walker, 'ctx, E>>, E> {
- E::value(walker).update(Capture(visitor).fun_once(|visitor, walker, _| {
- if let Some(object) = visitor.0.upcast_mut::<RequestHintProto<E>>() {
- // Allow the visitor to give a hint if it wants.
- object
- .request_hint(walker.cast())
- .map(|x| x.unit_skipped())
- .cast()
- } else {
- // If the visitor doesn't support request hint then we continue.
- E::value(VisitResult::Skipped(())).cast()
- }
- }))
- .map(|((_, walker), result)| result.map_skipped(|_| walker))
+ E::value(walker)
+ .update(visitor, |visitor, walker| {
+ if let Some(object) = visitor.0.upcast_mut::<RequestHintProto<E>>() {
+ // Allow the visitor to give a hint if it wants.
+ object
+ .request_hint(walker.cast())
+ .map((), |_, x| x.unit_skipped())
+ .cast::<()>();
+
+ todo!()
+ } else {
+ // If the visitor doesn't support request hint then we continue.
+ E::value(VisitResult::Skipped(())).cast()
+ }
+ })
+ .map((), |_, (walker, result)| result.map_skipped(|_| walker))
+ .cast()
}