Skip to main content

typenum_uuid_trait/
lib.rs

1#![recursion_limit = "256"]
2use typenum::{Bit, IsEqual, Unsigned};
3
4pub trait TypeId {
5    type Id: Unsigned;
6}
7
8pub trait IsTypeEqual<T: TypeId> {
9    type Value: Bit;
10}
11
12impl<T: TypeId, U: TypeId> IsTypeEqual<T> for U
13where
14    <T as TypeId>::Id: IsEqual<<U as TypeId>::Id>,
15{
16    type Value = <<T as TypeId>::Id as IsEqual<<U as TypeId>::Id>>::Output;
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    use typenum::{False, True};
23    use typenum_uuid::uuid_new_v4;
24
25    struct A;
26    struct B;
27
28    impl TypeId for A {
29        type Id = uuid_new_v4!();
30    }
31
32    impl TypeId for B {
33        type Id = uuid_new_v4!();
34    }
35
36    fn only_eq<X: TypeId, Y: TypeId>(_: X, _: Y)
37    where
38        X: IsTypeEqual<Y, Value = True>,
39    {
40    }
41
42    fn only_diff<X: TypeId, Y: TypeId>(_: X, _: Y)
43    where
44        X: IsTypeEqual<Y, Value = False>,
45    {
46    }
47
48    #[test]
49    fn it_works_on_equal() {
50        let a_0 = A {};
51        let a_1 = A {};
52        only_eq(a_0, a_1);
53
54        // Should not compile
55        // let b = B {};
56        // only_eq(a_0, b);
57    }
58
59    #[test]
60    fn it_works_on_diff() {
61        let a_0 = A {};
62        let b = B {};
63
64        only_diff(a_0, b);
65
66        // Should not compile
67        // let a_1 = A {};
68        // only_diff(a_0, a_1);
69    }
70}