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