Skip to content

Commit fa4b92f

Browse files
committed
feat(array): add findMap
1 parent 71c1124 commit fa4b92f

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

src/Core__Array.mjs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,22 @@ function flatMap(a, f) {
106106
return Caml_splice_call.spliceObjApply([], "concat", [a.map(f)]);
107107
}
108108

109+
function findMap(arr, f) {
110+
var _i = 0;
111+
while(true) {
112+
var i = _i;
113+
if (i === arr.length) {
114+
return ;
115+
}
116+
var r = Curry._1(f, arr[i]);
117+
if (r !== undefined) {
118+
return r;
119+
}
120+
_i = i + 1 | 0;
121+
continue ;
122+
};
123+
}
124+
109125
export {
110126
indexOfOpt ,
111127
lastIndexOfOpt ,
@@ -118,5 +134,6 @@ export {
118134
shuffle ,
119135
shuffleInPlace ,
120136
flatMap ,
137+
findMap ,
121138
}
122139
/* No side effect */

src/Core__Array.res

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,18 @@ let filterMap = (a, f) => filterMapU(a, (. a) => f(a))
197197
// TODO: Change this implementation?
198198
let flatMap = (a, f) => []->concatMany(map(a, f))
199199

200+
let findMap = (arr, f) => {
201+
let rec loop = i =>
202+
if i == arr->length {
203+
None
204+
} else {
205+
switch f(getUnsafe(arr, i)) {
206+
| None => loop(i + 1)
207+
| Some(_) as r => r
208+
}
209+
}
210+
211+
loop(0)
212+
}
213+
200214
@send external at: (array<'a>, int) => option<'a> = "at"

src/Core__Array.resi

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ let filterMap: (array<'a>, 'a => option<'b>) => array<'b>
103103
let shuffle: array<'a> => array<'a>
104104
let shuffleInPlace: array<'a> => unit
105105
let flatMap: (array<'a>, 'a => array<'b>) => array<'b>
106-
106+
let findMap: (array<'a>, 'a => option<'b>) => option<'b>
107107

108108
/**
109109
`at(array, index)`
@@ -120,4 +120,5 @@ let flatMap: (array<'a>, 'a => array<'b>) => array<'b>
120120
["a", "b", "c"]->Array.at(-4) // None
121121
```
122122
*/
123-
@send external at: (array<'a>, int) => option<'a> = "at"
123+
@send
124+
external at: (array<'a>, int) => option<'a> = "at"

0 commit comments

Comments
 (0)