aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/option.ml10
-rw-r--r--lib/option.mli6
2 files changed, 16 insertions, 0 deletions
diff --git a/lib/option.ml b/lib/option.ml
index fbb883d30a..f3047a3ca7 100644
--- a/lib/option.ml
+++ b/lib/option.ml
@@ -188,4 +188,14 @@ module List =
|None -> find f t
|x -> x
+ let map f l =
+ let rec aux f l = match l with
+ | [] -> []
+ | x :: l ->
+ match f x with
+ | None -> raise Exit
+ | Some y -> y :: aux f l
+ in
+ try Some (aux f l) with Exit -> None
+
end
diff --git a/lib/option.mli b/lib/option.mli
index 5e085620e7..a336c895cc 100644
--- a/lib/option.mli
+++ b/lib/option.mli
@@ -123,4 +123,10 @@ module List : sig
val flatten : 'a option list -> 'a list
val find : ('a -> 'b option) -> 'a list -> 'b option
+
+ (** [List.map f [a1;...;an]] is the list [Some [b1;...;bn]] if
+ for all i, there is a [bi] such that [f ai] is [Some bi]; it is
+ [None] if, for at least one i, [f ai] is [None]. *)
+ val map : ('a -> 'b option) -> 'a list -> 'b list option
+
end