src/Pure/library.ML
changeset 20108 289050bdfff5
parent 20095 432e914a0e95
child 20133 9ee091573fa0
equal deleted inserted replaced
20107:239a0efd38b2 20108:289050bdfff5
   143   val filter_out: ('a -> bool) -> 'a list -> 'a list
   143   val filter_out: ('a -> bool) -> 'a list -> 'a list
   144   val map_filter: ('a -> 'b option) -> 'a list -> 'b list
   144   val map_filter: ('a -> 'b option) -> 'a list -> 'b list
   145   val equal_lists: ('a * 'b -> bool) -> 'a list * 'b list -> bool
   145   val equal_lists: ('a * 'b -> bool) -> 'a list * 'b list -> bool
   146   val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool
   146   val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool
   147   val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
   147   val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
       
   148   val chop_prefix: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list * ('a list * 'b list)
   148   val take_suffix: ('a -> bool) -> 'a list -> 'a list * 'a list
   149   val take_suffix: ('a -> bool) -> 'a list -> 'a list * 'a list
   149   val prefixes1: 'a list -> 'a list list
   150   val prefixes1: 'a list -> 'a list list
   150   val prefixes: 'a list -> 'a list list
   151   val prefixes: 'a list -> 'a list list
   151   val suffixes1: 'a list -> 'a list list
   152   val suffixes1: 'a list -> 'a list list
   152   val suffixes: 'a list -> 'a list list
   153   val suffixes: 'a list -> 'a list list
   749   let fun take (rxs, []) = (rev rxs, [])
   750   let fun take (rxs, []) = (rev rxs, [])
   750         | take (rxs, x :: xs) =
   751         | take (rxs, x :: xs) =
   751             if  pred x  then  take(x :: rxs, xs)  else  (rev rxs, x :: xs)
   752             if  pred x  then  take(x :: rxs, xs)  else  (rev rxs, x :: xs)
   752   in  take([], xs)  end;
   753   in  take([], xs)  end;
   753 
   754 
       
   755 fun chop_prefix eq ([], ys) = ([], ([], ys))
       
   756   | chop_prefix eq (xs, []) = ([], (xs, []))
       
   757   | chop_prefix eq (xs as x::xs', ys as y::ys') =
       
   758       if eq (x, y) then
       
   759         let val (ps', xys'') = chop_prefix eq (xs', ys')
       
   760         in (x::ps', xys'') end
       
   761       else ([], (xs, ys));
       
   762 
   754 (* [x1, ..., xi, ..., xn]  --->  ([x1, ..., xi], [x(i+1), ..., xn])
   763 (* [x1, ..., xi, ..., xn]  --->  ([x1, ..., xi], [x(i+1), ..., xn])
   755    where xi is the last element that does not satisfy the predicate*)
   764    where xi is the last element that does not satisfy the predicate*)
   756 fun take_suffix _ [] = ([], [])
   765 fun take_suffix _ [] = ([], [])
   757   | take_suffix pred (x :: xs) =
   766   | take_suffix pred (x :: xs) =
   758       (case take_suffix pred xs of
   767       (case take_suffix pred xs of