| None -> filter_map f tl
| Some v -> v :: filter_map f tl)
+let list_rev_map_filter f l =
+ let rec aux a = function
+ | [] -> a
+ | hd :: tl ->
+ begin match f hd with
+ | None -> aux a tl
+ | Some b -> aux (b :: a) tl
+ end
+ in
+ aux [] l
+
+let list_rev_map_filter_fold f v l =
+ let rec aux v a = function
+ | [] -> v, a
+ | hd :: tl ->
+ begin match f v hd with
+ | v, None -> aux v a tl
+ | v, Some b -> aux v (b :: a) tl
+ end
+ in
+ aux v [] l
+
let list_concat ?(sep = []) =
let rec aux acc =
function
(Unix.stat fname).Unix.st_kind = Unix.S_DIR
with Unix.Unix_error _ -> false
+let writable_dir path =
+ try
+ let file = path ^ "/prova_matita" in
+ let oc = open_out file in
+ close_out oc;
+ Sys.remove file;
+ true
+ with Sys_error _ -> false
+
+
let is_regular fname =
try
(Unix.stat fname).Unix.st_kind = Unix.S_REG