(** PROFILING *)
-let profiling_enabled = ComponentsConf.profiling
+let profiling_enabled = false ;; (* ComponentsConf.profiling *)
let something_profiled = ref false
(** {2 List processing} *)
+let flatten_map f l =
+ List.flatten (List.map f l)
+;;
+
let rec list_uniq ?(eq=(=)) = function
| [] -> []
| h::[] -> [h]
in
aux l
+let split_nth n l =
+ let rec aux acc n l =
+ match n, l with
+ | 0, _ -> List.rev acc, l
+ | n, [] -> raise (Failure "HExtlib.split_nth")
+ | n, hd :: tl -> aux (hd :: acc) (n - 1) tl in
+ aux [] n l
+
(** {2 File predicates} *)
let is_dir fname =
let safe_remove fname = if Sys.file_exists fname then Sys.remove fname
let is_dir_empty d =
- let od = Unix.opendir d in
- let rec aux () =
- let name = Unix.readdir od in
- if name <> "." && name <> ".." then false else aux () in
- let res = try aux () with End_of_file -> true in
- Unix.closedir od;
- res
+ try
+ let od = Unix.opendir d in
+ let rec aux () =
+ let name = Unix.readdir od in
+ if name <> "." && name <> ".." then false else aux () in
+ let res = try aux () with End_of_file -> true in
+ Unix.closedir od;
+ res
+ with
+ Unix.Unix_error _ -> true (* raised by Unix.opendir, we hope :-) *)
let safe_rmdir d = try Unix.rmdir d with Unix.Unix_error _ -> ()