223 val duplicates: ''a list -> ''a list |
223 val duplicates: ''a list -> ''a list |
224 val has_duplicates: ('a * 'a -> bool) -> 'a list -> bool |
224 val has_duplicates: ('a * 'a -> bool) -> 'a list -> bool |
225 |
225 |
226 (*association lists -- see also Pure/General/alist.ML*) |
226 (*association lists -- see also Pure/General/alist.ML*) |
227 val assoc: (''a * 'b) list * ''a -> 'b option |
227 val assoc: (''a * 'b) list * ''a -> 'b option |
228 val assoc_int: (int * 'a) list * int -> 'a option |
|
229 val assoc_string: (string * 'a) list * string -> 'a option |
|
230 val assoc_string_int: ((string * int) * 'a) list * (string * int) -> 'a option |
|
231 val assocs: (''a * 'b list) list -> ''a -> 'b list |
|
232 val gen_assoc: ('a * 'b -> bool) -> ('b * 'c) list * 'a -> 'c option |
|
233 val overwrite: (''a * 'b) list * (''a * 'b) -> (''a * 'b) list |
228 val overwrite: (''a * 'b) list * (''a * 'b) -> (''a * 'b) list |
234 val gen_overwrite: ('a * 'a -> bool) -> ('a * 'b) list * ('a * 'b) -> ('a * 'b) list |
|
235 |
229 |
236 (*lists as tables*) |
230 (*lists as tables*) |
237 val gen_merge_lists: ('a * 'a -> bool) -> 'a list -> 'a list -> 'a list |
231 val gen_merge_lists: ('a * 'a -> bool) -> 'a list -> 'a list -> 'a list |
238 val gen_merge_lists': ('a * 'a -> bool) -> 'a list -> 'a list -> 'a list |
232 val gen_merge_lists': ('a * 'a -> bool) -> 'a list -> 'a list -> 'a list |
239 val merge_lists: ''a list -> ''a list -> ''a list |
233 val merge_lists: ''a list -> ''a list -> ''a list |
1041 (*association list lookup*) |
1035 (*association list lookup*) |
1042 fun assoc ([], key) = NONE |
1036 fun assoc ([], key) = NONE |
1043 | assoc ((keyi, xi) :: pairs, key) = |
1037 | assoc ((keyi, xi) :: pairs, key) = |
1044 if key = keyi then SOME xi else assoc (pairs, key); |
1038 if key = keyi then SOME xi else assoc (pairs, key); |
1045 |
1039 |
1046 (*association list lookup, optimized version for ints*) |
|
1047 fun assoc_int ([], (key:int)) = NONE |
|
1048 | assoc_int ((keyi, xi) :: pairs, key) = |
|
1049 if key = keyi then SOME xi else assoc_int (pairs, key); |
|
1050 |
|
1051 (*association list lookup, optimized version for strings*) |
|
1052 fun assoc_string ([], (key:string)) = NONE |
|
1053 | assoc_string ((keyi, xi) :: pairs, key) = |
|
1054 if key = keyi then SOME xi else assoc_string (pairs, key); |
|
1055 |
|
1056 (*association list lookup, optimized version for string*ints*) |
|
1057 fun assoc_string_int ([], (key:string*int)) = NONE |
|
1058 | assoc_string_int ((keyi, xi) :: pairs, key) = |
|
1059 if key = keyi then SOME xi else assoc_string_int (pairs, key); |
|
1060 |
|
1061 fun assocs z = curry (these o assoc) z |
|
1062 |
|
1063 (*generalized association list lookup*) |
|
1064 fun gen_assoc eq ([], key) = NONE |
|
1065 | gen_assoc eq ((keyi, xi) :: pairs, key) = |
|
1066 if eq (key, keyi) then SOME xi else gen_assoc eq (pairs, key); |
|
1067 |
|
1068 (*association list update*) |
1040 (*association list update*) |
1069 fun overwrite (al, p as (key, _)) = |
1041 fun overwrite (al, p as (key, _)) = |
1070 let fun over ((q as (keyi, _)) :: pairs) = |
1042 let fun over ((q as (keyi, _)) :: pairs) = |
1071 if keyi = key then p :: pairs else q :: (over pairs) |
1043 if keyi = key then p :: pairs else q :: (over pairs) |
1072 | over [] = [p] |
|
1073 in over al end; |
|
1074 |
|
1075 fun gen_overwrite eq (al, p as (key, _)) = |
|
1076 let fun over ((q as (keyi, _)) :: pairs) = |
|
1077 if eq (keyi, key) then p :: pairs else q :: (over pairs) |
|
1078 | over [] = [p] |
1044 | over [] = [p] |
1079 in over al end; |
1045 in over al end; |
1080 |
1046 |
1081 |
1047 |
1082 (* lists as tables *) |
1048 (* lists as tables *) |