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