Diffstat (limited to 'src/protocol/visitor/value.rs')
| -rw-r--r-- | src/protocol/visitor/value.rs | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/src/protocol/visitor/value.rs b/src/protocol/visitor/value.rs index 3cb8908..ed8a8ec 100644 --- a/src/protocol/visitor/value.rs +++ b/src/protocol/visitor/value.rs @@ -5,13 +5,13 @@ use crate::{ any::{TypeName, TypeNameable}, nameable, - protocol::{walker::HintMeta, ControlFlow}, + protocol::{walker::HintMeta, ControlFlowFor, Effect, SyncEffect}, }; /// Trait object for the [`Value`] protocol. /// /// Types implementing the [`Value`] protocol will implement this trait. -pub trait Value<T> { +pub trait Value<'a, T, E: Effect = SyncEffect> { /// Visit a value of type `T`. /// /// Use this to give a value to a visitor. Its expected that a walker @@ -21,30 +21,41 @@ pub trait Value<T> { /// 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(&mut self, value: T) -> ControlFlow; + fn visit(&'a mut self, value: T) -> ControlFlowFor<'a, E>; } nameable! { - pub struct Name['a, 'ctx, T]; - impl [T::Name] for dyn Value<T> + 'a where { T: TypeNameable<'a, 'ctx> + ?Sized } - impl [T] where dyn Value<T::Nameable> + 'a { T: TypeName<'a, 'ctx> + ?Sized } + pub struct Name['a, 'ctx, T, E]; + + impl [T::Name, E] for dyn Value<'a, T, E> + 'a where { + T: TypeNameable<'a, 'ctx> + ?Sized, + E: Effect + 'static, + } + + impl [T, E] where dyn Value<'a, T::Nameable, E> + 'a { + T: TypeName<'a, 'ctx> + ?Sized, + E: Effect + 'static, + } } // This enrolls the Value protocol into the walker hint system. -impl<'ctx, T> HintMeta<'ctx> for dyn Value<T> + '_ { +impl<'ctx, T, E: Effect> HintMeta<'ctx> for dyn Value<'_, T, E> + '_ { type Known<'a> = () where 'ctx: 'a; - type Hint = (); + type Hint<'a> = () where 'ctx: 'a; } #[cfg(test)] mod test { + use core::ops::ControlFlow; + use crate::{ any::{ static_wrapper::{BorrowedMutStatic, BorrowedStatic, OwnedStatic}, AnyTrait, }, any_trait, + protocol::SyncControlFlow, }; use super::*; @@ -53,15 +64,21 @@ mod test { fn visit() { struct Visitor(Option<i32>); - impl Value<OwnedStatic<i32>> for Visitor { - fn visit(&mut self, OwnedStatic(value): OwnedStatic<i32>) -> ControlFlow<()> { + impl Value<'_, OwnedStatic<i32>, SyncControlFlow> for Visitor { + fn visit( + &mut self, + OwnedStatic(value): OwnedStatic<i32>, + ) -> core::ops::ControlFlow<()> { self.0 = Some(value); ControlFlow::Continue(()) } } - impl Value<BorrowedStatic<'_, i32>> for Visitor { - fn visit(&mut self, BorrowedStatic(value): BorrowedStatic<'_, i32>) -> ControlFlow<()> { + impl Value<'_, BorrowedStatic<'_, i32>, SyncControlFlow> for Visitor { + fn visit( + &mut self, + BorrowedStatic(value): BorrowedStatic<'_, i32>, + ) -> core::ops::ControlFlow<()> { self.0 = Some(*value); ControlFlow::Continue(()) } @@ -69,15 +86,15 @@ mod test { any_trait! { impl['a, 'ctx] Visitor = [ - dyn Value<OwnedStatic<i32>>, - dyn Value<BorrowedStatic<'ctx, i32>>, + dyn Value<'a, OwnedStatic<i32>, SyncControlFlow> + 'a, + dyn Value<'a, BorrowedStatic<'ctx, i32, SyncControlFlow>> + 'a, ]; } let mut v = Visitor(None); let object: &mut dyn AnyTrait<'_> = &mut v; object - .upcast_mut::<dyn Value<OwnedStatic<i32>>>() + .upcast_mut::<dyn Value<'_, OwnedStatic<i32, SyncControlFlow>>>() .unwrap() .visit(OwnedStatic(42)); @@ -85,7 +102,7 @@ mod test { let object: &mut dyn AnyTrait<'_> = &mut v; object - .upcast_mut::<dyn Value<BorrowedStatic<'_, i32>>>() + .upcast_mut::<dyn Value<'_, BorrowedStatic<'_, i32, SyncControlFlow>>>() .unwrap() .visit(BorrowedStatic(&101)); |