src/Pure/library.ML
changeset 67522 9e712280cc37
parent 67521 6a27e86cc2e7
child 67560 0fa87bd86566
equal deleted inserted replaced
67521:6a27e86cc2e7 67522:9e712280cc37
    97   val map_split: ('a -> 'b * 'c) -> 'a list -> 'b list * 'c list
    97   val map_split: ('a -> 'b * 'c) -> 'a list -> 'b list * 'c list
    98   val zip_options: 'a list -> 'b option list -> ('a * 'b) list
    98   val zip_options: 'a list -> 'b option list -> ('a * 'b) list
    99   val ~~ : 'a list * 'b list -> ('a * 'b) list
    99   val ~~ : 'a list * 'b list -> ('a * 'b) list
   100   val split_list: ('a * 'b) list -> 'a list * 'b list
   100   val split_list: ('a * 'b) list -> 'a list * 'b list
   101   val burrow_fst: ('a list -> 'b list) -> ('a * 'c) list -> ('b * 'c) list
   101   val burrow_fst: ('a list -> 'b list) -> ('a * 'c) list -> ('b * 'c) list
       
   102   val take_prefix: ('a -> bool) -> 'a list -> 'a list
       
   103   val drop_prefix: ('a -> bool) -> 'a list -> 'a list
       
   104   val chop_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
       
   105   val take_suffix: ('a -> bool) -> 'a list -> 'a list
       
   106   val drop_suffix: ('a -> bool) -> 'a list -> 'a list
       
   107   val chop_suffix: ('a -> bool) -> 'a list -> 'a list * 'a list
   102   val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool
   108   val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool
   103   val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
       
   104   val take_suffix: ('a -> bool) -> 'a list -> 'a list * 'a list
       
   105   val chop_common_prefix: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list * ('a list * 'b list)
   109   val chop_common_prefix: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list * ('a list * 'b list)
   106   val prefixes1: 'a list -> 'a list list
   110   val prefixes1: 'a list -> 'a list list
   107   val prefixes: 'a list -> 'a list list
   111   val prefixes: 'a list -> 'a list list
   108   val suffixes1: 'a list -> 'a list list
   112   val suffixes1: 'a list -> 'a list list
   109   val suffixes: 'a list -> 'a list list
   113   val suffixes: 'a list -> 'a list list
   524 val split_list = ListPair.unzip;
   528 val split_list = ListPair.unzip;
   525 
   529 
   526 fun burrow_fst f xs = split_list xs |>> f |> op ~~;
   530 fun burrow_fst f xs = split_list xs |>> f |> op ~~;
   527 
   531 
   528 
   532 
       
   533 (* take, drop, chop, trim according to predicate *)
       
   534 
       
   535 fun take_prefix pred list =
       
   536   let
       
   537     fun take res (x :: xs) = if pred x then take (x :: res) xs else rev res
       
   538       | take res [] = rev res;
       
   539   in take [] list end;
       
   540 
       
   541 fun drop_prefix pred list =
       
   542   let
       
   543     fun drop (x :: xs) = if pred x then drop xs else x :: xs
       
   544       | drop [] = [];
       
   545   in drop list end;
       
   546 
       
   547 fun chop_prefix pred list =
       
   548   let
       
   549     val prfx = take_prefix pred list;
       
   550     val sffx = drop (length prfx) list;
       
   551   in (prfx, sffx) end;
       
   552 
       
   553 fun take_suffix pred list =
       
   554   let
       
   555     fun take res (x :: xs) = if pred x then take (x :: res) xs else res
       
   556       | take res [] = res;
       
   557   in take [] (rev list) end;
       
   558 
       
   559 fun drop_suffix pred list =
       
   560   let
       
   561     fun drop (x :: xs) = if pred x then drop xs else rev (x :: xs)
       
   562       | drop [] = [];
       
   563   in drop (rev list) end;
       
   564 
       
   565 fun chop_suffix pred list =
       
   566   let
       
   567     val prfx = drop_suffix pred list;
       
   568     val sffx = drop (length prfx) list;
       
   569   in (prfx, sffx) end;
       
   570 
       
   571 fun trim pred = drop_prefix pred #> drop_suffix pred;
       
   572 
       
   573 
   529 (* prefixes, suffixes *)
   574 (* prefixes, suffixes *)
   530 
   575 
   531 fun is_prefix _ [] _ = true
   576 fun is_prefix _ [] _ = true
   532   | is_prefix eq (x :: xs) (y :: ys) = eq (x, y) andalso is_prefix eq xs ys
   577   | is_prefix eq (x :: xs) (y :: ys) = eq (x, y) andalso is_prefix eq xs ys
   533   | is_prefix eq _ _ = false;
   578   | is_prefix eq _ _ = false;
   534 
       
   535 (* [x1, ..., xi, ..., xn]  --->  ([x1, ..., x(i-1)], [xi, ..., xn])
       
   536    where xi is the first element that does not satisfy the predicate*)
       
   537 fun take_prefix (pred : 'a -> bool)  (xs: 'a list) : 'a list * 'a list =
       
   538   let fun take (rxs, []) = (rev rxs, [])
       
   539         | take (rxs, x :: xs) =
       
   540             if  pred x  then  take(x :: rxs, xs)  else  (rev rxs, x :: xs)
       
   541   in  take([], xs)  end;
       
   542 
       
   543 (* [x1, ..., xi, ..., xn]  --->  ([x1, ..., xi], [x(i+1), ..., xn])
       
   544    where xi is the last element that does not satisfy the predicate*)
       
   545 fun take_suffix _ [] = ([], [])
       
   546   | take_suffix pred (x :: xs) =
       
   547       (case take_suffix pred xs of
       
   548         ([], sffx) => if pred x then ([], x :: sffx) else ([x], sffx)
       
   549       | (prfx, sffx) => (x :: prfx, sffx));
       
   550 
   579 
   551 fun chop_common_prefix eq ([], ys) = ([], ([], ys))
   580 fun chop_common_prefix eq ([], ys) = ([], ([], ys))
   552   | chop_common_prefix eq (xs, []) = ([], (xs, []))
   581   | chop_common_prefix eq (xs, []) = ([], (xs, []))
   553   | chop_common_prefix eq (xs as x :: xs', ys as y :: ys') =
   582   | chop_common_prefix eq (xs as x :: xs', ys as y :: ys') =
   554       if eq (x, y) then
   583       if eq (x, y) then
   561 
   590 
   562 fun prefixes xs = [] :: prefixes1 xs;
   591 fun prefixes xs = [] :: prefixes1 xs;
   563 
   592 
   564 fun suffixes1 xs = map rev (prefixes1 (rev xs));
   593 fun suffixes1 xs = map rev (prefixes1 (rev xs));
   565 fun suffixes xs = [] :: suffixes1 xs;
   594 fun suffixes xs = [] :: suffixes1 xs;
   566 
       
   567 fun trim pred = take_prefix pred #> #2 #> take_suffix pred #> #1;
       
   568 
   595 
   569 
   596 
   570 (** integers **)
   597 (** integers **)
   571 
   598 
   572 (* lists of integers *)
   599 (* lists of integers *)