Coverage

99%
106
105
1

each.js

99%
106
105
1
LineHitsSource
1// Generated by CoffeeScript 1.4.0
2/*
3each(elements)
4.mode(parallel=false|true|integer)
5.on('item', callback)
6.on('error', callback)
7.on('end', callback)
8.on('both', callback)
9Chained and parallel async iterator in one elegant function
10*/
11
121module.exports = function(elements) {
1352 var eacher, errors, events, isObject, keys, next, parallel, run, times, type;
1452 type = typeof elements;
1552 if (elements === null || type === 'undefined' || type === 'number' || type === 'string' || type === 'function' || type === 'boolean') {
1616 elements = [elements];
1736 } else if (!Array.isArray(elements)) {
189 isObject = true;
19 }
2052 if (isObject) {
219 keys = Object.keys(elements);
22 }
2352 errors = [];
2452 parallel = 1;
2552 events = {
26 item: [],
27 error: [],
28 end: [],
29 both: []
30 };
3152 times = [];
3252 eacher = {};
3352 eacher.total = keys ? keys.length : elements.length;
3452 eacher.started = 0;
3552 eacher.done = 0;
3652 times = 1;
3752 eacher.paused = 0;
3852 eacher.readable = true;
3952 eacher.pause = function() {
4010 return eacher.paused++;
41 };
4252 eacher.resume = function() {
4310 eacher.paused--;
4410 return run();
45 };
4652 eacher.parallel = function(mode) {
4734 if (typeof mode === 'number') {
4815 parallel = mode;
4919 } else if (mode) {
5016 parallel = mode;
51 } else {
523 parallel = 1;
53 }
5434 return eacher;
55 };
5652 eacher.times = function(t) {
576 times = t;
586 return eacher;
59 };
6052 eacher.on = function(ev, callback) {
61136 events[ev].push(callback);
62136 return eacher;
63 };
6452 run = function() {
6516723 var args, emit, emitError, index, lboth, lerror, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3;
6616723 if (eacher.paused) {
6735 return;
68 }
6916688 if (eacher.done === eacher.total * times || (errors.length && eacher.started === eacher.done)) {
7052 eacher.readable = false;
7152 if (errors.length) {
7210 if (parallel !== 1) {
736 if (errors.length === 1) {
743 args = [errors[0], errors];
75 } else {
763 args = [new Error("Multiple errors (" + errors.length + ")"), errors];
77 }
78 } else {
794 args = [errors[0]];
80 }
8110 lerror = events.error.length;
8210 lboth = events.both.length;
8310 emitError = lerror || (!lerror && !lboth);
8410 _ref = events.error;
8510 for (_i = 0, _len = _ref.length; _i < _len; _i++) {
868 emit = _ref[_i];
878 if (emitError) {
888 emit.apply(null, args);
89 }
90 }
91 } else {
9242 args = [];
9342 _ref1 = events.end;
9442 for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
9536 emit = _ref1[_j];
9636 emit();
97 }
98 }
9952 _ref2 = events.both;
10052 for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
10113 emit = _ref2[_k];
10213 emit.apply(null, args);
103 }
10452 return;
105 }
10616636 if (errors.length !== 0) {
10710 return;
108 }
10916626 while ((parallel === true ? (eacher.total * times - eacher.started) > 0 : Math.min(parallel - eacher.started + eacher.done, eacher.total * times - eacher.started))) {
11016670 if (errors.length !== 0) {
1119 break;
112 }
11316661 index = Math.floor(eacher.started / times);
11416661 eacher.started++;
11516661 try {
11616661 _ref3 = events.item;
11716661 for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
11816661 emit = _ref3[_l];
11916661 switch (emit.length) {
120 case 1:
1216 args = [next];
1226 break;
123 case 2:
1246 if (keys) {
1253 args = [elements[keys[index]], next];
126 } else {
1273 args = [elements[index], next];
128 }
1296 break;
130 case 3:
13116644 if (keys) {
13227 args = [keys[index], elements[keys[index]], next];
133 } else {
13416617 args = [elements[index], index, next];
135 }
13616644 break;
137 case 4:
1383 if (keys) {
1393 args = [keys[index], elements[keys[index]], index, next];
140 } else {
1410 return next(new Error('Invalid arguments in item callback'));
142 }
1433 break;
144 default:
1452 return next(new Error('Invalid arguments in item callback'));
146 }
14716659 emit.apply(null, args);
148 }
149 } catch (e) {
1501 if (eacher.readable) {
1511 next(e);
152 }
153 }
154 }
15516624 return null;
156 };
15752 next = function(err) {
15816661 if ((err != null) && err instanceof Error) {
15913 errors.push(err);
160 }
16116661 eacher.done++;
16216661 return run();
163 };
16452 process.nextTick(run);
16552 return eacher;
166};