Source file indexed_container.ml
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
include Indexed_container_intf
let with_return = With_return.with_return
let iteri ~fold t ~f =
ignore
(fold t ~init:0 ~f:(fun i x ->
f i x;
i + 1)
: int)
;;
let foldi ~fold t ~init ~f =
let i = ref 0 in
fold t ~init ~f:(fun acc v ->
let acc = f !i acc v in
i := !i + 1;
acc)
;;
let counti ~foldi t ~f = foldi t ~init:0 ~f:(fun i n a -> if f i a then n + 1 else n)
let existsi ~iteri c ~f =
with_return (fun r ->
iteri c ~f:(fun i x -> if f i x then r.return true);
false)
;;
let for_alli ~iteri c ~f =
with_return (fun r ->
iteri c ~f:(fun i x -> if not (f i x) then r.return false);
true)
;;
let find_mapi ~iteri t ~f =
with_return (fun r ->
iteri t ~f:(fun i x ->
match f i x with
| None -> ()
| Some _ as res -> r.return res);
None)
;;
let findi ~iteri c ~f =
with_return (fun r ->
iteri c ~f:(fun i x -> if f i x then r.return (Some (i, x)));
None)
;;
module Make (T : Make_arg) : S1 with type 'a t := 'a T.t = struct
include Container.Make (T)
let iteri =
match T.iteri with
| `Custom iteri -> iteri
| `Define_using_fold -> fun t ~f -> iteri ~fold t ~f
;;
let foldi =
match T.foldi with
| `Custom foldi -> foldi
| `Define_using_fold -> fun t ~init ~f -> foldi ~fold t ~init ~f
;;
let counti t ~f = counti ~foldi t ~f
let existsi t ~f = existsi ~iteri t ~f
let for_alli t ~f = for_alli ~iteri t ~f
let find_mapi t ~f = find_mapi ~iteri t ~f
let findi t ~f = findi ~iteri t ~f
end