Diffstat (limited to 'src/protocol/visitor/request_hint.rs')
| -rw-r--r-- | src/protocol/visitor/request_hint.rs | 37 |
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() } |