(** PROFILING *)
-let profiling_enabled = ref true ;; (* ComponentsConf.profiling *)
+let profiling_enabled = ref false ;; (* ComponentsConf.profiling *)
let something_profiled = ref false
List.flatten (List.map f l)
;;
+let list_mapi f l =
+ let rec aux k = function
+ | [] -> []
+ | h::tl -> f h k :: aux (k+1) tl
+ in
+ aux 0 l
+;;
+
+let rec list_iter_default2 f l1 def l2 =
+ match l1,l2 with
+ | [], _ -> ()
+ | a::ta, b::tb -> f a b; list_iter_default2 f ta def tb
+ | a::ta, [] -> f a def; list_iter_default2 f ta def []
+;;
+
+let rec list_forall_default3 f l1 l2 def l3 =
+ match l1,l2,l3 with
+ | [], [], _ -> true
+ | [], _, _
+ | _, [], _ -> raise (Invalid_argument "list_forall_default3")
+ | a::ta, b::tb, c::tc -> f a b c && list_forall_default3 f ta tb def tc
+ | a::ta, b::tb, [] -> f a b def && list_forall_default3 f ta tb def []
+;;
+
+let sharing_map f l =
+ let unchanged = ref true in
+ let rec aux b = function
+ | [] as t -> unchanged := b; t
+ | he::tl ->
+ let he1 = f he in
+ he1 :: aux (b && he1 == he) tl
+ in
+ let l1 = aux true l in
+ if !unchanged then l else l1
+;;
+
let rec list_uniq ?(eq=(=)) = function
| [] -> []
| h::[] -> [h]
let touch s =
try close_out(open_out s) with Sys_error _ -> ()
;;
+
+let rec mk_list x = function
+ | 0 -> []
+ | n -> x :: mk_list x (n-1)
+;;