Diffstat (limited to 'src/protocol/visitor/value.rs')
| -rw-r--r-- | src/protocol/visitor/value.rs | 67 |
1 files changed, 36 insertions, 31 deletions
diff --git a/src/protocol/visitor/value.rs b/src/protocol/visitor/value.rs index 320d1ae..20438bb 100644 --- a/src/protocol/visitor/value.rs +++ b/src/protocol/visitor/value.rs @@ -5,13 +5,14 @@ use crate::{ any::{TypeName, TypeNameable}, nameable, - protocol::{walker::HintMeta, ControlFlowFor, Effect, SyncEffect}, + protocol::{walker::HintMeta, ControlFlowFor, Effect, SyncEffect, any_t}, + hkt::hkt, }; /// Trait object for the [`Value`] protocol. /// /// Types implementing the [`Value`] protocol will implement this trait. -pub trait Value<'a, 'ctx: 'a, T, E: Effect<'ctx> = SyncEffect> { +pub trait Value<'ctx, T, E: Effect<'ctx> = SyncEffect> { /// Visit a value of type `T`. /// /// Use this to give a value to a visitor. Its expected that a walker @@ -21,26 +22,30 @@ pub trait Value<'a, 'ctx: 'a, T, E: Effect<'ctx> = SyncEffect> { /// If a [`ControlFlow::Break`] is returned then the walker /// should stop walking as soon as possible as there has likely been /// and error. - fn visit(&'a mut self, value: T) -> ControlFlowFor<'a, 'ctx, E>; + fn visit<'a>(&'a mut self, value: T) -> ControlFlowFor<'a, 'ctx, E> where 'ctx: 'a; } nameable! { - pub struct Name['a, 'ctx: 'a, T, E]; + pub struct Name['a, 'ctx, T, E]; - impl [T::Name, E] for dyn Value<'a, 'ctx, T, E> + 'a where { + impl [T::Name, E] for dyn Value<'ctx, T, E> + 'a where { T: TypeNameable<'a, 'ctx> + ?Sized, E: Effect<'ctx>, + 'ctx: 'a, } - impl [T, E] where dyn Value<'a, 'ctx, T::Nameable, E> + 'a { + impl [T, E] where dyn Value<'ctx, T::Nameable, E> + 'a { T: TypeName<'a, 'ctx> + ?Sized, E: Effect<'ctx>, + 'ctx: 'a, } } +hkt!((any_t): for<'a, 'ctx> pub KnownHkt => ()); + // This enrolls the Value protocol into the walker hint system. -impl<'a, 'ctx: 'a, T, E: Effect<'ctx>> HintMeta<'a, 'ctx> for dyn Value<'a, 'ctx, T, E> + 'a { - type Known = (); +impl<'a, 'ctx: 'a, T, E: Effect<'ctx>> HintMeta<'ctx> for dyn Value<'ctx, T, E> + 'a { + type KnownHkt = KnownHkt<'ctx>; type Hint = (); } @@ -63,21 +68,21 @@ mod test { fn visit() { struct Visitor(Option<i32>); - impl Value<'_, OwnedStatic<i32>> for Visitor { - fn visit( - &mut self, + impl<'ctx> Value<'ctx, OwnedStatic<i32>> for Visitor { + fn visit<'a>( + &'a mut self, OwnedStatic(value): OwnedStatic<i32>, - ) -> core::ops::ControlFlow<()> { + ) -> core::ops::ControlFlow<()> where 'ctx: 'a { self.0 = Some(value); ControlFlow::Continue(()) } } - impl Value<'_, BorrowedStatic<'_, i32>> for Visitor { - fn visit( - &mut self, - BorrowedStatic(value): BorrowedStatic<'_, i32>, - ) -> core::ops::ControlFlow<()> { + impl<'ctx> Value<'ctx, BorrowedStatic<'ctx, i32>> for Visitor { + fn visit<'a>( + &'a mut self, + BorrowedStatic(value): BorrowedStatic<'ctx, i32>, + ) -> core::ops::ControlFlow<()> where 'ctx: 'a { self.0 = Some(*value); ControlFlow::Continue(()) } @@ -85,9 +90,9 @@ mod test { any_trait! { impl['a, 'ctx] Visitor = [ - dyn Value<'a, OwnedStatic<i32>> + 'a, - dyn Value<'a, BorrowedStatic<'ctx, i32>> + 'a, - ]; + dyn Value<'ctx, OwnedStatic<i32>> + 'a, + dyn Value<'ctx, BorrowedStatic<'ctx, i32>> + 'a, + ] } let mut v = Visitor(None); @@ -112,11 +117,11 @@ mod test { fn visit_borrowed() { struct Visitor<'ctx>(Option<&'ctx mut String>); - impl<'a, 'ctx> Value<'a, BorrowedMutStatic<'ctx, String>> for Visitor<'ctx> { - fn visit( + impl<'ctx> Value<'ctx, BorrowedMutStatic<'ctx, String>> for Visitor<'ctx> { + fn visit<'a>( &'a mut self, BorrowedMutStatic(value): BorrowedMutStatic<'ctx, String>, - ) -> ControlFlow<()> { + ) -> ControlFlow<()> where 'ctx: 'a { self.0 = Some(value); ControlFlow::Continue(()) } @@ -124,8 +129,8 @@ mod test { any_trait! { impl['a, 'ctx] Visitor<'ctx> = [ - dyn Value<'a, BorrowedMutStatic<'ctx, String>> + 'a, - ]; + dyn Value<'ctx, BorrowedMutStatic<'ctx, String>> + 'a, + ] } let mut v = Visitor(None); @@ -145,11 +150,11 @@ mod test { fn visit_borrowed_unsized() { struct Visitor<'ctx>(Option<&'ctx str>); - impl<'a, 'ctx> Value<'a, BorrowedStatic<'ctx, str>> for Visitor<'ctx> { - fn visit( + impl<'ctx> Value<'ctx, BorrowedStatic<'ctx, str>> for Visitor<'ctx> { + fn visit<'a>( &'a mut self, BorrowedStatic(value): BorrowedStatic<'ctx, str>, - ) -> ControlFlow<()> { + ) -> ControlFlow<()> where 'ctx: 'a { self.0 = Some(value); ControlFlow::Continue(()) } @@ -157,8 +162,8 @@ mod test { any_trait! { impl['a, 'ctx] Visitor<'ctx> = [ - dyn Value<'a, BorrowedStatic<'ctx, str>> + 'a, - ]; + dyn Value<'ctx, BorrowedStatic<'ctx, str>> + 'a, + ] } let mut v = Visitor(None); @@ -166,7 +171,7 @@ mod test { let y = String::from("abc"); let object: &mut dyn AnyTrait<'_> = &mut v; object - .upcast_mut::<dyn Value<'_, BorrowedStatic<'_, str>>>() + .upcast_mut::<dyn Value<'_, BorrowedStatic<'_, str>> + '_>() .unwrap() .visit(BorrowedStatic(&y)); |