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
use super::{weakfunctorany::WeakFunctorAny, WeakFunctor};
pub use radn_derive::SharedFunctorAny;

pub trait SharedFunctorAny: WeakFunctorAny {
    type SharedAny<'a, A: 'a + Send + Sync + Clone>: 'a + Send + Sync + Clone
    where
        Self: 'a;

    fn share<'a, A: 'a + Send + Sync + Clone>(fa: Self::FAny<'a, A>) -> Self::SharedAny<'a, A>
    where
        Self: 'a;

    fn unshare<'a, A: 'a + Send + Sync + Clone>(sa: Self::SharedAny<'a, A>) -> Self::FAny<'a, A>
    where
        Self: 'a;
}

pub trait SharedFunctor<'a>: WeakFunctor<'a> {
    type Shared<A: 'a + Send + Sync + Clone>: 'a + Send + Sync + Clone;

    fn share<A: 'a + Send + Sync + Clone>(fa: Self::F<A>) -> Self::Shared<A>;

    fn unshare<A: 'a + Send + Sync + Clone>(sa: Self::Shared<A>) -> Self::F<A>;
}

impl<'a, T: 'a + SharedFunctorAny> SharedFunctor<'a> for T {
    type Shared<A: 'a + Send + Sync + Clone> = T::SharedAny<'a, A>;

    fn share<A: 'a + Send + Sync + Clone>(fa: Self::F<A>) -> Self::Shared<A> {
        T::share(fa)
    }

    fn unshare<A: 'a + Send + Sync + Clone>(sa: Self::Shared<A>) -> Self::F<A> {
        T::unshare(sa)
    }
}