src/Pure/library.ML
changeset 19383 a7c055012a8c
parent 19301 ce99525202fc
child 19424 b701ea590259
equal deleted inserted replaced
19382:44937faf9e1a 19383:a7c055012a8c
   135   val split_list: ('a * 'b) list -> 'a list * 'b list
   135   val split_list: ('a * 'b) list -> 'a list * 'b list
   136   val separate: 'a -> 'a list -> 'a list
   136   val separate: 'a -> 'a list -> 'a list
   137   val replicate: int -> 'a -> 'a list
   137   val replicate: int -> 'a -> 'a list
   138   val multiply: 'a list -> 'a list list -> 'a list list
   138   val multiply: 'a list -> 'a list list -> 'a list list
   139   val product: 'a list -> 'b list -> ('a * 'b) list
   139   val product: 'a list -> 'b list -> ('a * 'b) list
       
   140   val coalesce: ('a * 'a -> bool) -> ('a * 'b) list -> ('a * 'b list) list
   140   val filter: ('a -> bool) -> 'a list -> 'a list
   141   val filter: ('a -> bool) -> 'a list -> 'a list
   141   val filter_out: ('a -> bool) -> 'a list -> 'a list
   142   val filter_out: ('a -> bool) -> 'a list -> 'a list
   142   val equal_lists: ('a * 'b -> bool) -> 'a list * 'b list -> bool
   143   val equal_lists: ('a * 'b -> bool) -> 'a list * 'b list -> bool
   143   val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool
   144   val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool
   144   val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
   145   val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
   688 (*direct product*)
   689 (*direct product*)
   689 fun product _ [] = []
   690 fun product _ [] = []
   690   | product [] _ = []
   691   | product [] _ = []
   691   | product (x :: xs) ys = map (pair x) ys @ product xs ys;
   692   | product (x :: xs) ys = map (pair x) ys @ product xs ys;
   692 
   693 
       
   694 (*coalesce ranges of equal keys*)
       
   695 fun coalesce eq =
       
   696   let
       
   697     fun vals _ [] = ([], [])
       
   698       | vals x (lst as (y, b) :: ps) =
       
   699           if eq (x, y) then vals x ps |>> cons b
       
   700           else ([], lst);
       
   701     fun coal [] = []
       
   702       | coal ((x, a) :: ps) =
       
   703           let val (bs, qs) = vals x ps
       
   704           in (x, a :: bs) :: coal qs end;
       
   705   in coal end;
       
   706 
   693 
   707 
   694 (* filter *)
   708 (* filter *)
   695 
   709 
   696 (*copy the list preserving elements that satisfy the predicate*)
   710 (*copy the list preserving elements that satisfy the predicate*)
   697 val filter = List.filter;
   711 val filter = List.filter;