1+ @new external makeUninitializedUnsafe : int => array <'a > = "Array"
2+ @set external truncateToLengthUnsafe : (array <'a >, int ) => unit = "length"
13external getUnsafe : (array <'a >, int ) => 'a = "%array_unsafe_get"
24external setUnsafe : (array <'a >, int , 'a ) => unit = "%array_unsafe_set"
35
@@ -11,6 +13,32 @@ external fromArrayLikeWithMap: (Js.Array2.array_like<'a>, 'a => 'b) => array<'b>
1113@val external fromIterator : Core__Iterator .t <'a > => array <'a > = "Array.from"
1214@val external fromIteratorWithMap : (Core__Iterator .t <'a >, 'a => 'b ) => array <'b > = "Array.from"
1315
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+
1442@val external isArray : 'a => bool = "Array.isArray"
1543
1644@get external length : array <'a > => int = "length"
@@ -23,12 +51,6 @@ external copyWithinToEnd: (array<'a>, ~target: int, ~start: int) => array<'a> =
2351@send
2452external copyWithin : (array <'a >, ~target : int , ~start : int , ~end : int ) => array <'a > = "copyWithin"
2553
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-
3254@send external pop : array <'a > => option <'a > = "pop"
3355
3456@send external push : (array <'a >, 'a ) => unit = "push"
@@ -105,35 +127,16 @@ let sort = (arr, cmp) => {
105127@send external map : (array <'a >, 'a => 'b ) => array <'b > = "map"
106128@send external mapWithIndex : (array <'a >, ('a , int ) => 'b ) => array <'b > = "map"
107129
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 )
137140
138141@send external some : (array <'a >, 'a => bool ) => bool = "some"
139142@send external someWithIndex : (array <'a >, ('a , int ) => bool ) => bool = "some"
@@ -151,8 +154,6 @@ let findIndexOpt = (array: array<'a>, finder: 'a => bool): option<int> =>
151154 | index => Some (index )
152155 }
153156
154- @new external makeUninitializedUnsafe : int => array <'a > = "Array"
155- @set external truncateToLengthUnsafe : (array <'a >, int ) => unit = "length"
156157let swapUnsafe = (xs , i , j ) => {
157158 let tmp = getUnsafe (xs , i )
158159 setUnsafe (xs , i , getUnsafe (xs , j ))
@@ -200,7 +201,22 @@ let filterMapU = (a, f) => {
200201
201202let filterMap = (a , f ) => filterMapU (a , (. a ) => f (a ))
202203
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+ }
205221
206222@send external at : (array <'a >, int ) => option <'a > = "at"
0 commit comments