Diffstat (limited to 'src/protocol.rs')
-rw-r--r--src/protocol.rs95
1 files changed, 61 insertions, 34 deletions
diff --git a/src/protocol.rs b/src/protocol.rs
index 467cee7..0d4f597 100644
--- a/src/protocol.rs
+++ b/src/protocol.rs
@@ -12,7 +12,7 @@
//! | `char` | [`dyn Value<'_, OwnedStatic<T>, _>`][visitor::Value] |
//! | `String` | [`dyn Value<'_, OwnedStatic<T>, _>`][visitor::Value] |
//! | `Vec<u8>` | [`dyn Value<'_, OwnedStatic<T>, _>`][visitor::Value] |
-//! | `&'ctx str` | [`dyn Value<'ctx, BorrowedStatic<'ctx, T>, _>`][visitor::Value] |
+//! | `&'src str` | [`dyn Value<'ctx, BorrowedStatic<'ctx, T>, _>`][visitor::Value] |
//! | `&'ctx [u8]` | [`dyn Value<'ctx, BorrowedStatic<'ctx, T>, _>`][visitor::Value] |
//!
//!
@@ -59,80 +59,107 @@ use core::ops::{Deref, DerefMut};
use effectful::{bound::SsBound, DynBind, SendSync};
-use crate::any::AnyTrait;
+use crate::{any::AnyTrait, hkt::ImpliedBound};
-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);
+pub trait AnyTraitDynBind<'lt, E: SsBound>: AnyTrait<'lt> + DynBind<E> {
+ fn as_any_trait<'u>(&self) -> &(dyn AnyTrait<'lt> + 'u) where Self: 'u;
+ fn as_any_trait_mut<'u>(&mut self) -> &mut (dyn AnyTrait<'lt> + 'u) where Self: 'u;
}
-impl<'lt, 'ctx, E, T> AnyTraitDynBind<'lt, 'ctx, E> for T
+impl<'lt, E, T> AnyTraitDynBind<'lt, E> for T
where
- E: SsBound + 'lt,
- T: AnyTrait<'lt, 'ctx> + DynBind<E> + 'lt,
- 'ctx: 'lt,
+ E: SsBound,
+ T: AnyTrait<'lt> + DynBind<E>,
{
- fn cast(&self) -> &(dyn AnyTrait<'lt, 'ctx> + 'lt) {
+ fn as_any_trait<'u>(&self) -> &(dyn AnyTrait<'lt> + 'u) where Self: 'u {
self
}
- fn cast_mut(&mut self) -> &mut (dyn AnyTrait<'lt, 'ctx> + 'lt) {
+ fn as_any_trait_mut<'u>(&mut self) -> &mut (dyn AnyTrait<'lt> + 'u) where Self: 'u {
self
}
}
#[derive(SendSync)]
-pub struct DynVisitor<'a, 'lt, 'ctx, E: SsBound>(pub &'a mut (dyn AnyTraitDynBind<'lt, 'ctx, E> + 'lt));
+pub struct DynVisitor<'r, 'src, E: SsBound> {
+ _b: ImpliedBound<'r, 'src>,
+ any: &'r mut dyn AnyTraitDynBind<'src, E>,
+}
+
+impl<'r, 'src, E: SsBound> DynVisitor<'r, 'src, E> {
+ pub fn new(any: &'r mut dyn AnyTraitDynBind<'src, E>) -> Self {
+ DynVisitor {
+ any,
+ _b: ImpliedBound::NEW,
+ }
+ }
+
+ pub fn cast(&mut self) -> DynVisitor<'_, 'src, E> {
+ DynVisitor::new(self.any)
+ }
-impl<'a, 'lt, 'ctx, E: SsBound> DynVisitor<'a, 'lt, 'ctx, E> {
- pub fn cast(&mut self) -> DynVisitor<'_, 'lt, 'ctx, E> {
- DynVisitor(self.0)
+ pub fn into_inner(self) -> &'r mut dyn AnyTraitDynBind<'src, E> {
+ self.any
}
}
-impl<'a, 'lt, 'ctx, E: SsBound> Deref for DynVisitor<'a, 'lt, 'ctx, E> {
- type Target = dyn AnyTrait<'lt, 'ctx> + 'lt;
+impl<'r, 'src, E: SsBound> Deref for DynVisitor<'r, 'src, E> {
+ type Target = dyn AnyTrait<'src> + 'r;
fn deref(&self) -> &Self::Target {
- self.0.cast()
+ self.any.as_any_trait()
}
}
-impl<'a, 'lt, 'ctx, E: SsBound> DerefMut for DynVisitor<'a, 'lt, 'ctx, E> {
+impl<'r, 'src, E: SsBound> DerefMut for DynVisitor<'r, 'src, E> {
fn deref_mut(&mut self) -> &mut Self::Target {
- self.0.cast_mut()
+ self.any.as_any_trait_mut()
}
}
-pub trait AsVisitor<'lt, 'ctx, E: SsBound> {
- fn as_visitor(&mut self) -> DynVisitor<'_, 'lt, 'ctx, E>;
+pub trait AsVisitor<'src, E: SsBound> {
+ fn as_visitor(&mut self) -> DynVisitor<'_, 'src, E>;
}
-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()
+impl<'r, 'src, E: SsBound> AsVisitor<'src, E> for DynVisitor<'r, 'src, E> {
+ fn as_visitor(&mut self) -> DynVisitor<'_, 'src, E> {
+ DynVisitor::new(self.any)
}
}
#[derive(SendSync)]
-pub struct DynWalker<'a, 'lt, 'ctx, E: SsBound>(pub &'a mut (dyn AnyTraitDynBind<'lt, 'ctx, E> + 'lt));
+pub struct DynWalker<'r, 'src, E: SsBound> {
+ _b: ImpliedBound<'r, 'src>,
+ any: &'r mut dyn AnyTraitDynBind<'src, E>
+}
+
+impl<'r, 'src, E: SsBound> DynWalker<'r, 'src, E> {
+ pub fn new(any: &'r mut dyn AnyTraitDynBind<'src, E>) -> Self {
+ DynWalker {
+ any,
+ _b: ImpliedBound::NEW,
+ }
+ }
+
+ pub fn cast(&mut self) -> DynWalker<'_, 'src, E> {
+ DynWalker::new(self.any)
+ }
-impl<'a, 'lt, 'ctx, E: SsBound> DynWalker<'a, 'lt, 'ctx, E> {
- pub fn cast(&mut self) -> DynWalker<'_, 'lt, 'ctx, E> {
- DynWalker(self.0)
+ pub fn into_inner(self) -> &'r mut dyn AnyTraitDynBind<'src, E> {
+ self.any
}
}
-impl<'a, 'lt, 'ctx, E: SsBound> Deref for DynWalker<'a, 'lt, 'ctx, E> {
- type Target = dyn AnyTrait<'lt, 'ctx> + 'lt;
+impl<'r, 'src, E: SsBound> Deref for DynWalker<'r, 'src, E> {
+ type Target = dyn AnyTrait<'src> + 'r;
fn deref(&self) -> &Self::Target {
- self.0.cast()
+ self.any.as_any_trait()
}
}
-impl<'a, 'lt, 'ctx, E: SsBound> DerefMut for DynWalker<'a, 'lt, 'ctx, E> {
+impl<'r, 'src, E: SsBound> DerefMut for DynWalker<'r, 'src, E> {
fn deref_mut(&mut self) -> &mut Self::Target {
- self.0.cast_mut()
+ self.any.as_any_trait_mut()
}
}