1(* ========================================================================= *)
2(* ML UTILITY FUNCTIONS                                                      *)
3(* Copyright (c) 2001-2005 Joe Hurd, distributed under the GNU GPL version 2 *)
4(* ========================================================================= *)
5
6signature Useful =
7sig
8
9(* ------------------------------------------------------------------------- *)
10(* Exceptions                                                                *)
11(* ------------------------------------------------------------------------- *)
12
13exception Error of string
14
15exception Bug of string
16
17val report : exn -> string
18
19val assert : bool -> exn -> unit
20
21val try : ('a -> 'b) -> 'a -> 'b
22
23val total : ('a -> 'b) -> 'a -> 'b option
24
25val can : ('a -> 'b) -> 'a -> bool
26
27val partial : exn -> ('a -> 'b option) -> 'a -> 'b
28
29(* ------------------------------------------------------------------------- *)
30(* Profiling                                                                 *)
31(* ------------------------------------------------------------------------- *)
32
33val timed : ('a -> 'b) -> 'a -> real * 'b
34
35val timed_many : ('a -> 'b) -> 'a -> real * 'b
36
37val set_benchmark_seconds : int -> unit
38
39val check_benchmark_time : unit -> unit
40
41(* ------------------------------------------------------------------------- *)
42(* Tracing                                                                   *)
43(* ------------------------------------------------------------------------- *)
44
45val trace_print : (string -> unit) ref
46
47val trace_level : int ref
48
49val trace_align : {module : string, alignment : int -> int option} list ref
50
51val tracing : {module : string, level : int} -> bool
52
53val trace : string -> unit
54
55(* ------------------------------------------------------------------------- *)
56(* Combinators                                                               *)
57(* ------------------------------------------------------------------------- *)
58
59val C : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
60
61val I : 'a -> 'a
62
63val K : 'a -> 'b -> 'a
64
65val S : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c
66
67val W : ('a -> 'a -> 'b) -> 'a -> 'b
68
69val oo : ('a -> 'b) * ('c -> 'd -> 'a) -> 'c -> 'd -> 'b
70
71val ## : ('a -> 'c) * ('b -> 'd) -> 'a * 'b -> 'c * 'd
72
73val funpow : int -> ('a -> 'a) -> 'a -> 'a
74
75(* ------------------------------------------------------------------------- *)
76(* Booleans                                                                  *)
77(* ------------------------------------------------------------------------- *)
78
79val bool_to_string : bool -> string
80
81val non : ('a -> bool) -> 'a -> bool
82
83val bool_compare : bool * bool -> order
84
85(* ------------------------------------------------------------------------- *)
86(* Pairs                                                                     *)
87(* ------------------------------------------------------------------------- *)
88
89val D : 'a -> 'a * 'a
90
91val Df : ('a -> 'b) -> 'a * 'a -> 'b * 'b
92
93val fst : 'a * 'b -> 'a
94
95val snd : 'a * 'b -> 'b
96
97val pair : 'a -> 'b -> 'a * 'b
98
99val swap : 'a * 'b -> 'b * 'a
100
101val curry : ('a * 'b -> 'c) -> 'a -> 'b -> 'c
102
103val uncurry : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
104
105val equal : ''a -> ''a -> bool
106
107(* ------------------------------------------------------------------------- *)
108(* State transformers                                                        *)
109(* ------------------------------------------------------------------------- *)
110
111val unit : 'a -> 's -> 'a * 's
112
113val bind : ('s -> 'a * 's) -> ('a -> 's -> 'b * 's) -> 's -> 'b * 's
114
115val mmap : ('a -> 'b) -> ('s -> 'a * 's) -> 's -> 'b * 's
116
117val mjoin : ('s -> ('s -> 'a * 's) * 's) -> 's -> 'a * 's
118
119val mwhile : ('a -> bool) -> ('a -> 's -> 'a * 's) -> 'a -> 's -> 'a * 's
120
121(* ------------------------------------------------------------------------- *)
122(* Lists: note we count elements from 0                                      *)
123(* ------------------------------------------------------------------------- *)
124
125val cons : 'a -> 'a list -> 'a list
126
127val hd_tl : 'a list -> 'a * 'a list
128
129val append : 'a list -> 'a list -> 'a list
130
131val sing : 'a -> 'a list
132
133val first : ('a -> 'b option) -> 'a list -> 'b option
134
135val index : ('a -> bool) -> 'a list -> int option
136
137val maps : ('a -> 's -> 'b * 's) -> 'a list -> 's -> 'b list * 's
138
139val partial_maps : ('a -> 's -> 'b option * 's) -> 'a list -> 's -> 'b list * 's
140
141val enumerate : int -> 'a list -> (int * 'a) list
142
143val zipwith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
144
145val zip : 'a list -> 'b list -> ('a * 'b) list
146
147val unzip : ('a * 'b) list -> 'a list * 'b list
148
149val cartwith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
150
151val cart : 'a list -> 'b list -> ('a * 'b) list
152
153val divide : 'a list -> int -> 'a list * 'a list  (* Subscript *)
154
155val update_nth : ('a -> 'a) -> int -> 'a list -> 'a list  (* Subscript *)
156
157val delete_nth : int -> 'a list -> 'a list  (* Subscript *)
158
159(* ------------------------------------------------------------------------- *)
160(* Lists-as-sets                                                             *)
161(* ------------------------------------------------------------------------- *)
162
163val mem : ''a -> ''a list -> bool
164
165val insert : ''a -> ''a list -> ''a list
166
167val delete : ''a -> ''a list -> ''a list
168
169val union : ''a list -> ''a list -> ''a list
170
171val intersect : ''a list -> ''a list -> ''a list
172
173val subtract : ''a list -> ''a list -> ''a list
174
175val setify : ''a list -> ''a list
176
177val subset : ''a list -> ''a list -> bool
178
179val distinct : ''a list -> bool
180
181(* ------------------------------------------------------------------------- *)
182(* Comparisons                                                               *)
183(* ------------------------------------------------------------------------- *)
184
185type 'a ordering = 'a * 'a -> order
186
187val order_to_string : order -> string
188
189val map_order : ('a -> 'b) -> 'b ordering -> 'a ordering
190
191val rev_order : 'a ordering -> 'a ordering
192
193val lex_order : 'a ordering -> 'b ordering -> ('a * 'b) ordering
194
195val lex_order2 : 'a ordering -> ('a * 'a) ordering
196
197val lex_order3 : 'a ordering -> ('a * 'a * 'a) ordering
198
199val lex_seq_order : 'a ordering -> 'a ordering -> 'a ordering
200
201val lex_list_order : 'a ordering -> 'a list ordering
202
203val lex_option_order : 'a ordering -> 'a option ordering  (* NONE last *)
204
205(* ------------------------------------------------------------------------- *)
206(* Sorting and searching                                                     *)
207(* ------------------------------------------------------------------------- *)
208
209val minimum : 'a ordering -> 'a list -> 'a * 'a list
210
211val maximum : 'a ordering -> 'a list -> 'a * 'a list
212
213val merge : 'a ordering -> 'a list -> 'a list -> 'a list
214
215val sort : 'a ordering -> 'a list -> 'a list
216
217val sort_map : ('a -> 'b) -> 'b ordering -> 'a list -> 'a list
218
219val top_sort : 'a ordering -> ('a -> 'a list) -> 'a list -> 'a list
220
221(* ------------------------------------------------------------------------- *)
222(* Integers                                                                  *)
223(* ------------------------------------------------------------------------- *)
224
225val int_to_string : int -> string
226
227val string_to_int : string -> int  (* Overflow, Option *)
228
229val int_to_bits : int -> bool list
230
231val bits_to_int : bool list -> int  (* Overflow *)
232
233val int_to_base64 : int -> char
234
235val base64_to_int : char -> int
236
237val interval : int -> int -> int list
238
239val even : int -> bool
240
241val odd : int -> bool
242
243val divides : int -> int -> bool
244
245val primes : int -> int list
246
247val primes_up_to : int -> int list
248
249val gcd : int -> int -> int
250
251(* ------------------------------------------------------------------------- *)
252(* Strings                                                                   *)
253(* ------------------------------------------------------------------------- *)
254
255val rot : int -> char -> char
256
257val nchars : char -> int -> string
258
259val chomp : string -> string
260
261val trim : string -> string
262
263val join : string -> string list -> string
264
265val split : string -> string -> string list
266
267val pluralize : {singular : string, plural : string} -> int -> string
268
269val variant : string -> string list -> string
270
271val variant_num : string -> string list -> string
272
273val dest_prefix : string -> string -> string
274
275val is_prefix : string -> string -> bool
276
277val mk_prefix : string -> string -> string
278
279val align_table : {left : bool, pad : char} -> string list list -> string list
280
281(* ------------------------------------------------------------------------- *)
282(* Reals                                                                     *)
283(* ------------------------------------------------------------------------- *)
284
285val real_to_string : real -> string
286
287val percent_to_string : real -> string
288
289val pos : real -> real
290
291val log2 : real -> real  (* Domain *)
292
293(* ------------------------------------------------------------------------- *)
294(* Pretty-printing                                                           *)
295(* ------------------------------------------------------------------------- *)
296
297type 'a pp = ppstream -> 'a -> unit
298
299val LINE_LENGTH : int ref
300
301val pp_map : ('a -> 'b) -> 'b pp -> 'a pp
302
303val pp_bracket : string -> string -> 'a pp -> 'a pp
304
305val pp_sequence : string -> 'a pp -> 'a list pp
306
307val pp_binop : string -> 'a pp -> 'b pp -> ('a * 'b) pp
308
309val pp_char : char pp
310
311val pp_string : string pp
312
313val pp_unit : unit pp
314
315val pp_bool : bool pp
316
317val pp_int : int pp
318
319val pp_real : real pp
320
321val pp_order : order pp
322
323val pp_porder : order option pp
324
325val pp_list : 'a pp -> 'a list pp
326
327val pp_pair : 'a pp -> 'b pp -> ('a * 'b) pp
328
329val pp_triple : 'a pp -> 'b pp -> 'c pp -> ('a * 'b * 'c) pp
330
331val toString : 'a pp -> 'a -> string  (* Uses LINE_LENGTH *)
332
333val varToString : 'a pp -> string -> 'a -> string  (* for tracing *)
334
335(* ------------------------------------------------------------------------- *)
336(* Sum datatype                                                              *)
337(* ------------------------------------------------------------------------- *)
338
339datatype ('a,'b) sum = INL of 'a | INR of 'b
340
341val is_inl : ('a,'b) sum -> bool
342
343val is_inr : ('a,'b) sum -> bool
344
345val pp_sum : 'a pp -> 'b pp -> ('a,'b) sum pp
346
347(* ------------------------------------------------------------------------- *)
348(* Maplets                                                                   *)
349(* ------------------------------------------------------------------------- *)
350
351datatype ('a,'b) maplet = |-> of 'a * 'b
352
353val pp_maplet : 'a pp -> 'b pp -> ('a,'b) maplet pp
354
355(* ------------------------------------------------------------------------- *)
356(* Useful impure features                                                    *)
357(* ------------------------------------------------------------------------- *)
358
359val memoize : (unit -> 'a) -> unit -> 'a
360
361val new_int : unit -> int
362
363val new_ints : int -> int list
364
365val random : int -> int
366
367val uniform : unit -> real
368
369val coin_flip : unit -> bool
370
371val with_flag : 'r ref * ('r -> 'r) -> ('a -> 'b) -> 'a -> 'b
372
373val cached : 'a ordering -> ('a -> 'b) -> 'a -> 'b
374
375(* ------------------------------------------------------------------------- *)
376(* The environment                                                           *)
377(* ------------------------------------------------------------------------- *)
378
379val host : string
380
381val date : unit -> string
382
383val today : unit -> string
384
385val warn : string -> unit
386
387val die : string -> unit
388
389val read_textfile : {filename : string} -> string
390
391val write_textfile : {filename : string, contents : string} -> unit
392
393end
394