Source file readOnlyArray.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
(**
This is an internal module used to factorize code between {!FallbackArray}
and {!FunctionalArray}.
*)
type 'a t = 'a Array.t
(**
[make length fallback] creates an array of [length] + 1
elements. The final cell is reserved to store the [fallback]
value.
*)
let make length fallback =
let length = 1 + max 0 length in
Array.make length fallback
let init length fallback make_cell =
let a = make length fallback in
for i = 0 to length - 1 do
Array.unsafe_set a i (make_cell i)
done ;
a
let fallback array =
let len = Array.length array in
Array.unsafe_get array (len - 1)
let get array idx =
let len = Array.length array in
if idx >= 0 && idx < len then Array.unsafe_get array idx
else Array.unsafe_get array (len - 1)
let length array = Array.length array - 1
let iter f array =
for idx = 0 to length array - 1 do
f (Array.unsafe_get array idx)
done
let iteri f array =
for idx = 0 to length array - 1 do
f idx (Array.unsafe_get array idx)
done
let map f array =
let out = make (length array) (f (fallback array)) in
for idx = 0 to length array - 1 do
Array.unsafe_set out idx (f (Array.unsafe_get array idx))
done ;
out
let mapi f array =
let out = make (length array) (f (-1) (fallback array)) in
for idx = 0 to length array - 1 do
Array.unsafe_set out idx (f idx (Array.unsafe_get array idx))
done ;
out
let fold f array init =
let rec aux accu idx =
if idx > length array - 1 then accu
else aux (f accu (Array.unsafe_get array idx)) (idx + 1)
in
aux init 0
let fold_map f array init fallback =
let output = Array.(make (length array)) fallback in
let rec aux accu idx =
if idx > length array - 1 then accu
else
let accu, y = f accu (Array.unsafe_get array idx) in
Array.unsafe_set output idx y ;
aux accu (idx + 1)
in
(aux init 0, output)