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
type ('a, 'b) t = T : ('a, 'a) t
let cast (type a b) (T : (a, b) t) (x : a) : b = x
type ('a, 'b) eq = ('a, 'b) t
module Id = struct
type _ w = ..
module type T = sig
type a
type _ w += W : a w
end
type 'a t = (module T with type a = 'a)
let hash (type a) ((module T) : a t) = Poly.hash T.W
let equal (type a b) ((module M1) : a t) ((module M2) : b t) =
match M1.W with
| M2.W -> true
| _ -> false
;;
let create (type a) () : a t =
(module struct
type nonrec a = a
type _ w += W : a w
end)
;;
let same (type a b) ((module M1) : a t) ((module M2) : b t) =
match M1.W with
| M2.W -> Some (T : (a, b) eq)
| _ -> None
;;
end