From eabbd1d97fd25e2527fc94bb6e1a6e5dcec53cf6 Mon Sep 17 00:00:00 2001 From: Yehor Khilchenko Date: Fri, 5 Apr 2019 15:12:11 +0300 Subject: [PATCH] Rewrite lib/array.js methods Rewrited asyncIter in some methods. --- lib/array.js | 126 ++++++++++--------------------------------- lib/chain.js | 31 ----------- test/array.filter.js | 2 +- 3 files changed, 29 insertions(+), 130 deletions(-) diff --git a/lib/array.js b/lib/array.js index a408ac34..1dde1e22 100644 --- a/lib/array.js +++ b/lib/array.js @@ -3,34 +3,6 @@ const common = require('@metarhia/common'); const { asyncIter } = require('./async-iterator.js'); -const copyClass = name => { - switch (name) { - case 'Set': - return Set; - case 'Map': - return Map; - case 'Array': - return Array; - case 'String': - return String; - } - return null; -}; - -const copyInstance = name => { - switch (name) { - case 'Set': - return new Set(); - case 'Map': - return new Map(); - case 'Array': - return []; - case 'String': - return ''; - } - return null; -}; - const map = ( // Asynchronous map (iterate parallel) items, // array, incoming @@ -40,13 +12,12 @@ const map = ( // callback - function(err, value) done // function (optional), on done callback function(err, result) ) => { - done = done || common.emptyness; - const name = items.constructor.name; - const result = copyClass(name); - if (result === null) { + if (!items[Symbol.iterator]) { done(null, null); return; } + done = done || common.emptyness; + const isArray = Array.isArray(items); const data = asyncIter(items).map( item => new Promise((resolve, reject) => { @@ -56,22 +27,17 @@ const map = ( }); }) ); - if (name === 'Array') { - data - .toArray() - .then(r => done(null, r)) - .catch(e => done(e)); - } else if (name === 'String') { - data - .toArray() - .then(r => done(null, r.join(''))) - .catch(e => done(e)); - } else { - data - .collectTo(result) - .then(r => done(null, r)) - .catch(e => done(e)); - } + const promise = + isArray || items.constructor.name === 'String' + ? data.toArray() + : data.collectTo(items.constructor); + promise.then( + res => + items.constructor.name === 'String' + ? done(null, res.join('')) + : done(null, res), + err => done(err) + ); }; const DEFAULT_OPTIONS = { min: 5, percent: 0.7 }; @@ -95,7 +61,7 @@ const asyncMap = (items, fn, options = {}, done) => { const len = items.length || items.size; const name = items.constructor.name; - let result = done ? copyInstance(name) : null; + let result = done ? new items.constructor() : null; const data = common.iter(items); if (!len || result === null) { @@ -158,12 +124,11 @@ const asyncMap = (items, fn, options = {}, done) => { // result - const filter = (items, fn, done) => { done = done || common.emptyness; - const name = items.constructor.name; - const result = copyClass(name); - if (result === null) { + if (!items[Symbol.iterator]) { done(null, null); return; } + const isArray = Array.isArray(items); const data = asyncIter(items).filter( item => new Promise((resolve, reject) => { @@ -173,22 +138,17 @@ const filter = (items, fn, done) => { }); }) ); - if (name === 'Array') { - data - .toArray() - .then(r => done(null, r)) - .catch(e => done(e)); - } else if (name === 'String') { - data - .toArray() - .then(r => done(null, r.join(''))) - .catch(e => done(e)); - } else { - data - .collectTo(result) - .then(r => done(null, r)) - .catch(e => done(e)); - } + const promise = + isArray || items.constructor.name === 'String' + ? data.toArray() + : data.collectTo(items.constructor); + promise.then( + res => + items.constructor.name === 'String' + ? done(null, res.join('')) + : done(null, res), + err => done(err) + ); }; // Asynchronous reduce @@ -210,12 +170,6 @@ const filter = (items, fn, done) => { // argument in first iteration const reduce = (items, fn, done, initial) => { done = done || common.emptyness; - const name = items.constructor.name; - const result = copyClass(name); - if (result === null) { - done(null, null); - return; - } asyncIter(items) .reduce( (prev, cur) => @@ -299,12 +253,6 @@ const each = ( done // function (optional), on done callback function(err, items) ) => { done = done || common.emptyness; - const name = items.constructor.name; - const result = copyClass(name); - if (result === null) { - done(null, null); - return; - } asyncIter(items) .each( item => @@ -361,12 +309,6 @@ const series = ( // result - const find = (items, fn, done) => { done = done || common.emptyness; - const name = items.constructor.name; - const result = copyClass(name); - if (result === null) { - done(null, null); - return; - } asyncIter(items) .find( item => @@ -390,12 +332,6 @@ const every = ( done // function, optional on done callback function(err, result) ) => { done = done || common.emptyness; - const name = items.constructor.name; - const result = copyClass(name); - if (result === null) { - done(null, null); - return; - } asyncIter(items) .every( item => @@ -422,12 +358,6 @@ const every = ( // result - const some = (items, fn, done) => { done = done || common.emptyness; - const name = items.constructor.name; - const result = copyClass(name); - if (result === null) { - done(null, null); - return; - } asyncIter(items) .some( item => diff --git a/lib/chain.js b/lib/chain.js index cc971a1e..366d90ac 100644 --- a/lib/chain.js +++ b/lib/chain.js @@ -66,37 +66,6 @@ ArrayChain.prototype.fetch = function(fn) { return this; }; -// ArrayChain.prototype.execute = function(chain) { -// this.chain = []; -// return new Promise((resolve, reject) => { -// reduce( -// chain, -// (prev, cur, cb) => { -// async(cur.op)(prev, cur.fn, (err, res) => { -// if (err) cb(err); -// else cb(null, res); -// }); -// }, -// (err, res) => { -// if (err) reject(err); -// else resolve(res); -// }, -// this.array.slice() -// ); -// }); -// }; - -// ArrayChain.prototype.fetch = function(fn) { -// const next = (err, data) => { -// this.array = data; -// if (err) throw err; -// }; -// this.execute(this.chain) -// .then(r => fn(null, r, next)) -// .catch(e => fn(e)); -// return this; -// }; - ArrayChain.prototype.map = function(fn) { this.chain.push({ op: 'map', fn }); return this; diff --git a/test/array.filter.js b/test/array.filter.js index 4825423b..50bb31a8 100644 --- a/test/array.filter.js +++ b/test/array.filter.js @@ -196,7 +196,7 @@ metatests.test('filter with empty / string', test => { metatests.test('filter with another object', test => { const obj = { a: '1', b: '2', c: '3' }; - metasync.map( + metasync.filter( obj, (x, callback) => process.nextTick(() => {