1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(* Utils toolbox *)
(* analyzes all list items with func *)
(* 'a list -> ('a -> 'b -> 'c * 'b) -> 'b -> 'c list * 'b *)
let analyse_list list func env =
List.fold_left
(fun (l, env) item ->
let item, env = func item env in
(l @ [ item ], env) )
([], env) list
(* checks all list items with a boolean func *)
(* 'a list -> ('a -> bool) -> bool *)
let check_list list func =
List.fold_left (fun acc item -> func item || acc) false list
(* [1,2,3,4,5] 3 -> [1,2,3] [4,5] *)
(* 'a list -> int -> 'a list * 'a list *)
let rec cut_list_at list n =
assert (n >= 0);
if n = 0 then ([], list)
else
match list with
| [] -> ([], [])
| hd :: tl ->
let l1, l2 = cut_list_at tl (n - 1) in
(hd :: l1, l2)