Skip to content

Commit 2e98b99

Browse files
author
Yehor Khilchenko
committed
Rewrite to promisify and bring back firstOf realization
1 parent dc722a5 commit 2e98b99

File tree

2 files changed

+20
-114
lines changed

2 files changed

+20
-114
lines changed

lib/array.js

Lines changed: 13 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const common = require('@metarhia/common');
44
const { asyncIter } = require('./async-iterator.js');
5+
const { promisify } = require('util');
56

67
// Asynchronous map (iterate parallel)
78
// items - <Array>, incoming
@@ -20,15 +21,7 @@ const map = (items, fn, done) => {
2021
return;
2122
}
2223
const isArray = Array.isArray(items);
23-
const data = asyncIter(items).map(
24-
item =>
25-
new Promise((resolve, reject) => {
26-
fn(item, (err, res) => {
27-
if (err) reject(err);
28-
else resolve(res);
29-
});
30-
})
31-
);
24+
const data = asyncIter(items).map(item => promisify(fn)(item));
3225
const promise = isArray ? data.toArray() : data.collectTo(items.constructor);
3326
promise.then(res => done(null, res), done);
3427
};
@@ -122,15 +115,7 @@ const filter = (items, fn, done) => {
122115
return;
123116
}
124117
const isArray = Array.isArray(items);
125-
const data = asyncIter(items).filter(
126-
item =>
127-
new Promise((resolve, reject) => {
128-
fn(item, (err, res) => {
129-
if (err) reject(err);
130-
else resolve(res);
131-
});
132-
})
133-
);
118+
const data = asyncIter(items).filter(item => promisify(fn)(item));
134119
const promise = isArray ? data.toArray() : data.collectTo(items.constructor);
135120
promise.then(res => done(null, res), err => done(err));
136121
};
@@ -155,22 +140,10 @@ const filter = (items, fn, done) => {
155140
const reduce = (items, fn, done, initial) => {
156141
done = done || common.emptyness;
157142
asyncIter(items)
158-
.reduce(
159-
(prev, cur) =>
160-
new Promise((resolve, reject) => {
161-
fn(prev, cur, (err, res) => {
162-
if (err) reject(err);
163-
else resolve(res);
164-
});
165-
}),
166-
initial
167-
)
143+
.reduce((prev, cur) => promisify(fn)(prev, cur), initial)
168144
.then(r => done(null, r), done);
169145
};
170146

171-
const REDUCE_RIGHT_EMPTY_ARR =
172-
'Metasync: reduceRight of empty array with no initial value';
173-
174147
// Asynchronous reduceRight
175148
// items - <Array>, incoming
176149
// fn - <Function>, to be executed for each value in array
@@ -190,41 +163,9 @@ const REDUCE_RIGHT_EMPTY_ARR =
190163
// argument in first iteration
191164
const reduceRight = (items, fn, done, initial) => {
192165
done = done || common.emptyness;
193-
const len = items.length || items.size;
194-
items = [...items];
195-
const hasInitial = typeof initial !== 'undefined';
196-
197-
if (!len && !hasInitial) {
198-
done(new TypeError(REDUCE_RIGHT_EMPTY_ARR), initial);
199-
return;
200-
}
201-
202-
let previous = hasInitial ? initial : items[len - 1];
203-
if ((!len && hasInitial) || (len === 1 && !hasInitial)) {
204-
done(null, previous);
205-
return;
206-
}
207-
208-
let count = hasInitial ? len - 1 : len - 2;
209-
let current = items[count];
210-
const last = 0;
211-
212-
const next = (err, data) => {
213-
if (err) {
214-
done(err);
215-
return;
216-
}
217-
if (count === last) {
218-
done(null, data);
219-
return;
220-
}
221-
count--;
222-
previous = data;
223-
current = items[count];
224-
fn(previous, current, next, count, items);
225-
};
226-
227-
fn(previous, current, next, count, items);
166+
asyncIter(items)
167+
.reduceRight((prev, cur) => promisify(fn)(prev, cur), initial)
168+
.then(r => done(null, r), done);
228169
};
229170

230171
// Asynchronous each (iterate in parallel)
@@ -239,17 +180,8 @@ const reduceRight = (items, fn, done, initial) => {
239180
const each = (items, fn, done) => {
240181
done = done || common.emptyness;
241182
asyncIter(items)
242-
.parallel(
243-
item =>
244-
new Promise((resolve, reject) => {
245-
fn(item, (err, res) => {
246-
if (err) reject(err);
247-
else resolve(res);
248-
});
249-
})
250-
)
251-
.then(r => done(null, r))
252-
.catch(e => done(e));
183+
.parallel(item => promisify(fn)(item))
184+
.then(r => done(null, r), done);
253185
};
254186

255187
// Asynchronous series
@@ -264,15 +196,7 @@ const each = (items, fn, done) => {
264196
const series = (items, fn, done) => {
265197
done = done || common.emptyness;
266198
asyncIter(items)
267-
.each(
268-
item =>
269-
new Promise((resolve, reject) => {
270-
fn(item, (err, res) => {
271-
if (err) reject(err);
272-
else resolve(res);
273-
});
274-
})
275-
)
199+
.each(item => promisify(fn)(item))
276200
.then(r => done(null, r), done);
277201
};
278202

@@ -289,15 +213,7 @@ const series = (items, fn, done) => {
289213
const find = (items, fn, done) => {
290214
done = done || common.emptyness;
291215
asyncIter(items)
292-
.find(
293-
item =>
294-
new Promise((resolve, reject) => {
295-
fn(item, (err, res) => {
296-
if (err) reject(err);
297-
else resolve(res);
298-
});
299-
})
300-
)
216+
.find(item => promisify(fn)(item))
301217
.then(r => done(null, r))
302218
.catch(e => done(e));
303219
};
@@ -315,15 +231,7 @@ const find = (items, fn, done) => {
315231
const every = (items, fn, done) => {
316232
done = done || common.emptyness;
317233
asyncIter(items)
318-
.every(
319-
item =>
320-
new Promise((resolve, reject) => {
321-
fn(item, (err, res) => {
322-
if (err) reject(err);
323-
else resolve(res);
324-
});
325-
})
326-
)
234+
.every(item => promisify(fn)(item))
327235
.then(r => done(null, r))
328236
.catch(e => done(e));
329237
};
@@ -341,15 +249,7 @@ const every = (items, fn, done) => {
341249
const some = (items, fn, done) => {
342250
done = done || common.emptyness;
343251
asyncIter(items)
344-
.some(
345-
item =>
346-
new Promise((resolve, reject) => {
347-
fn(item, (err, res) => {
348-
if (err) reject(err);
349-
else resolve(res);
350-
});
351-
})
352-
)
252+
.some(item => promisify(fn)(item))
353253
.then(r => done(null, r))
354254
.catch(e => done(e));
355255
};

lib/control.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
'use strict';
22

33
const common = require('@metarhia/common');
4+
const { each } = require('./array.js');
45

56
// Executes all asynchronous functions and pass first result to callback
67
// fns - <Function[]>, callback-last / err-first
78
// callback - <Function>, on done, err-first
89
const firstOf = (fns, callback) => {
910
const done = common.once(callback);
10-
fns.forEach(fn => fn((...args) => done(...args)));
11+
each(fns, (f, iterCb) =>
12+
f((...args) => {
13+
done(...args);
14+
iterCb(...args);
15+
})
16+
);
1117
};
1218

1319
// Parallel execution

0 commit comments

Comments
 (0)