@@ -4,9 +4,6 @@ const common = require('@metarhia/common');
4
4
const { asyncIter } = require ( './async-iterator.js' ) ;
5
5
const { promisify } = require ( 'util' ) ;
6
6
7
- const isIterable = items =>
8
- items [ Symbol . iterator ] || items [ Symbol . asyncIterator ] ;
9
-
10
7
// Asynchronous map (iterate parallel)
11
8
// items - <Iterable>, incoming
12
9
// fn - <Function>, to be executed for each value in the array
@@ -18,15 +15,15 @@ const isIterable = items =>
18
15
// err - <Error> | <null>
19
16
// result - <Iterable>
20
17
const map = ( items , fn , done = common . emptiness ) => {
21
- if ( ! isIterable ( items ) ) {
22
- done ( new TypeError ( '"items" argument is not iterable' ) ) ;
23
- return ;
24
- }
25
18
const isArray = Array . isArray ( items ) ;
26
- asyncIter ( items )
27
- . parallel ( promisify ( fn ) )
28
- . then ( res => done ( null , isArray ? res : new items . constructor ( res ) ) )
29
- . catch ( done ) ;
19
+ try {
20
+ asyncIter ( items )
21
+ . parallel ( promisify ( fn ) )
22
+ . then ( res => done ( null , isArray ? res : new items . constructor ( res ) ) )
23
+ . catch ( done ) ;
24
+ } catch ( err ) {
25
+ done ( err ) ;
26
+ }
30
27
} ;
31
28
32
29
// Non-blocking synchronous map
@@ -46,16 +43,18 @@ const asyncMap = (items, fn, options = {}, done = common.emptiness) => {
46
43
done = options ;
47
44
options = { } ;
48
45
}
49
- if ( ! isIterable ( items ) ) {
50
- done ( new TypeError ( '"items" argument is not iterable' ) ) ;
51
- return ;
52
- }
53
46
const isArray = Array . isArray ( items ) ;
54
- const iter = asyncIter ( items )
55
- . map ( promisify ( fn ) )
56
- . throttle ( options . percent , options . min ) ;
57
- const collect = isArray ? iter . toArray ( ) : iter . collectTo ( items . constructor ) ;
58
- collect . then ( res => done ( null , res ) ) . catch ( done ) ;
47
+ try {
48
+ const iter = asyncIter ( items )
49
+ . map ( promisify ( fn ) )
50
+ . throttle ( options . percent , options . min ) ;
51
+ const collect = isArray
52
+ ? iter . toArray ( )
53
+ : iter . collectTo ( items . constructor ) ;
54
+ collect . then ( res => done ( null , res ) ) . catch ( done ) ;
55
+ } catch ( err ) {
56
+ done ( err ) ;
57
+ }
59
58
} ;
60
59
61
60
// Asynchronous filter (iterate parallel)
@@ -76,20 +75,20 @@ const asyncMap = (items, fn, options = {}, done = common.emptiness) => {
76
75
// (err, result) => console.dir(result)
77
76
// );
78
77
const filter = ( items , fn , done = common . emptiness ) => {
79
- if ( ! isIterable ( items ) ) {
80
- done ( new TypeError ( '"items" argument is not iterable' ) ) ;
81
- return ;
82
- }
83
78
const isArray = Array . isArray ( items ) ;
84
- asyncIter ( items )
85
- . parallel ( async item => [ await promisify ( fn ) ( item ) , item ] )
86
- . then ( res => {
87
- const filtered = res
88
- . filter ( ( [ predicateResult ] ) => predicateResult )
89
- . map ( ( [ , item ] ) => item ) ;
90
- done ( null , isArray ? filtered : new items . constructor ( filtered ) ) ;
91
- } )
92
- . catch ( done ) ;
79
+ try {
80
+ asyncIter ( items )
81
+ . parallel ( async item => [ await promisify ( fn ) ( item ) , item ] )
82
+ . then ( res => {
83
+ const filtered = res
84
+ . filter ( ( [ predicateResult ] ) => predicateResult )
85
+ . map ( ( [ , item ] ) => item ) ;
86
+ done ( null , isArray ? filtered : new items . constructor ( filtered ) ) ;
87
+ } )
88
+ . catch ( done ) ;
89
+ } catch ( err ) {
90
+ done ( err ) ;
91
+ }
93
92
} ;
94
93
95
94
// Asynchronous reduce
@@ -111,10 +110,14 @@ const filter = (items, fn, done = common.emptiness) => {
111
110
// initial - <any>, optional value to be used as first
112
111
// argument in first iteration
113
112
const reduce = ( items , fn , done = common . emptiness , initial ) => {
114
- asyncIter ( items )
115
- . reduce ( ( prev , cur ) => promisify ( fn ) ( prev , cur ) , initial )
116
- . then ( res => done ( null , res ) )
117
- . catch ( done ) ;
113
+ try {
114
+ asyncIter ( items )
115
+ . reduce ( ( prev , cur ) => promisify ( fn ) ( prev , cur ) , initial )
116
+ . then ( res => done ( null , res ) )
117
+ . catch ( done ) ;
118
+ } catch ( err ) {
119
+ done ( err ) ;
120
+ }
118
121
} ;
119
122
120
123
// Asynchronous reduceRight
@@ -136,10 +139,14 @@ const reduce = (items, fn, done = common.emptiness, initial) => {
136
139
// initial - <any>, optional value to be used as first
137
140
// argument in first iteration
138
141
const reduceRight = ( items , fn , done = common . emptiness , initial ) => {
139
- asyncIter ( items )
140
- . reduceRight ( ( prev , cur ) => promisify ( fn ) ( prev , cur ) , initial )
141
- . then ( res => done ( null , res ) )
142
- . catch ( done ) ;
142
+ try {
143
+ asyncIter ( items )
144
+ . reduceRight ( ( prev , cur ) => promisify ( fn ) ( prev , cur ) , initial )
145
+ . then ( res => done ( null , res ) )
146
+ . catch ( done ) ;
147
+ } catch ( err ) {
148
+ done ( err ) ;
149
+ }
143
150
} ;
144
151
145
152
// Asynchronous each (iterate in parallel)
@@ -162,10 +169,14 @@ const reduceRight = (items, fn, done = common.emptiness, initial) => {
162
169
// (err, data) => console.dir('each done')
163
170
// );
164
171
const each = ( items , fn , done = common . emptiness ) => {
165
- asyncIter ( items )
166
- . parallel ( promisify ( fn ) )
167
- . then ( res => done ( null , res ) )
168
- . catch ( done ) ;
172
+ try {
173
+ asyncIter ( items )
174
+ . parallel ( promisify ( fn ) )
175
+ . then ( res => done ( null , res ) )
176
+ . catch ( done ) ;
177
+ } catch ( err ) {
178
+ done ( err ) ;
179
+ }
169
180
} ;
170
181
171
182
// Asynchronous series
@@ -190,10 +201,14 @@ const each = (items, fn, done = common.emptiness) => {
190
201
// }
191
202
// );
192
203
const series = ( items , fn , done = common . emptiness ) => {
193
- asyncIter ( items )
194
- . each ( promisify ( fn ) )
195
- . then ( res => done ( null , res ) )
196
- . catch ( done ) ;
204
+ try {
205
+ asyncIter ( items )
206
+ . each ( promisify ( fn ) )
207
+ . then ( res => done ( null , res ) )
208
+ . catch ( done ) ;
209
+ } catch ( err ) {
210
+ done ( err ) ;
211
+ }
197
212
} ;
198
213
199
214
// Asynchronous find (iterate in series)
@@ -216,10 +231,14 @@ const series = (items, fn, done = common.emptiness) => {
216
231
// }
217
232
// );
218
233
const find = ( items , fn , done = common . emptiness ) => {
219
- asyncIter ( items )
220
- . find ( promisify ( fn ) )
221
- . then ( res => done ( null , res ) )
222
- . catch ( done ) ;
234
+ try {
235
+ asyncIter ( items )
236
+ . find ( promisify ( fn ) )
237
+ . then ( res => done ( null , res ) )
238
+ . catch ( done ) ;
239
+ } catch ( err ) {
240
+ done ( err ) ;
241
+ }
223
242
} ;
224
243
225
244
// Asynchronous every
@@ -233,10 +252,14 @@ const find = (items, fn, done = common.emptiness) => {
233
252
// err - <Error> | <null>
234
253
// result - <boolean>
235
254
const every = ( items , fn , done = common . emptiness ) => {
236
- asyncIter ( items )
237
- . parallel ( promisify ( fn ) )
238
- . then ( res => done ( null , res . every ( e => e ) ) )
239
- . catch ( done ) ;
255
+ try {
256
+ asyncIter ( items )
257
+ . parallel ( promisify ( fn ) )
258
+ . then ( res => done ( null , res . every ( e => e ) ) )
259
+ . catch ( done ) ;
260
+ } catch ( err ) {
261
+ done ( err ) ;
262
+ }
240
263
} ;
241
264
242
265
// Asynchronous some (iterate in series)
@@ -250,10 +273,14 @@ const every = (items, fn, done = common.emptiness) => {
250
273
// err - <Error> | <null>
251
274
// result - <boolean>
252
275
const some = ( items , fn , done = common . emptiness ) => {
253
- asyncIter ( items )
254
- . some ( promisify ( fn ) )
255
- . then ( res => done ( null , res ) )
256
- . catch ( done ) ;
276
+ try {
277
+ asyncIter ( items )
278
+ . some ( promisify ( fn ) )
279
+ . then ( res => done ( null , res ) )
280
+ . catch ( done ) ;
281
+ } catch ( err ) {
282
+ done ( err ) ;
283
+ }
257
284
} ;
258
285
259
286
module . exports = {
0 commit comments