blob: c6f743e4b451421358c959fe3eac8a3efee0af66 (
plain)
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
(* TEST
flags = "-dshape"
* expect
*)
(**********)
(* Simple *)
(**********)
module rec A : sig
type t = Leaf of B.t
end = struct
type t = Leaf of B.t
end
and B
: sig type t = int end
= struct type t = int end
[%%expect{|
{
"A"[module] -> {
"t"[type] -> <.8>;
};
"B"[module] -> {
"t"[type] -> <.10>;
};
}
module rec A : sig type t = Leaf of B.t end
and B : sig type t = int end
|}]
(*****************)
(* Intf only ... *)
(*****************)
(* reduce is going to die on this. *)
module rec A : sig
type t = Leaf of B.t
end = A
and B : sig
type t = int
end = B
[%%expect{|
{
"A"[module] -> A/304<.11>;
"B"[module] -> B/305<.12>;
}
module rec A : sig type t = Leaf of B.t end
and B : sig type t = int end
|}]
(***************************)
(* Example from the manual *)
(***************************)
module rec A : sig
type t = Leaf of string | Node of ASet.t
val compare: t -> t -> int
end = struct
type t = Leaf of string | Node of ASet.t
let compare t1 t2 =
match (t1, t2) with
| (Leaf s1, Leaf s2) -> Stdlib.compare s1 s2
| (Leaf _, Node _) -> 1
| (Node _, Leaf _) -> -1
| (Node n1, Node n2) -> ASet.compare n1 n2
end
(* we restrict the sig to limit the bloat in the expected output. *)
and ASet : sig
type t
type elt = A.t
val compare : t -> t -> int
end = Set.Make(A)
[%%expect{|
{
"A"[module] -> {
"compare"[value] -> <.38>;
"t"[type] -> <.35>;
};
"ASet"[module] ->
{
"compare"[value] ->
CU Stdlib . "Set"[module] . "Make"[module](A/326<.19>) .
"compare"[value];
"elt"[type] ->
CU Stdlib . "Set"[module] . "Make"[module](A/326<.19>) . "elt"[type];
"t"[type] ->
CU Stdlib . "Set"[module] . "Make"[module](A/326<.19>) . "t"[type];
};
}
module rec A :
sig
type t = Leaf of string | Node of ASet.t
val compare : t -> t -> int
end
and ASet : sig type t type elt = A.t val compare : t -> t -> int end
|}]
|