typenum_uuid_trait/
lib.rs1#![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 }
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 }
70}