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 |