1
+ @new external makeUninitializedUnsafe : int => array <'a > = "Array"
2
+ @set external truncateToLengthUnsafe : (array <'a >, int ) => unit = "length"
1
3
external getUnsafe : (array <'a >, int ) => 'a = "%array_unsafe_get"
2
4
external setUnsafe : (array <'a >, int , 'a ) => unit = "%array_unsafe_set"
3
5
@@ -11,6 +13,32 @@ external fromArrayLikeWithMap: (Js.Array2.array_like<'a>, 'a => 'b) => array<'b>
11
13
@val external fromIterator : Core__Iterator .t <'a > => array <'a > = "Array.from"
12
14
@val external fromIteratorWithMap : (Core__Iterator .t <'a >, 'a => 'b ) => array <'b > = "Array.from"
13
15
16
+ @send external fillAllInPlace : (array <'a >, 'a ) => unit = "fill"
17
+
18
+ @send external fillInPlaceToEnd : (array <'a >, 'a , ~start : int ) => unit = "fill"
19
+
20
+ @send external fillInPlace : (array <'a >, 'a , ~start : int , ~end : int ) => unit = "fill"
21
+
22
+ let make = (~length , x ) =>
23
+ if length <= 0 {
24
+ []
25
+ } else {
26
+ let arr = makeUninitializedUnsafe (length )
27
+ arr -> fillAllInPlace (x )
28
+ arr
29
+ }
30
+
31
+ let fromInitializer = (~length , f ) =>
32
+ if length <= 0 {
33
+ []
34
+ } else {
35
+ let arr = makeUninitializedUnsafe (length )
36
+ for i in 0 to length - 1 {
37
+ arr -> setUnsafe (i , f (i ))
38
+ }
39
+ arr
40
+ }
41
+
14
42
@val external isArray : 'a => bool = "Array.isArray"
15
43
16
44
@get external length : array <'a > => int = "length"
@@ -23,12 +51,6 @@ external copyWithinToEnd: (array<'a>, ~target: int, ~start: int) => array<'a> =
23
51
@send
24
52
external copyWithin : (array <'a >, ~target : int , ~start : int , ~end : int ) => array <'a > = "copyWithin"
25
53
26
- @send external fillAllInPlace : (array <'a >, 'a ) => unit = "fill"
27
-
28
- @send external fillInPlaceToEnd : (array <'a >, 'a , ~start : int ) => unit = "fill"
29
-
30
- @send external fillInPlace : (array <'a >, 'a , ~start : int , ~end : int ) => unit = "fill"
31
-
32
54
@send external pop : array <'a > => option <'a > = "pop"
33
55
34
56
@send external push : (array <'a >, 'a ) => unit = "push"
@@ -105,35 +127,16 @@ let sort = (arr, cmp) => {
105
127
@send external map : (array <'a >, 'a => 'b ) => array <'b > = "map"
106
128
@send external mapWithIndex : (array <'a >, ('a , int ) => 'b ) => array <'b > = "map"
107
129
108
- let reduceU = (a , x , f ) => {
109
- let r = ref (x )
110
- for i in 0 to length (a ) - 1 {
111
- r .contents = f (. r .contents , getUnsafe (a , i ))
112
- }
113
- r .contents
114
- }
115
-
116
- let reduce = (a , x , f ) => reduceU (a , x , (. a , b ) => f (a , b ))
117
-
118
- let reduceWithIndexU = (a , x , f ) => {
119
- let r = ref (x )
120
- for i in 0 to length (a ) - 1 {
121
- r .contents = f (. r .contents , getUnsafe (a , i ), i )
122
- }
123
- r .contents
124
- }
125
-
126
- let reduceWithIndex = (a , x , f ) => reduceWithIndexU (a , x , (. a , b , c ) => f (a , b , c ))
127
-
128
- let reduceReverseU = (a , x , f ) => {
129
- let r = ref (x )
130
- for i in length (a ) - 1 downto 0 {
131
- r .contents = f (. r .contents , getUnsafe (a , i ))
132
- }
133
- r .contents
134
- }
135
-
136
- let reduceReverse = (a , x , f ) => reduceReverseU (a , x , (. a , b ) => f (a , b ))
130
+ @send external reduce : (array <'b >, ('a , 'b ) => 'a , 'a ) => 'a = "reduce"
131
+ let reduce = (arr , init , f ) => reduce (arr , f , init )
132
+ @send external reduceWithIndex : (array <'b >, ('a , 'b , int ) => 'a , 'a ) => 'a = "reduce"
133
+ let reduceWithIndex = (arr , init , f ) => reduceWithIndex (arr , f , init )
134
+ @send
135
+ external reduceRight : (array <'b >, ('a , 'b ) => 'a , 'a ) => 'a = "reduceRight"
136
+ let reduceRight = (arr , init , f ) => reduceRight (arr , f , init )
137
+ @send
138
+ external reduceRightWithIndex : (array <'b >, ('a , 'b , int ) => 'a , 'a ) => 'a = "reduceRight"
139
+ let reduceRightWithIndex = (arr , init , f ) => reduceRightWithIndex (arr , f , init )
137
140
138
141
@send external some : (array <'a >, 'a => bool ) => bool = "some"
139
142
@send external someWithIndex : (array <'a >, ('a , int ) => bool ) => bool = "some"
@@ -151,8 +154,6 @@ let findIndexOpt = (array: array<'a>, finder: 'a => bool): option<int> =>
151
154
| index => Some (index )
152
155
}
153
156
154
- @new external makeUninitializedUnsafe : int => array <'a > = "Array"
155
- @set external truncateToLengthUnsafe : (array <'a >, int ) => unit = "length"
156
157
let swapUnsafe = (xs , i , j ) => {
157
158
let tmp = getUnsafe (xs , i )
158
159
setUnsafe (xs , i , getUnsafe (xs , j ))
@@ -200,7 +201,22 @@ let filterMapU = (a, f) => {
200
201
201
202
let filterMap = (a , f ) => filterMapU (a , (. a ) => f (a ))
202
203
203
- // TODO: Change this implementation?
204
- let flatMap = (a , f ) => []-> concatMany (map (a , f ))
204
+ let keepSome = filterMap (_ , x => x )
205
+
206
+ @send external flatMap : (array <'a >, 'a => array <'b >) => array <'b > = "flatMap"
207
+
208
+ let findMap = (arr , f ) => {
209
+ let rec loop = i =>
210
+ if i == arr -> length {
211
+ None
212
+ } else {
213
+ switch f (getUnsafe (arr , i )) {
214
+ | None => loop (i + 1 )
215
+ | Some (_ ) as r => r
216
+ }
217
+ }
218
+
219
+ loop (0 )
220
+ }
205
221
206
222
@send external at : (array <'a >, int ) => option <'a > = "at"
0 commit comments