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