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