1(* ========================================================================= *)
2(* ML UTILITY FUNCTIONS                                                      *)
3(* Copyright (c) 2001-2004 Joe Hurd.                                         *)
4(* ========================================================================= *)
5
6signature mlibUseful =
7sig
8
9(* Exceptions, profiling and tracing *)
10exception Error of string
11exception Bug of string
12val report      : exn -> string
13val assert      : bool -> exn -> unit
14val try         : ('a -> 'b) -> 'a -> 'b
15val total       : ('a -> 'b) -> 'a -> 'b option
16val can         : ('a -> 'b) -> 'a -> bool
17val partial     : exn -> ('a -> 'b option) -> 'a -> 'b
18val timed       : ('a -> 'b) -> 'a -> real * 'b
19val timed_many  : ('a -> 'b) -> 'a -> real * 'b
20val trace_level : int ref
21val add_trace   : {module : string, alignment : int -> int} -> unit
22val set_traces  : {module : string, alignment : int -> int} list -> unit
23val tracing     : {module : string, level : int} -> bool
24val trace       : string -> unit
25
26(* Combinators *)
27val C      : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
28val I      : 'a -> 'a
29val K      : 'a -> 'b -> 'a
30val S      : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c
31val W      : ('a -> 'a -> 'b) -> 'a -> 'b
32val ##     : ('a -> 'c) * ('b -> 'd) -> 'a * 'b -> 'c * 'd
33val funpow : int -> ('a -> 'a) -> 'a -> 'a
34
35(* Booleans *)
36val bool_to_string : bool -> string
37val non            : ('a -> bool) -> 'a -> bool
38val bool_compare   : bool * bool -> order
39
40(* Pairs *)
41val D       : 'a -> 'a * 'a
42val Df      : ('a -> 'b) -> 'a * 'a -> 'b * 'b
43val fst     : 'a * 'b -> 'a
44val snd     : 'a * 'b -> 'b
45val pair    : 'a -> 'b -> 'a * 'b
46val swap    : 'a * 'b -> 'b * 'a
47val curry   : ('a * 'b -> 'c) -> 'a -> 'b -> 'c
48val uncurry : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
49val equal   : ''a -> ''a -> bool
50
51(* State transformers *)
52val unit   : 'a -> 's -> 'a * 's
53val bind   : ('s -> 'a * 's) -> ('a -> 's -> 'b * 's) -> 's -> 'b * 's
54val mmap   : ('a -> 'b) -> ('s -> 'a * 's) -> 's -> 'b * 's
55val mjoin  : ('s -> ('s -> 'a * 's) * 's) -> 's -> 'a * 's
56val mwhile : ('a -> bool) -> ('a -> 's -> 'a * 's) -> 'a -> 's -> 'a * 's
57
58(* Lists: note we count elements from 0 *)
59val cons         : 'a -> 'a list -> 'a list
60val hd_tl        : 'a list -> 'a * 'a list
61val append       : 'a list -> 'a list -> 'a list
62val sing         : 'a -> 'a list
63val first        : ('a -> 'b option) -> 'a list -> 'b option
64val index        : ('a -> bool) -> 'a list -> int option
65val maps         : ('a -> 's -> 'b * 's) -> 'a list -> 's -> 'b list * 's
66val partial_maps : ('a -> 's -> 'b option * 's) -> 'a list -> 's -> 'b list * 's
67val enumerate    : int -> 'a list -> (int * 'a) list
68val zipwith      : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
69val zip          : 'a list -> 'b list -> ('a * 'b) list
70val unzip        : ('a * 'b) list -> 'a list * 'b list
71val cartwith     : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
72val cart         : 'a list -> 'b list -> ('a * 'b) list
73val divide       : 'a list -> int -> 'a list * 'a list      (* Subscript *)
74val update_nth   : ('a -> 'a) -> int -> 'a list -> 'a list  (* Subscript *)
75val shared_map   : ('a -> 'a) -> 'a list -> 'a list  (* preserves sharing *)
76
77(* Lists-as-sets *)
78val mem       : ''a -> ''a list -> bool
79val insert    : ''a -> ''a list -> ''a list
80val delete    : ''a -> ''a list -> ''a list
81val union     : ''a list -> ''a list -> ''a list
82val intersect : ''a list -> ''a list -> ''a list
83val subtract  : ''a list -> ''a list -> ''a list
84val setify    : ''a list -> ''a list
85val subset    : ''a list -> ''a list -> bool
86val distinct  : ''a list -> bool
87
88(* Comparisons *)
89type 'a ordering = 'a * 'a -> order
90val order_to_string : order -> string
91val map_order       : ('a -> 'b) -> 'b ordering -> 'a ordering
92val rev_order       : 'a ordering -> 'a ordering
93val lex_order       : 'a ordering -> 'b ordering -> ('a * 'b) ordering
94val lex_order2      : 'a ordering -> ('a * 'a) ordering
95val lex_order3      : 'a ordering -> ('a * 'a * 'a) ordering
96val lex_seq_order   : 'a ordering -> 'a ordering -> 'a ordering
97val lex_list_order  : 'a ordering -> 'a list ordering
98
99(* Sorting and searching *)
100val min      : 'a ordering -> 'a list -> 'a * 'a list
101val max      : 'a ordering -> 'a list -> 'a * 'a list
102val merge    : 'a ordering -> 'a list -> 'a list -> 'a list
103val sort     : 'a ordering -> 'a list -> 'a list
104val sort_map : ('a -> 'b) -> 'b ordering -> 'a list -> 'a list
105val top_sort : 'a ordering -> ('a -> 'a list) -> 'a list -> 'a list
106
107(* Integers *)
108val int_to_string : int -> string
109val string_to_int : string -> int                 (* Overflow, Option *)
110val int_to_bits   : int -> bool list
111val bits_to_int   : bool list -> int              (* Overflow *)
112val int_to_base64 : int -> char
113val base64_to_int : char -> int
114val interval      : int -> int -> int list
115val even          : int -> bool
116val odd           : int -> bool
117val divides       : int -> int -> bool
118val primes        : int -> int list
119val gcd           : int -> int -> int
120
121(* Strings *)
122val rot         : int -> char -> char
123val nchars      : char -> int -> string
124val chomp       : string -> string
125val unpad       : string -> string
126val join        : string -> string list -> string
127val split       : string -> string -> string list
128val variant     : string -> string list -> string
129val variant_num : string -> string list -> string
130val dest_prefix : string -> string -> string
131val is_prefix   : string -> string -> bool
132val mk_prefix   : string -> string -> string
133val align_table : {left : bool, pad : char} -> string list list -> string list
134
135(* Reals *)
136val real_to_string    : real -> string
137val percent_to_string : real -> string
138val pos               : real -> real
139val log2              : real -> real              (* Domain *)
140
141(* Pretty-printing *)
142type 'a pp = 'a Parse.pprinter
143val LINE_LENGTH : int ref
144val pp_map      : ('a -> 'b) -> 'b pp -> 'a pp
145val pp_bracket  : string -> string -> 'a pp -> 'a pp
146val pp_sequence : string -> 'a pp -> 'a list pp
147val pp_binop    : string -> 'a pp -> 'b pp -> ('a * 'b) pp
148val pp_char     : char pp
149val pp_string   : string pp
150val pp_unit     : unit pp
151val pp_bool     : bool pp
152val pp_int      : int pp
153val pp_real     : real pp
154val pp_order    : order pp
155val pp_porder   : order option pp
156val pp_list     : 'a pp -> 'a list pp
157val pp_pair     : 'a pp -> 'b pp -> ('a * 'b) pp
158val pp_triple   : 'a pp -> 'b pp -> 'c pp -> ('a * 'b * 'c) pp
159val to_string   : 'a pp -> 'a -> string           (* Uses LINE_LENGTH *)
160
161(* Sum datatype *)
162datatype ('a,'b) sum = INL of 'a | INR of 'b
163val is_inl : ('a,'b) sum -> bool
164val is_inr : ('a,'b) sum -> bool
165val pp_sum : 'a pp -> 'b pp -> ('a,'b) sum pp
166
167(* Maplets *)
168datatype ('a,'b) maplet = |-> of 'a * 'b
169val pp_maplet : 'a pp -> 'b pp -> ('a,'b) maplet pp
170
171(* Trees *)
172datatype ('a,'b) tree = BRANCH of 'a * ('a,'b) tree list | LEAF of 'b
173val tree_size  : ('a,'b) tree -> {branches : int, leaves : int}
174val tree_foldr : ('a -> 'c list -> 'c) -> ('b -> 'c) -> ('a, 'b) tree -> 'c
175val tree_foldl : ('a->'c->'c) -> ('b->'c->'d) -> 'c -> ('a,'b) tree -> 'd list
176val tree_partial_foldl :
177  ('a->'c->'c option) -> ('b->'c->'d option) -> 'c -> ('a,'b) tree -> 'd list
178
179(* mlibUseful impure features *)
180val memoize   : (unit -> 'a) -> unit -> 'a
181val new_int   : unit -> int
182val new_ints  : int -> int list
183val uniform   : unit -> real
184val coin_flip : unit -> bool
185val with_flag : 'r ref * ('r -> 'r) -> ('a -> 'b) -> 'a -> 'b
186
187(* The environment *)
188val warn           : string -> unit
189val die            : string -> unit
190
191end
192