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
39
40
41
42
43
44
use crate::never::Never;

pub trait Bool: Sized + sealed_bool::Sealed + 'static {}

mod sealed_bool {
    use super::*;

    pub trait Sealed {}

    impl Sealed for Yes {}
    impl Sealed for No {}
}

pub enum Yes {}
pub enum No {}

impl Bool for Yes {}
impl Bool for No {}

pub unsafe trait IsSend<B: Bool> {}
pub unsafe trait IsSync<B: Bool> {}

pub struct DynamicShim<T>(pub T);

unsafe impl<T: IsSend<Yes>> Send for DynamicShim<T> {}
unsafe impl<T: IsSync<Yes>> Sync for DynamicShim<T> {}

pub struct Dynamic<T>(pub T);

unsafe impl<T> IsSend<No> for Dynamic<T> {}
unsafe impl<T: Send> IsSend<Yes> for Dynamic<T> {}
unsafe impl<T> IsSync<No> for Dynamic<T> {}
unsafe impl<T: Sync> IsSync<Yes> for Dynamic<T> {}

pub struct SendAndSync<T>(pub T);

unsafe impl<T: Send, F: Bool> IsSend<F> for SendAndSync<T> {}
unsafe impl<T: Sync, F: Bool> IsSync<F> for SendAndSync<T> {}

unsafe impl<F: Bool> IsSend<F> for Never {}
unsafe impl<F: Bool> IsSync<F> for Never {}

unsafe impl<F: Bool> IsSend<F> for () {}
unsafe impl<F: Bool> IsSync<F> for () {}