Diffstat (limited to 'src/protocol.rs')
-rw-r--r--src/protocol.rs38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/protocol.rs b/src/protocol.rs
index 238bbab..5889605 100644
--- a/src/protocol.rs
+++ b/src/protocol.rs
@@ -57,38 +57,40 @@ pub mod walker;
use core::ops::{Deref, DerefMut};
+use effectful::{bound::{IsSend, IsSync}, environment::Environment};
+
use crate::any::AnyTrait;
-pub struct DynVisitor<'a, 'ctx>(pub &'a mut (dyn AnyTrait<'ctx> + Send + Sync + 'a));
+pub struct DynVisitor<'a, 'ctx, Env: Environment>(pub &'a mut (dyn AnyTrait<'ctx, Env> + 'a));
-impl<'a, 'ctx> DynVisitor<'a, 'ctx> {
- pub fn cast<'b>(&'b mut self) -> DynVisitor<'b, 'ctx> {
+impl<'a, 'ctx, Env: Environment> DynVisitor<'a, 'ctx, Env> {
+ pub fn cast<'b>(&'b mut self) -> DynVisitor<'b, 'ctx, Env> {
DynVisitor(&mut *self.0)
}
}
-impl<'a, 'ctx> Deref for DynVisitor<'a, 'ctx> {
- type Target = dyn AnyTrait<'ctx> + Send + Sync + 'a;
+impl<'a, 'ctx, Env: Environment> Deref for DynVisitor<'a, 'ctx, Env> {
+ type Target = dyn AnyTrait<'ctx, Env> + 'a;
fn deref(&self) -> &Self::Target {
&*self.0
}
}
-impl<'a, 'ctx> DerefMut for DynVisitor<'a, 'ctx> {
+impl<'a, 'ctx, Env: Environment> DerefMut for DynVisitor<'a, 'ctx, Env> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut *self.0
}
}
-pub trait AsVisitor<'ctx> {
- fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'ctx>
+pub trait AsVisitor<'ctx, Env: Environment> {
+ fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'ctx, Env>
where
'ctx: 'a;
}
-impl<'b, 'ctx> AsVisitor<'ctx> for DynVisitor<'b, 'ctx> {
- fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'ctx>
+impl<'b, 'ctx, Env: Environment> AsVisitor<'ctx, Env> for DynVisitor<'b, 'ctx, Env> {
+ fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'ctx, Env>
where
'ctx: 'a,
{
@@ -96,23 +98,27 @@ impl<'b, 'ctx> AsVisitor<'ctx> for DynVisitor<'b, 'ctx> {
}
}
-pub struct DynWalker<'a, 'ctx>(pub &'a mut (dyn AnyTrait<'ctx> + Send + Sync + 'a));
+pub struct DynWalker<'a, 'ctx, Env: Environment>(pub &'a mut (dyn AnyTrait<'ctx, Env> + 'a));
+
+unsafe impl<'a, 'ctx, E: Environment> IsSend<E::NeedSend> for DynWalker<'a, 'ctx, E> {}
+
+unsafe impl<'a, 'ctx, E: Environment> IsSync<E::NeedSync> for DynWalker<'a, 'ctx, E> {}
-impl<'a, 'ctx> DynWalker<'a, 'ctx> {
- pub fn cast<'b>(&'b mut self) -> DynWalker<'b, 'ctx> {
+impl<'a, 'ctx, Env: Environment> DynWalker<'a, 'ctx, Env> {
+ pub fn cast<'b>(&'b mut self) -> DynWalker<'b, 'ctx, Env> {
DynWalker(&mut *self.0)
}
}
-impl<'a, 'ctx> Deref for DynWalker<'a, 'ctx> {
- type Target = dyn AnyTrait<'ctx> + Send + Sync + 'a;
+impl<'a, 'ctx, Env: Environment> Deref for DynWalker<'a, 'ctx, Env> {
+ type Target = dyn AnyTrait<'ctx, Env> + 'a;
fn deref(&self) -> &Self::Target {
&*self.0
}
}
-impl<'a, 'ctx> DerefMut for DynWalker<'a, 'ctx> {
+impl<'a, 'ctx, Env: Environment> DerefMut for DynWalker<'a, 'ctx, Env> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut *self.0
}