1type t('a) = array('a);
2
3[@bs.new] external makeEmpty: unit => t('a) = "Array";
4[@bs.new] external makeUninitialized: int => t('a) = "Array";
5
6[@bs.get] external size: t('a) => int = "length";
7[@bs.get_index] external get: (t('a), int) => option('a) = "";
8[@bs.get_index] external getUnsafe: (t('a), int) => 'a = "";
9[@bs.set_index] external setUnsafe: (t('a), int, 'a) => unit = "";
10
11[@bs.send] external fill: (t('a), 'a) => unit = "fill";
12[@bs.send] external reverseInPlace: t('a) => unit = "reverse";
13
14[@bs.send] external copy: t('a) => t('a) = "slice";
15[@bs.send]
16external slice: (t('a), ~start: int, ~end_: int) => t('a) = "slice";
17[@bs.send] external append: (t('a), 'a) => t('a) = "concat";
18[@bs.send] external concat: (t('a), t('a)) => t('a) = "concat";
19
20[@bs.send] external map: (t('a), 'a => 'b) => t('b) = "map";
21[@bs.send] external mapi: (t('a), ('a, int) => 'b) => t('b) = "map";
22[@bs.send] external some: (t('a), 'a => bool) => bool = "some";
23[@bs.send] external somei: (t('a), ('a, int) => bool) => bool = "some";
24[@bs.send] external every: (t('a), 'a => bool) => bool = "every";
25[@bs.send] external everyi: (t('a), ('a, int) => bool) => bool = "every";
26[@bs.send] external filter: (t('a), 'a => bool) => t('a) = "filter";
27[@bs.send] external filteri: (t('a), ('a, int) => bool) => t('a) = "filter";
28[@bs.send] external find: (t('a), 'a => bool) => option('a) = "find";
29[@bs.send] external findi: (t('a), ('a, int) => bool) => option('a) = "find";
30[@bs.send] external findIndex: (t('a), 'a => bool) => int = "findIndex";
31[@bs.send] external forEach: (t('a), 'a => unit) => unit = "forEach";
32[@bs.send] external forEachi: (t('a), ('a, int) => unit) => unit = "forEach";
33[@bs.send] external reduce: (t('a), ('b, 'a) => 'b, 'b) => 'b = "reduce";
34[@bs.send]
35external reduceRight: (t('a), ('b, 'a) => 'b, 'b) => 'b = "reduceRight";
36
37[@bs.send] external indexOf: (t('a), 'a) => int = "indexOf";
38[@bs.send] external lastIndexOf: (t('a), 'a) => int = "lastIndexOf";
39
40/* No need to replicate what Belt already has */
41let shuffle = Belt.Array.shuffle;
42let shuffleInPlace = Belt.Array.shuffleInPlace;
43
44let make = (len: int, vals: 'a): t('a) => {
45 let res = makeUninitialized(len);
46 fill(res, vals);
47 res;
48};
49
50let set = (arr: t('a), index: int, x: 'a) =>
51 if (index < size(arr) && index >= 0) {
52 setUnsafe(arr, index, x);
53 true;
54 } else {
55 false;
56 };
57
58let reverse = (arr: t('a)): t('a) => {
59 let res = copy(arr);
60 reverseInPlace(arr);
61 res;
62};
63
64let includes = (arr: t('a), x: 'a): bool => indexOf(arr, x) > (-1);
65
66[@bs.send] external removeInPlace: (t('a), int) => t('a) = "splice";
67[@bs.send]
68external removeCountInPlace: (t('a), ~pos: int, ~count: int) => t('a) =
69 "splice";
70
71let remove = (arr: t('a), pos: int) => removeInPlace(copy(arr), pos);
72
73let removeCount = (arr: t('a), ~pos: int, ~count: int) =>
74 removeCountInPlace(copy(arr), ~pos, ~count);
75
76module Js = {
77 [@bs.send] external push: (t('a), 'a) => unit = "push";
78 [@bs.send] external pop: t('a) => option('a) = "pop";
79 [@bs.send] external unshift: (t('a), 'a) => unit = "unshift";
80 [@bs.send] external shift: t('a) => option('a) = "shift";
81
82 [@bs.scope ("Array", "prototype", "push")] [@bs.val]
83 external pushMany: (t('a), t('a)) => unit = "apply";
84 [@bs.scope ("Array", "prototype", "unshift")] [@bs.val]
85 external unshiftMany: (t('a), t('a)) => unit = "apply";
86
87 [@bs.send]
88 external spliceInPlace:
89 (t('a), ~pos: int, ~remove: int, ~add: t('a)) => t('a) =
90 "splice";
91
92 let splice = (arr: t('a), ~pos: int, ~remove: int, ~add: t('a)) =>
93 spliceInPlace(copy(arr), ~pos, ~remove, ~add);
94};