Diffstat (limited to 'tests/common/protocol/hint.rs')
-rw-r--r--tests/common/protocol/hint.rs84
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()
+ // }
}