| a::ta, b::tb, [] -> f a b def && list_forall_default3 f ta tb def []
;;
+exception FailureAt of int;;
+
+let list_forall_default3_var f l1 l2 def l3 =
+ let rec aux f l1 l2 def l3 i =
+ match l1,l2,l3 with
+ | [], [], _ -> true
+ | [], _, _
+ | _, [], _ -> raise (Invalid_argument "list_forall_default3")
+ | a::ta, b::tb, c::tc ->
+ if f a b c then aux f ta tb def tc (i+1)
+ else raise (FailureAt i)
+ | a::ta, b::tb, [] ->
+ if f a b def then aux f ta tb def [] (i+1)
+ else raise (FailureAt i)
+ in aux f l1 l2 def l3 0
+;;
+
let sharing_map f l =
let unchanged = ref true in
let rec aux b = function
aux []
let rec list_findopt f l =
- let rec aux = function
+ let rec aux k = function
| [] -> None
| x::tl ->
- (match f x with
- | None -> aux tl
+ (match f x k with
+ | None -> aux (succ k) tl
| Some _ as rc -> rc)
in
- aux l
+ aux 0 l
let split_nth n l =
let rec aux acc n l =
let floc_of_loc (loc_begin, loc_end) =
Stdpp.make_loc (loc_begin, loc_end)
-let dummy_floc = floc_of_loc (-1, -1)
+let dummy_floc = floc_of_loc (0, 0)
let raise_localized_exception ~offset floc exn =
let x, y = loc_of_floc floc in
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)
+;;
+
+let list_seq start stop =
+ if start > stop then [] else
+ let rec aux pos =
+ if pos = stop then []
+ else pos :: (aux (pos+1))
+ in
+ aux start
+;;
+
+let rec list_skip n l =
+ match n,l with
+ | 0,_ -> l
+ | n,_::l -> list_skip (n-1) l
+ | _, [] -> assert false
+;;
+