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