33const common = require ( '@metarhia/common' ) ;
44const { 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-
346const 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
7743const 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>
159125const 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
211171const 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>
362310const 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>
423359const 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 =>
0 commit comments