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