Skip to content

Commit 5e42355

Browse files
committed
fixup! Add support for iterable objects
1 parent 86b7d36 commit 5e42355

File tree

4 files changed

+91
-64
lines changed

4 files changed

+91
-64
lines changed

lib/array.js

+88-61
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ const common = require('@metarhia/common');
44
const { asyncIter } = require('./async-iterator.js');
55
const { promisify } = require('util');
66

7-
const isIterable = items =>
8-
items[Symbol.iterator] || items[Symbol.asyncIterator];
9-
107
// Asynchronous map (iterate parallel)
118
// items - <Iterable>, incoming
129
// fn - <Function>, to be executed for each value in the array
@@ -18,15 +15,15 @@ const isIterable = items =>
1815
// err - <Error> | <null>
1916
// result - <Iterable>
2017
const map = (items, fn, done = common.emptiness) => {
21-
if (!isIterable(items)) {
22-
done(new TypeError('"items" argument is not iterable'));
23-
return;
24-
}
2518
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+
}
3027
};
3128

3229
// Non-blocking synchronous map
@@ -46,16 +43,18 @@ const asyncMap = (items, fn, options = {}, done = common.emptiness) => {
4643
done = options;
4744
options = {};
4845
}
49-
if (!isIterable(items)) {
50-
done(new TypeError('"items" argument is not iterable'));
51-
return;
52-
}
5346
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+
}
5958
};
6059

6160
// Asynchronous filter (iterate parallel)
@@ -76,20 +75,20 @@ const asyncMap = (items, fn, options = {}, done = common.emptiness) => {
7675
// (err, result) => console.dir(result)
7776
// );
7877
const filter = (items, fn, done = common.emptiness) => {
79-
if (!isIterable(items)) {
80-
done(new TypeError('"items" argument is not iterable'));
81-
return;
82-
}
8378
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+
}
9392
};
9493

9594
// Asynchronous reduce
@@ -111,10 +110,14 @@ const filter = (items, fn, done = common.emptiness) => {
111110
// initial - <any>, optional value to be used as first
112111
// argument in first iteration
113112
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+
}
118121
};
119122

120123
// Asynchronous reduceRight
@@ -136,10 +139,14 @@ const reduce = (items, fn, done = common.emptiness, initial) => {
136139
// initial - <any>, optional value to be used as first
137140
// argument in first iteration
138141
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+
}
143150
};
144151

145152
// Asynchronous each (iterate in parallel)
@@ -162,10 +169,14 @@ const reduceRight = (items, fn, done = common.emptiness, initial) => {
162169
// (err, data) => console.dir('each done')
163170
// );
164171
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+
}
169180
};
170181

171182
// Asynchronous series
@@ -190,10 +201,14 @@ const each = (items, fn, done = common.emptiness) => {
190201
// }
191202
// );
192203
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+
}
197212
};
198213

199214
// Asynchronous find (iterate in series)
@@ -216,10 +231,14 @@ const series = (items, fn, done = common.emptiness) => {
216231
// }
217232
// );
218233
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+
}
223242
};
224243

225244
// Asynchronous every
@@ -233,10 +252,14 @@ const find = (items, fn, done = common.emptiness) => {
233252
// err - <Error> | <null>
234253
// result - <boolean>
235254
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+
}
240263
};
241264

242265
// Asynchronous some (iterate in series)
@@ -250,10 +273,14 @@ const every = (items, fn, done = common.emptiness) => {
250273
// err - <Error> | <null>
251274
// result - <boolean>
252275
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+
}
257284
};
258285

259286
module.exports = {

test/array.asyncMap.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ metatests.test('asyncMap with error', test => {
8888

8989
metatests.test('asyncMap with not iterable', test => {
9090
const obj = { a: '1', b: '2', c: '3' };
91-
const expectedError = new TypeError('"items" argument is not iterable');
91+
const expectedError = new TypeError('Base is not Iterable');
9292

9393
metasync.asyncMap(obj, test.mustNotCall(), (err, res) => {
9494
test.isError(err, expectedError);

test/array.filter.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ metatests.test('filter with error', test => {
9494

9595
metatests.test('filter with not iterable', test => {
9696
const obj = { a: '1', b: '2', c: '3' };
97-
const expectedError = new TypeError('"items" argument is not iterable');
97+
const expectedError = new TypeError('Base is not Iterable');
9898

9999
metasync.filter(obj, test.mustNotCall(), (err, res) => {
100100
test.isError(err, expectedError);

test/array.map.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ metatests.test('map with error', test => {
7070

7171
metatests.test('map with not iterable', test => {
7272
const obj = { a: '1', b: '2', c: '3' };
73-
const expectedError = new TypeError('"items" argument is not iterable');
73+
const expectedError = new TypeError('Base is not Iterable');
7474

7575
metasync.map(obj, test.mustNotCall(), (err, res) => {
7676
test.isError(err, expectedError);

0 commit comments

Comments
 (0)