UNPKG

1.65 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6
7module.exports = function forEachBail(array, iterator, callback) {
8 if(array.length === 0) return callback();
9 let currentPos = array.length;
10 let currentResult;
11 let done = [];
12 for(let i = 0; i < array.length; i++) {
13 const itCb = createIteratorCallback(i);
14 iterator(array[i], itCb);
15 if(currentPos === 0) break;
16 }
17
18 function createIteratorCallback(i) {
19 return(...args) => { // eslint-disable-line
20 if(i >= currentPos) return; // ignore
21 done.push(i);
22 if(args.length > 0) {
23 currentPos = i + 1;
24 done = done.filter(item => {
25 return item <= i;
26 });
27 currentResult = args;
28 }
29 if(done.length === currentPos) {
30 callback.apply(null, currentResult);
31 currentPos = 0;
32 }
33 };
34 }
35};
36
37module.exports.withIndex = function forEachBailWithIndex(array, iterator, callback) {
38 if(array.length === 0) return callback();
39 let currentPos = array.length;
40 let currentResult;
41 let done = [];
42 for(let i = 0; i < array.length; i++) {
43 const itCb = createIteratorCallback(i);
44 iterator(array[i], i, itCb);
45 if(currentPos === 0) break;
46 }
47
48 function createIteratorCallback(i) {
49 return(...args) => { // eslint-disable-line
50 if(i >= currentPos) return; // ignore
51 done.push(i);
52 if(args.length > 0) {
53 currentPos = i + 1;
54 done = done.filter(item => {
55 return item <= i;
56 });
57 currentResult = args;
58 }
59 if(done.length === currentPos) {
60 callback.apply(null, currentResult);
61 currentPos = 0;
62 }
63 };
64 }
65};