Skip to content

Commit eabbd1d

Browse files
author
Yehor Khilchenko
committed
Rewrite lib/array.js methods
Rewrited asyncIter in some methods.
1 parent 2fe1576 commit eabbd1d

File tree

3 files changed

+29
-130
lines changed

3 files changed

+29
-130
lines changed

lib/array.js

Lines changed: 28 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,6 @@
33
const common = require('@metarhia/common');
44
const { asyncIter } = require('./async-iterator.js');
55

6-
const copyClass = name => {
7-
switch (name) {
8-
case 'Set':
9-
return Set;
10-
case 'Map':
11-
return Map;
12-
case 'Array':
13-
return Array;
14-
case 'String':
15-
return String;
16-
}
17-
return null;
18-
};
19-
20-
const copyInstance = name => {
21-
switch (name) {
22-
case 'Set':
23-
return new Set();
24-
case 'Map':
25-
return new Map();
26-
case 'Array':
27-
return [];
28-
case 'String':
29-
return '';
30-
}
31-
return null;
32-
};
33-
346
const map = (
357
// Asynchronous map (iterate parallel)
368
items, // array, incoming
@@ -40,13 +12,12 @@ const map = (
4012
// callback - function(err, value)
4113
done // function (optional), on done callback function(err, result)
4214
) => {
43-
done = done || common.emptyness;
44-
const name = items.constructor.name;
45-
const result = copyClass(name);
46-
if (result === null) {
15+
if (!items[Symbol.iterator]) {
4716
done(null, null);
4817
return;
4918
}
19+
done = done || common.emptyness;
20+
const isArray = Array.isArray(items);
5021
const data = asyncIter(items).map(
5122
item =>
5223
new Promise((resolve, reject) => {
@@ -56,22 +27,17 @@ const map = (
5627
});
5728
})
5829
);
59-
if (name === 'Array') {
60-
data
61-
.toArray()
62-
.then(r => done(null, r))
63-
.catch(e => done(e));
64-
} else if (name === 'String') {
65-
data
66-
.toArray()
67-
.then(r => done(null, r.join('')))
68-
.catch(e => done(e));
69-
} else {
70-
data
71-
.collectTo(result)
72-
.then(r => done(null, r))
73-
.catch(e => done(e));
74-
}
30+
const promise =
31+
isArray || items.constructor.name === 'String'
32+
? data.toArray()
33+
: data.collectTo(items.constructor);
34+
promise.then(
35+
res =>
36+
items.constructor.name === 'String'
37+
? done(null, res.join(''))
38+
: done(null, res),
39+
err => done(err)
40+
);
7541
};
7642

7743
const DEFAULT_OPTIONS = { min: 5, percent: 0.7 };
@@ -95,7 +61,7 @@ const asyncMap = (items, fn, options = {}, done) => {
9561

9662
const len = items.length || items.size;
9763
const name = items.constructor.name;
98-
let result = done ? copyInstance(name) : null;
64+
let result = done ? new items.constructor() : null;
9965
const data = common.iter(items);
10066

10167
if (!len || result === null) {
@@ -158,12 +124,11 @@ const asyncMap = (items, fn, options = {}, done) => {
158124
// result - <Array>
159125
const filter = (items, fn, done) => {
160126
done = done || common.emptyness;
161-
const name = items.constructor.name;
162-
const result = copyClass(name);
163-
if (result === null) {
127+
if (!items[Symbol.iterator]) {
164128
done(null, null);
165129
return;
166130
}
131+
const isArray = Array.isArray(items);
167132
const data = asyncIter(items).filter(
168133
item =>
169134
new Promise((resolve, reject) => {
@@ -173,22 +138,17 @@ const filter = (items, fn, done) => {
173138
});
174139
})
175140
);
176-
if (name === 'Array') {
177-
data
178-
.toArray()
179-
.then(r => done(null, r))
180-
.catch(e => done(e));
181-
} else if (name === 'String') {
182-
data
183-
.toArray()
184-
.then(r => done(null, r.join('')))
185-
.catch(e => done(e));
186-
} else {
187-
data
188-
.collectTo(result)
189-
.then(r => done(null, r))
190-
.catch(e => done(e));
191-
}
141+
const promise =
142+
isArray || items.constructor.name === 'String'
143+
? data.toArray()
144+
: data.collectTo(items.constructor);
145+
promise.then(
146+
res =>
147+
items.constructor.name === 'String'
148+
? done(null, res.join(''))
149+
: done(null, res),
150+
err => done(err)
151+
);
192152
};
193153

194154
// Asynchronous reduce
@@ -210,12 +170,6 @@ const filter = (items, fn, done) => {
210170
// argument in first iteration
211171
const reduce = (items, fn, done, initial) => {
212172
done = done || common.emptyness;
213-
const name = items.constructor.name;
214-
const result = copyClass(name);
215-
if (result === null) {
216-
done(null, null);
217-
return;
218-
}
219173
asyncIter(items)
220174
.reduce(
221175
(prev, cur) =>
@@ -299,12 +253,6 @@ const each = (
299253
done // function (optional), on done callback function(err, items)
300254
) => {
301255
done = done || common.emptyness;
302-
const name = items.constructor.name;
303-
const result = copyClass(name);
304-
if (result === null) {
305-
done(null, null);
306-
return;
307-
}
308256
asyncIter(items)
309257
.each(
310258
item =>
@@ -361,12 +309,6 @@ const series = (
361309
// result - <any>
362310
const find = (items, fn, done) => {
363311
done = done || common.emptyness;
364-
const name = items.constructor.name;
365-
const result = copyClass(name);
366-
if (result === null) {
367-
done(null, null);
368-
return;
369-
}
370312
asyncIter(items)
371313
.find(
372314
item =>
@@ -390,12 +332,6 @@ const every = (
390332
done // function, optional on done callback function(err, result)
391333
) => {
392334
done = done || common.emptyness;
393-
const name = items.constructor.name;
394-
const result = copyClass(name);
395-
if (result === null) {
396-
done(null, null);
397-
return;
398-
}
399335
asyncIter(items)
400336
.every(
401337
item =>
@@ -422,12 +358,6 @@ const every = (
422358
// result - <boolean>
423359
const some = (items, fn, done) => {
424360
done = done || common.emptyness;
425-
const name = items.constructor.name;
426-
const result = copyClass(name);
427-
if (result === null) {
428-
done(null, null);
429-
return;
430-
}
431361
asyncIter(items)
432362
.some(
433363
item =>

lib/chain.js

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -66,37 +66,6 @@ ArrayChain.prototype.fetch = function(fn) {
6666
return this;
6767
};
6868

69-
// ArrayChain.prototype.execute = function(chain) {
70-
// this.chain = [];
71-
// return new Promise((resolve, reject) => {
72-
// reduce(
73-
// chain,
74-
// (prev, cur, cb) => {
75-
// async(cur.op)(prev, cur.fn, (err, res) => {
76-
// if (err) cb(err);
77-
// else cb(null, res);
78-
// });
79-
// },
80-
// (err, res) => {
81-
// if (err) reject(err);
82-
// else resolve(res);
83-
// },
84-
// this.array.slice()
85-
// );
86-
// });
87-
// };
88-
89-
// ArrayChain.prototype.fetch = function(fn) {
90-
// const next = (err, data) => {
91-
// this.array = data;
92-
// if (err) throw err;
93-
// };
94-
// this.execute(this.chain)
95-
// .then(r => fn(null, r, next))
96-
// .catch(e => fn(e));
97-
// return this;
98-
// };
99-
10069
ArrayChain.prototype.map = function(fn) {
10170
this.chain.push({ op: 'map', fn });
10271
return this;

test/array.filter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ metatests.test('filter with empty / string', test => {
196196
metatests.test('filter with another object', test => {
197197
const obj = { a: '1', b: '2', c: '3' };
198198

199-
metasync.map(
199+
metasync.filter(
200200
obj,
201201
(x, callback) =>
202202
process.nextTick(() => {

0 commit comments

Comments
 (0)