| 'use strict'; |
| var onetime = require('onetime'); |
| var setImmediateShim = require('set-immediate-shim'); |
| |
| module.exports = function (arr, next, cb) { |
| var failed = false; |
| var count = 0; |
| |
| cb = cb || function () {}; |
| |
| if (!Array.isArray(arr)) { |
| throw new TypeError('First argument must be an array'); |
| } |
| |
| if (typeof next !== 'function') { |
| throw new TypeError('Second argument must be a function'); |
| } |
| |
| var len = arr.length; |
| |
| if (!len) { |
| cb(); |
| return; |
| } |
| |
| function callback(err) { |
| if (failed) { |
| return; |
| } |
| |
| if (err !== undefined && err !== null) { |
| failed = true; |
| cb(err); |
| return; |
| } |
| |
| if (++count === len) { |
| cb(); |
| return; |
| } |
| } |
| |
| for (var i = 0; i < len; i++) { |
| setImmediateShim(next, arr[i], i, onetime(callback, true)); |
| } |
| }; |