Diffstat (limited to 'src/protocol.rs')
| -rw-r--r-- | src/protocol.rs | 77 |
1 files changed, 28 insertions, 49 deletions
diff --git a/src/protocol.rs b/src/protocol.rs index b330750..467cee7 100644 --- a/src/protocol.rs +++ b/src/protocol.rs @@ -57,102 +57,81 @@ pub mod walker; use core::ops::{Deref, DerefMut}; -use effectful::{environment::Environment, SendSync}; +use effectful::{bound::SsBound, DynBind, SendSync}; use crate::any::AnyTrait; -use effectful::environment::DynBind; -use effectful::environment::EnvConfig; -pub trait AnyTraitDynBind<'a, 'ctx, E: EnvConfig>: AnyTrait<'ctx> + DynBind<E> { - fn cast(&self) -> &(dyn AnyTrait<'ctx> + 'a); - fn cast_mut(&mut self) -> &mut (dyn AnyTrait<'ctx> + 'a); - fn cast_mut2(&mut self) -> &mut dyn AnyTrait<'ctx>; - - fn cast_bind_mut<'b>(&'b mut self) -> &'b mut (dyn AnyTraitDynBind<'b, 'ctx, E> + 'b) - where - 'a: 'b; +pub trait AnyTraitDynBind<'lt, 'ctx: 'lt, E: SsBound + 'lt>: AnyTrait<'lt, 'ctx> + DynBind<E> + 'lt { + fn cast(&self) -> &(dyn AnyTrait<'lt, 'ctx> + 'lt); + fn cast_mut(&mut self) -> &mut (dyn AnyTrait<'lt, 'ctx> + 'lt); } -impl<'a, 'ctx, E: EnvConfig, T> AnyTraitDynBind<'a, 'ctx, E> for T +impl<'lt, 'ctx, E, T> AnyTraitDynBind<'lt, 'ctx, E> for T where - T: AnyTrait<'ctx> + DynBind<E> + 'a, + E: SsBound + 'lt, + T: AnyTrait<'lt, 'ctx> + DynBind<E> + 'lt, + 'ctx: 'lt, { - fn cast(&self) -> &(dyn AnyTrait<'ctx> + 'a) { - self - } - - fn cast_mut(&mut self) -> &mut (dyn AnyTrait<'ctx> + 'a) { - self - } - - fn cast_mut2(&mut self) -> &mut dyn AnyTrait<'ctx> { + fn cast(&self) -> &(dyn AnyTrait<'lt, 'ctx> + 'lt) { self } - fn cast_bind_mut<'b>(&'b mut self) -> &'b mut (dyn AnyTraitDynBind<'b, 'ctx, E> + 'b) - where - 'a: 'b, - { + fn cast_mut(&mut self) -> &mut (dyn AnyTrait<'lt, 'ctx> + 'lt) { self } } #[derive(SendSync)] -pub struct DynVisitor<'a, 'ctx, E: EnvConfig>(pub &'a mut (dyn AnyTraitDynBind<'a, 'ctx, E> + 'a)); +pub struct DynVisitor<'a, 'lt, 'ctx, E: SsBound>(pub &'a mut (dyn AnyTraitDynBind<'lt, 'ctx, E> + 'lt)); -impl<'a, 'ctx, E: EnvConfig> DynVisitor<'a, 'ctx, E> { - pub fn cast<'b>(&'b mut self) -> DynVisitor<'b, 'ctx, E> { - DynVisitor(self.0.cast_bind_mut()) +impl<'a, 'lt, 'ctx, E: SsBound> DynVisitor<'a, 'lt, 'ctx, E> { + pub fn cast(&mut self) -> DynVisitor<'_, 'lt, 'ctx, E> { + DynVisitor(self.0) } } -impl<'a, 'ctx, E: EnvConfig> Deref for DynVisitor<'a, 'ctx, E> { - type Target = dyn AnyTrait<'ctx> + 'a; +impl<'a, 'lt, 'ctx, E: SsBound> Deref for DynVisitor<'a, 'lt, 'ctx, E> { + type Target = dyn AnyTrait<'lt, 'ctx> + 'lt; fn deref(&self) -> &Self::Target { self.0.cast() } } -impl<'a, 'ctx, E: EnvConfig> DerefMut for DynVisitor<'a, 'ctx, E> { +impl<'a, 'lt, 'ctx, E: SsBound> DerefMut for DynVisitor<'a, 'lt, 'ctx, E> { fn deref_mut(&mut self) -> &mut Self::Target { self.0.cast_mut() } } -pub trait AsVisitor<'ctx, E: EnvConfig> { - fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'ctx, E> - where - 'ctx: 'a; +pub trait AsVisitor<'lt, 'ctx, E: SsBound> { + fn as_visitor(&mut self) -> DynVisitor<'_, 'lt, 'ctx, E>; } -impl<'b, 'ctx, E: EnvConfig> AsVisitor<'ctx, E> for DynVisitor<'b, 'ctx, E> { - fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'ctx, E> - where - 'ctx: 'a, - { +impl<'a, 'lt, 'ctx, E: SsBound> AsVisitor<'lt, 'ctx, E> for DynVisitor<'a, 'lt, 'ctx, E> { + fn as_visitor(&mut self) -> DynVisitor<'_, 'lt, 'ctx, E> { self.cast() } } #[derive(SendSync)] -pub struct DynWalker<'a, 'ctx, E: EnvConfig>(pub &'a mut (dyn AnyTraitDynBind<'a, 'ctx, E> + 'a)); +pub struct DynWalker<'a, 'lt, 'ctx, E: SsBound>(pub &'a mut (dyn AnyTraitDynBind<'lt, 'ctx, E> + 'lt)); -impl<'a, 'ctx, E: EnvConfig> DynWalker<'a, 'ctx, E> { - pub fn cast<'b>(&'b mut self) -> DynWalker<'b, 'ctx, E> { - DynWalker(self.0.cast_bind_mut()) +impl<'a, 'lt, 'ctx, E: SsBound> DynWalker<'a, 'lt, 'ctx, E> { + pub fn cast(&mut self) -> DynWalker<'_, 'lt, 'ctx, E> { + DynWalker(self.0) } } -impl<'a, 'ctx, E: EnvConfig> Deref for DynWalker<'a, 'ctx, E> { - type Target = dyn AnyTrait<'ctx> + 'a; +impl<'a, 'lt, 'ctx, E: SsBound> Deref for DynWalker<'a, 'lt, 'ctx, E> { + type Target = dyn AnyTrait<'lt, 'ctx> + 'lt; fn deref(&self) -> &Self::Target { self.0.cast() } } -impl<'a, 'ctx, E: EnvConfig> DerefMut for DynWalker<'a, 'ctx, E> { +impl<'a, 'lt, 'ctx, E: SsBound> DerefMut for DynWalker<'a, 'lt, 'ctx, E> { fn deref_mut(&mut self) -> &mut Self::Target { self.0.cast_mut() } |