src/Pure/library.ML
changeset 17486 d691bf893d9f
parent 17341 ca0e5105c4b1
child 17498 d83af87bbdc5
equal deleted inserted replaced
17485:c39871c52977 17486:d691bf893d9f
   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 *)