• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1var iterate    = require('./lib/iterate.js')
2  , initState  = require('./lib/state.js')
3  , terminator = require('./lib/terminator.js')
4  ;
5
6// Public API
7module.exports = parallel;
8
9/**
10 * Runs iterator over provided array elements in parallel
11 *
12 * @param   {array|object} list - array or object (named list) to iterate over
13 * @param   {function} iterator - iterator to run
14 * @param   {function} callback - invoked when all elements processed
15 * @returns {function} - jobs terminator
16 */
17function parallel(list, iterator, callback)
18{
19  var state = initState(list);
20
21  while (state.index < (state['keyedList'] || list).length)
22  {
23    iterate(list, iterator, state, function(error, result)
24    {
25      if (error)
26      {
27        callback(error, result);
28        return;
29      }
30
31      // looks like it's the last one
32      if (Object.keys(state.jobs).length === 0)
33      {
34        callback(null, state.results);
35        return;
36      }
37    });
38
39    state.index++;
40  }
41
42  return terminator.bind(state, callback);
43}
44