Import Upstream version 20180207
[hcoop/debian/mlton.git] / mlton / elaborate / interface.sig
CommitLineData
7f918cf1
CE
1(* Copyright (C) 2017 Matthew Fluet.
2 * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
5 *
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
8 *)
9
10signature INTERFACE_STRUCTS =
11 sig
12 structure Ast: AST
13 structure AdmitsEquality: ADMITS_EQUALITY
14 structure Kind: TYCON_KIND
15 structure EnvTycon:
16 sig
17 type t
18
19 val admitsEquality: t -> AdmitsEquality.t
20 val arrow: t
21 val equals: t * t -> bool
22 val exn: t
23 val kind: t -> Kind.t
24 val layout: t -> Layout.t
25 val layoutAppPretty:
26 t
27 * LayoutPretty.t vector
28 * {layoutPretty: t -> Layout.t}
29 -> LayoutPretty.t
30 val layoutAppPrettyNormal:
31 Layout.t
32 * LayoutPretty.t vector
33 -> LayoutPretty.t
34 val tuple: t
35 end
36 structure EnvTypeStr:
37 sig
38 type t
39 val layout: t -> Layout.t
40 end
41 structure Tyvar:
42 sig
43 include ID
44 val makeNoname: {equality: bool} -> t
45 val makeLayoutPretty:
46 unit
47 -> {destroy: unit -> unit,
48 layoutPretty: t -> Layout.t,
49 localInit: t vector -> unit}
50 end
51 end
52
53signature INTERFACE =
54 sig
55 include INTERFACE_STRUCTS
56
57 structure FlexibleTycon:
58 sig
59 type typeStr
60 type t
61
62 val admitsEquality: t -> AdmitsEquality.t
63 val dest: t -> {admitsEquality: AdmitsEquality.t,
64 hasCons: bool,
65 kind: Kind.t,
66 prettyDefault: string}
67 val layout: t -> Layout.t
68 val layoutPrettyDefault: t -> Layout.t
69 val plist: t -> PropertyList.t
70 val new: {admitsEquality: AdmitsEquality.t,
71 hasCons: bool,
72 kind: Kind.t,
73 prettyDefault: string,
74 region: Region.t} -> t
75 val realize: t * EnvTypeStr.t -> unit
76 datatype realization =
77 ETypeStr of EnvTypeStr.t
78 | TypeStr of typeStr
79 val realization: t -> realization option
80 val setAdmitsEquality: t * AdmitsEquality.t -> unit
81 end
82 structure Tycon:
83 sig
84 datatype t =
85 Flexible of FlexibleTycon.t
86 | Rigid of EnvTycon.t
87 val admitsEquality: t -> AdmitsEquality.t
88 end
89 structure Record: RECORD
90 sharing Record = Ast.SortedRecord
91 structure Type:
92 sig
93 type t
94
95 val arrow: t * t -> t
96 val con: Tycon.t * t vector -> t
97 val deArrow: t -> t * t
98 val deEta: t * Tyvar.t vector -> Tycon.t option
99 val exn: t
100 val hom: t * {con: Tycon.t * 'a vector -> 'a,
101 record: 'a Record.t -> 'a,
102 var: Tyvar.t -> 'a} -> 'a
103 val layout: t -> Layout.t
104 val layoutPretty:
105 t * {expand: bool,
106 layoutPrettyEnvTycon: EnvTycon.t -> Layout.t,
107 layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t,
108 layoutPrettyTyvar: Tyvar.t -> Layout.t}
109 -> LayoutPretty.t
110 val record: t Record.t -> t
111 val var: Tyvar.t -> t
112 end
113 structure Status:
114 sig
115 datatype t = Con | Exn | Var
116
117 val layout: t -> Layout.t
118 val toString: t -> string
119 end
120 structure Time:
121 sig
122 type t
123
124 val tick: unit -> t
125 end
126 structure Scheme:
127 sig
128 datatype t = T of {ty: Type.t,
129 tyvars: Tyvar.t vector}
130
131 val admitsEquality: t -> bool
132 val fromTycon: Tycon.t -> t
133 val make: Tyvar.t vector * Type.t -> t
134 val ty: t -> Type.t
135 end
136 structure Cons:
137 sig
138 type t
139 val dest: t -> {name: Ast.Con.t,
140 scheme: Scheme.t} vector
141 val empty: t
142 val fromSortedVector: {name: Ast.Con.t,
143 scheme: Scheme.t} vector -> t
144 val fromVector: {name: Ast.Con.t,
145 scheme: Scheme.t} vector -> t
146 val layout: t -> Layout.t
147 val map: t * ({name: Ast.Con.t,
148 scheme: Scheme.t}
149 -> {scheme: Scheme.t}) -> t
150 end
151 structure TypeStr:
152 sig
153 type t
154
155 datatype node =
156 Datatype of {tycon: Tycon.t,
157 cons: Cons.t,
158 repl: bool}
159 | Scheme of Scheme.t
160 | Tycon of {eq: bool,
161 tycon: Tycon.t}
162
163 val abs: t -> t
164 val admitsEquality: t -> AdmitsEquality.t
165 val apply: t * Type.t vector -> Type.t
166 val cons: t -> Cons.t
167 val data: Tycon.t * Cons.t * bool -> t
168 val def: Scheme.t -> t
169 val kind: t -> Kind.t
170 val layout: t -> Layout.t
171 val node: t -> node
172 val pushSpec: t * Region.t -> unit
173 val repl: t -> t
174 val toTyconOpt: t * {expand: bool} -> Tycon.t option (* NONE on Scheme *)
175 val tycon: Tycon.t * bool -> t
176 val specs: t * Region.t -> Region.t list
177
178 val share:
179 {layoutPrettyEnvTycon: EnvTycon.t -> Layout.t,
180 layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t,
181 region: Region.t,
182 time: Time.t,
183 ty1: {name: unit -> Layout.t,
184 region: Region.t,
185 spec: Region.t,
186 tyStr: t},
187 ty2: {name: unit -> Layout.t,
188 region: Region.t,
189 spec: Region.t,
190 tyStr: t}}
191 -> unit
192 val wheree:
193 {layoutPrettyEnvTycon: EnvTycon.t -> Layout.t,
194 layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t,
195 realization: t,
196 region: Region.t,
197 time: Time.t,
198 ty: {name: unit -> Layout.t,
199 region: Region.t,
200 spec: Region.t,
201 tyStr: t}}
202 -> unit
203 end
204 sharing type FlexibleTycon.typeStr = TypeStr.t
205 structure TyconMap:
206 sig
207 datatype 'a t = T of {strs: (Ast.Strid.t * 'a t) array,
208 types: (Ast.Tycon.t * 'a) array}
209
210 val empty: unit -> 'a t
211 val layout: ('a -> Layout.t) -> 'a t -> Layout.t
212 val peekStrid: 'a t * Ast.Strid.t -> 'a t option
213 val peekTycon: 'a t * Ast.Tycon.t ->'a option
214 end
215
216 type t
217
218 val copy: t -> t (* copy renames all flexible tycons. *)
219 val equals: t * t -> bool
220 val dest: t -> {strs: (Ast.Strid.t * t) array,
221 types: (Ast.Tycon.t * TypeStr.t) array,
222 vals: (Ast.Vid.t * (Status.t * Scheme.t)) array}
223 val empty: t
224 val flexibleTycons: t -> FlexibleTycon.t TyconMap.t
225 val layout: t -> Layout.t
226 val lookupLongstrid:
227 t * Ast.Longstrid.t * Region.t * {prefix: Ast.Strid.t list}
228 -> t option
229 val lookupLongtycon:
230 t * Ast.Longtycon.t * Region.t * {prefix: Ast.Strid.t list}
231 -> (Ast.Tycon.t * TypeStr.t) option
232 val new: {isClosed: bool,
233 original: t option,
234 strs: (Ast.Strid.t * t) array,
235 types: (Ast.Tycon.t * TypeStr.t) array,
236 vals: (Ast.Vid.t * (Status.t * Scheme.t)) array} -> t
237 val original: t -> t
238 val peekStrid: t * Ast.Strid.t -> t option
239 datatype 'a peekResult =
240 Found of 'a
241 | UndefinedStructure of Ast.Strid.t list
242 val peekStrids: t * Ast.Strid.t list -> t peekResult
243 val peekTycon: t * Ast.Tycon.t -> (Ast.Tycon.t * TypeStr.t) option
244 val plist: t -> PropertyList.t
245 val share:
246 {layoutPrettyEnvTycon: EnvTycon.t -> Layout.t,
247 layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t,
248 I1: t, long1: Ast.Longstrid.t,
249 I2: t, long2: Ast.Longstrid.t,
250 time: Time.t,
251 region: Region.t}
252 -> unit
253 end