Diffstat (limited to 'tests/common/protocol/hint.rs')
| -rw-r--r-- | tests/common/protocol/hint.rs | 84 |
1 files changed, 62 insertions, 22 deletions
diff --git a/tests/common/protocol/hint.rs b/tests/common/protocol/hint.rs index 2bc6c7f..abb38dd 100644 --- a/tests/common/protocol/hint.rs +++ b/tests/common/protocol/hint.rs @@ -3,55 +3,95 @@ use effectful::{ effective::Effective, environment::{Environment, NativeForm}, forward_send_sync, + higher_ranked::WithLt, }; use mockall::mock; use treaty::{ - any::{any_trait, TypeName}, + any::{type_name, AnyTrait, MutAnyUnsized, WithLtTypeId, trait_by_id}, protocol::{ visitor::VisitResult, - walker::hint::{DynVisitorWith, Hint, HintMeta, HintProto, MetaHint, MetaKnown}, + walker::hint::{DynVisitorWith, Hint, HintMeta}, DynVisitor, }, Flow, }; -pub type KnownFactory<P> = - for<'a, 'ctx> fn(&'ctx (), &'a MetaHint<'a, 'ctx, P>) -> Result<MetaKnown<'a, 'ctx, P>, ()>; +pub type KnownFactory<P> = for<'a, 'ctx> fn( + &'ctx (), + &'a WithLt<'a, <P as HintMeta>::Hint>, +) -> Result<WithLt<'a, <P as HintMeta>::Known>, ()>; mock! { - pub HintWalker<P: HintMeta> { - pub fn hint<'a, 'b, 'c, 'ctx>(&'a mut self, visitor: DynVisitorWith<'b, 'ctx, P>, hint: MetaHint<'c, 'ctx, P>) -> VisitResult; + pub HintWalker<P: ?Sized + HintMeta> { + pub fn hint<'a, 'b, 'c, 'ctx>(&'a mut self, visitor: DynVisitorWith<'b, 'ctx, P>, hint: WithLt<'c, P::Hint>) -> VisitResult; pub fn known(&self) -> KnownFactory<P>; } } -forward_send_sync!({} {} {P: (HintMeta)} MockHintWalker<P>); +forward_send_sync!({} {} {P: (?Sized + HintMeta)} MockHintWalker<P>); -any_trait! { - impl['ctx, P][E] MockHintWalker<P> = [ - HintProto<P> - ] where - E: Environment, - P: HintMeta<Effect = E>, +impl<'ctx, P: ?Sized + HintMeta> AnyTrait<'ctx> for MockHintWalker<P> { + fn upcast_by_id_mut<'a, 'lt: 'a>( + &'a mut self, + id: WithLtTypeId<'lt, 'ctx>, + ) -> Option<MutAnyUnsized<'a, 'lt, 'ctx>> + where + 'ctx: 'lt, + { + trait_by_id!(&mut self, id, { + type Impls<'lt, 'ctx> = (dyn Hint<P>); + + None + }) + } } -impl<'ctx, P: HintMeta> Hint<'ctx, P> for MockHintWalker<P> { - fn hint<'this, 'visitor, 'hint, 'e>( +// any_trait! { +// impl['ctx, P][E] MockHintWalker<P> = [ +// HintProto<P> +// ] where +// E: Environment, +// P: HintMeta<Effect = E>, +// } + +impl<'ctx, P: ?Sized + HintMeta> Hint<'ctx, P> for MockHintWalker<P> { + fn hint<'this: 'e, 'visitor: 'e, 'hint: 'e, 'e>( &'this mut self, visitor: DynVisitorWith<'visitor, 'ctx, P>, - hint: MetaHint<'hint, 'ctx, P>, - ) -> NativeForm<'e, VisitResult, P::Effect> + hint: WithLt<'hint, <P as HintMeta>::Hint>, + ) -> NativeForm<'e, VisitResult, <P>::Env> where - 'ctx: 'this + 'visitor + 'hint + 'e, + 'ctx: 'this + 'visitor + 'hint, { - P::Effect::value(self.hint(visitor, hint)).cast() + P::Env::value(self.hint(visitor, hint)).cast() } fn known<'a>( &'a mut self, - hint: &'a MetaHint<'a, 'ctx, P>, - ) -> NativeForm<'a, Result<MetaKnown<'a, 'ctx, P>, ()>, P::Effect> { - P::Effect::value(Self::known(self)(&(), hint)).cast() + hint: &'a WithLt<'a, <P as HintMeta>::Hint>, + ) -> NativeForm<'a, Result<WithLt<'a, <P as HintMeta>::Known>, ()>, <P>::Env> + where + WithLt<'a, <P as HintMeta>::Known>: effectful::environment::DynBind<<P>::Env>, + { + todo!() } + + // fn hint<'this, 'visitor, 'hint, 'e>( + // &'this mut self, + // visitor: DynVisitorWith<'visitor, 'ctx, P>, + // hint: WithLt<'hint, P>, + // ) -> NativeForm<'e, VisitResult, P::Effect> + // where + // 'ctx: 'this + 'visitor + 'hint + 'e, + // { + // P::Effect::value(self.hint(visitor, hint)).cast() + // } + // + // fn known<'a>( + // &'a mut self, + // hint: &'a WithLt<'a, P::Hint>, + // ) -> NativeForm<'a, Result<WithLt<'a, P::Known>, ()>, P::Effect> { + // P::Effect::value(Self::known(self)(&(), hint)).cast() + // } } |