1type t('a) = array('a);
2
3let makeEmpty = (): t('a) => [||];
4let makeUninitialized = Belt.Array.makeUninitializedUnsafe;
5let make = Belt.Array.make;
6
7let size = Belt.Array.size;
8let get = Belt.Array.get;
9let getUnsafe = Belt.Array.getUnsafe;
10let set = Belt.Array.set;
11let setUnsafe = Belt.Array.setUnsafe;
12
13let fill = (arr: t('a), x: 'a) =>
14 Belt.Array.fill(arr, ~offset=0, ~len=size(arr), x);
15
16let reverseInPlace = Belt.Array.reverseInPlace;
17let reverse = Belt.Array.reverse;
18let shuffle = Belt.Array.shuffle;
19let shuffleInPlace = Belt.Array.shuffleInPlace;
20
21let copy = Belt.Array.copy;
22
23let slice = (arr: t('a), ~start: int, ~end_: int): t('a) => {
24 let len = end_ - start;
25 Belt.Array.slice(arr, ~offset=start, ~len);
26};
27
28let concat = Belt.Array.concat;
29
30let append = (arr: t('a), x: 'a) => Belt.Array.concat(arr, [|x|]);
31
32let somei = (arr: t('a), f: ('a, int) => bool): bool => {
33 let len = size(arr);
34 let rec search = (i: int) =>
35 if (i >= len) {
36 false;
37 } else if (f(getUnsafe(arr, i), i)) {
38 true;
39 } else {
40 search(i + 1);
41 };
42
43 search(0);
44};
45
46let everyi = (arr: t('a), f: ('a, int) => bool): bool => {
47 let len = size(arr);
48 let rec search = (i: int) =>
49 if (i >= len) {
50 true;
51 } else if (!f(getUnsafe(arr, i), i)) {
52 false;
53 } else {
54 search(i + 1);
55 };
56
57 search(0);
58};
59
60let findi = (arr: t('a), f: ('a, int) => bool): option('a) => {
61 let len = size(arr);
62 let rec search = (i: int) =>
63 if (i >= len) {
64 None;
65 } else {
66 let x = getUnsafe(arr, i);
67 if (f(x, i)) {
68 Some(x);
69 } else {
70 search(i + 1);
71 };
72 };
73
74 search(0);
75};
76
77let findIndex = (arr: t('a), f: 'a => bool): int => {
78 let len = size(arr);
79 let rec search = (i: int) =>
80 if (i >= len) {
81 (-1);
82 } else if (f(getUnsafe(arr, i))) {
83 i;
84 } else {
85 search(i + 1);
86 };
87
88 search(0);
89};
90
91let lastIndexOf = (arr: t('a), x: 'a): int => {
92 let len = size(arr);
93 let rec search = (i: int) =>
94 if (i < 0) {
95 (-1);
96 } else if (x === getUnsafe(arr, i)) {
97 i;
98 } else {
99 search(i - 1);
100 };
101
102 search(len - 1);
103};
104
105let filteri = (arr: t('a), f: ('a, int) => bool): t('a) => {
106 let len = size(arr);
107 let res: t('a) = copy(arr);
108 let j = ref(-1);
109
110 let rec filter = (i: int) =>
111 if (i >= len) {
112 Array.sub(res, 0, j^ + 1);
113 } else {
114 let x = getUnsafe(arr, i);
115 if (f(x, i)) {
116 j := j^ + 1;
117 Belt.Array.setUnsafe(arr, j^, x);
118 };
119
120 filter(i + 1);
121 };
122
123 filter(0);
124};
125
126let removeCount = (arr: t('a), ~pos: int, ~count: int): t('a) => {
127 let len = size(arr);
128 let pos2 = pos + count - 1;
129 let res = Array.sub(arr, 0, len - count);
130
131 let rec copy = (i: int) =>
132 if (i >= len) {
133 res;
134 } else if (i >= pos && i <= pos2) {
135 copy(i + 1);
136 } else {
137 let j = i > pos2 ? i - count : i;
138 Belt.Array.setUnsafe(arr, j, Belt.Array.getUnsafe(arr, i));
139 copy(i + 1);
140 };
141
142 copy(0);
143};
144
145let find = (arr: t('a), f: 'a => bool): option('a) =>
146 findi(arr, (x, _i) => f(x));
147let indexOf = (arr: t('a), x: 'a): int => findIndex(arr, item => item === x);
148let includes = (arr: t('a), x: 'a): bool =>
149 findIndex(arr, item => item === x) > (-1);
150let filter = (arr: t('a), f: 'a => bool): t('a) =>
151 filteri(arr, (x, _i) => f(x));
152let remove = (arr: t('a), index: int): t('a) =>
153 removeCount(arr, ~pos=index, ~count=1);
154
155let some = Belt.Array.some;
156let every = Belt.Array.every;
157let map = Belt.Array.map;
158let mapi = (arr: t('a), f: ('a, int) => 'b): t('b) =>
159 Belt.Array.mapWithIndexU(arr, (. i, x) => f(x, i));
160let forEach = Belt.Array.forEach;
161let forEachi = (arr: t('a), f: ('a, int) => unit): unit =>
162 Belt.Array.forEachWithIndexU(arr, (. i, x) => f(x, i));
163let reduce = (arr: t('a), reducer: ('b, 'a) => 'b, acc: 'b): 'b =>
164 Belt.Array.reduce(arr, acc, reducer);
165let reduceRight = (arr: t('a), reducer: ('b, 'a) => 'b, acc: 'b): 'b =>
166 Belt.Array.reduceReverse(arr, acc, reducer);