Diffstat (limited to 'src/effect/bound.rs')
-rw-r--r--src/effect/bound.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/effect/bound.rs b/src/effect/bound.rs
new file mode 100644
index 0000000..3798823
--- /dev/null
+++ b/src/effect/bound.rs
@@ -0,0 +1,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 () {}