1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use mockall::mock;

use crate::{
    any::{MaybeSized, TypeName},
    any_trait,
    effect::{Effect, Future},
    protocol::visitor::value::{DynValue, Value},
    Flow,
};

mock! {
    pub ValueVisitor<T: for<'ctx> MaybeSized::Trait<'ctx>, E>
    where
        for<'a, 'ctx> MaybeSized::T<'a, 'ctx, T>: Sized
    {
        pub fn visit<'a, 'ctx>(&'a mut self, value: MaybeSized::T<'a, 'ctx, T>) -> Flow;
    }
}

any_trait! {
    impl['ctx, T, E] MockValueVisitor<T, E> = [
        DynValue<'ctx, T, E>
    ] where
        T: for<'lt> TypeName::Member<'lt> + 'ctx,
        for<'a, 'lt> MaybeSized::T<'a, 'lt, T>: Sized,
        E: Effect<'ctx>,
}

impl<'ctx, T: for<'lt> MaybeSized::Trait<'lt>, E: Effect<'ctx>> Value<'ctx, T, E>
    for MockValueVisitor<T, E>
where
    for<'a, 'lt> MaybeSized::T<'a, 'lt, T>: Sized,
{
    #[track_caller]
    fn visit<'a>(&'a mut self, value: MaybeSized::T<'a, 'ctx, T>) -> Future<'a, 'ctx, Flow, E> {
        E::ready(self.visit(value))
    }
}