(** {2 Optional values} *)
let map_option f = function None -> None | Some v -> Some (f v)
+let iter_option f = function None -> () | Some v -> f v
let unopt = function None -> failwith "unopt: None" | Some v -> v
(** {2 String processing} *)
| None -> filter_map f tl
| Some v -> v :: filter_map f tl)
+let list_concat ?(sep = []) =
+ let rec aux acc =
+ function
+ | [] -> []
+ | [ last ] -> List.flatten (List.rev (last :: acc))
+ | hd :: tl -> aux ([sep; hd] @ acc) tl
+ in
+ aux []
+
(** {2 File predicates} *)
let is_dir fname =