Diffstat (limited to 'src/protocol/visitor/request_hint.rs')
| -rw-r--r-- | src/protocol/visitor/request_hint.rs | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/src/protocol/visitor/request_hint.rs b/src/protocol/visitor/request_hint.rs index ea22b7a..e72b1a9 100644 --- a/src/protocol/visitor/request_hint.rs +++ b/src/protocol/visitor/request_hint.rs @@ -1,46 +1,39 @@ use effectful::{ - effective::{Canonical, Effective}, environment::Environment, DynBind, SendSync + effective::{Canonical, Effective}, environment::Environment, DynBind }; use crate::{ any::type_name, - hkt::Marker, protocol::{DynVisitor, DynWalker}, }; use super::VisitResult; /// Protocol for requesting a hint from a visitor. -pub trait RequestHint<'ctx, E: Environment>: DynBind<E> { +pub trait RequestHint<'src, E: Environment>: DynBind<E> { /// Call this to request a hint. /// /// `walker` is what the visitor (`self`) will call to give a hint using the /// [`Hint`][crate::builtins::walker::Hint] protocol. - fn request_hint<'this: 'e, 'walker: 'e, 'lt: 'e, 'e>( - &'this mut self, - walker: DynWalker<'walker, 'lt, 'ctx, E>, - ) -> Canonical<'e, VisitResult, E> - where - 'ctx: 'this + 'walker; + fn request_hint<'r>( + &'r mut self, + walker: DynWalker<'r, 'src, E>, + ) -> Canonical<'r, VisitResult, E>; } -const _: () = { - pub struct RequestHintProto<E: Environment>(Marker<E>); - - impl<'a, 'ctx, E> type_name::Lower<'a, 'ctx, &'a &'ctx ()> for RequestHintProto<E> - where - E: Environment, - { - type Lowered = dyn RequestHint<'ctx, E> + 'a; - } +impl<'u, 'src, E> type_name::Lower<'u, 'src, &'u &'src ()> for dyn RequestHint<'static, E> +where + E: Environment, +{ + type Lowered = dyn RequestHint<'src, E> + 'u; +} - impl<'a, 'ctx, E> type_name::Raise<'a, 'ctx, &'a &'ctx ()> for dyn RequestHint<'ctx, E> + 'a - where - E: Environment, - { - type Raised = RequestHintProto<E>; - } -}; +impl<'u, 'src, E> type_name::Raise<'u, 'src, &'u &'src ()> for dyn RequestHint<'src, E> + 'u +where + E: Environment, +{ + type Raised = dyn RequestHint<'static, E>; +} /// Visit using the [`RequestHint`] protocol. /// @@ -49,16 +42,14 @@ const _: () = { /// If [`Flow::Done`] is returned then the visitor doesn't need any more information and the walker /// should stop walking. /// If [`Flow::Break`] is returned then there was an error and the walker should stop walking. -pub fn request_hint<'ctx: 'visitor + 'walker, 'visitor: 'e, 'lt: 'e, 'lt2: 'e, 'walker: 'e, 'e, E: Environment>( - visitor: DynVisitor<'visitor, 'lt, 'ctx, E>, - walker: DynWalker<'walker, 'lt2, 'ctx, E>, -) -> Canonical<'e, VisitResult<DynWalker<'walker, 'lt2, 'ctx, E>>, E> { +pub fn request_hint<'r, 'src, E: Environment>( + visitor: DynVisitor<'r, 'src, E>, + walker: DynWalker<'r, 'src, E>, +) -> Canonical<'r, VisitResult<DynWalker<'r, 'src, E>>, E> { E::value((visitor, walker)) .update_map((), |_, (visitor, walker)| { if let Some(object) = visitor - .0 - .cast_mut() - .upcast_mut::<dyn RequestHint<'ctx, E>>() + .upcast_mut::<dyn RequestHint<'src, E> + '_>() { // Allow the visitor to give a hint if it wants. object |