aux 0 l
;;
+let list_index p =
+ let rec aux n =
+ function
+ [] -> None
+ | he::_ when p he -> Some (n,he)
+ | _::tl -> aux (n + 1) tl
+ in
+ aux 0
+;;
+
let rec list_iter_default2 f l1 def l2 =
match l1,l2 with
| [], _ -> ()
| 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
in
aux []
+let list_iter_sep ~sep f =
+ let rec aux =
+ function
+ | [] -> ()
+ | [ last ] -> f last
+ | hd :: tl -> f hd; sep (); aux tl
+ in
+ 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 l = List.rev l in
try List.hd l with exn -> raise (Failure "HExtlib.list_last")
;;
-
+
+let rec list_assoc_all a = function
+ | [] -> []
+ | (x, y) :: tl when x = a -> y :: list_assoc_all a tl
+ | _ :: tl -> list_assoc_all a tl
+;;
+
(** {2 File predicates} *)
let is_dir fname =
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 list_seq start stop =
+ if start > stop then [] else
let rec aux pos =
if pos = stop then []
else pos :: (aux (pos+1))
aux start
;;
+let rec list_skip n l =
+ match n,l with
+ | 0,_ -> l
+ | n,_::l -> list_skip (n-1) l
+ | _, [] -> assert false
+;;
+