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