diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/util.ml | 9 | ||||
| -rw-r--r-- | lib/util.mli | 4 |
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/util.ml b/lib/util.ml index fb271ea421..a8e716e0f3 100644 --- a/lib/util.ml +++ b/lib/util.ml @@ -488,6 +488,15 @@ let list_map4 f l1 l2 l3 l4 = in map (l1,l2,l3,l4) +let rec list_smartfilter f l = match l with + [] -> l + | h::tl -> + let tl' = list_smartfilter f tl in + if f h then + if tl' == tl then l + else h :: tl' + else tl' + let list_index x = let rec index_x n = function | y::l -> if x = y then n else index_x (succ n) l diff --git a/lib/util.mli b/lib/util.mli index 13be5521d6..5248d0e6b1 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -149,6 +149,10 @@ val list_map4 : val list_filter_i : (int -> 'a -> bool) -> 'a list -> 'a list +(** [list_smartfilter f [a1...an] = List.filter f [a1...an]] but if for all i + [f ai = true], then [list_smartfilter f l==l] *) +val list_smartfilter : ('a -> bool) -> 'a list -> 'a list + (** [list_index] returns the 1st index of an element in a list (counting from 1) *) val list_index : 'a -> 'a list -> int |
