• 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 = serialOrdered;
8// sorting helpers
9module.exports.ascending  = ascending;
10module.exports.descending = descending;
11
12/**
13 * Runs iterator over provided sorted array elements in series
14 *
15 * @param   {array|object} list - array or object (named list) to iterate over
16 * @param   {function} iterator - iterator to run
17 * @param   {function} sortMethod - custom sort function
18 * @param   {function} callback - invoked when all elements processed
19 * @returns {function} - jobs terminator
20 */
21function serialOrdered(list, iterator, sortMethod, callback)
22{
23  var state = initState(list, sortMethod);
24
25  iterate(list, iterator, state, function iteratorHandler(error, result)
26  {
27    if (error)
28    {
29      callback(error, result);
30      return;
31    }
32
33    state.index++;
34
35    // are we there yet?
36    if (state.index < (state['keyedList'] || list).length)
37    {
38      iterate(list, iterator, state, iteratorHandler);
39      return;
40    }
41
42    // done here
43    callback(null, state.results);
44  });
45
46  return terminator.bind(state, callback);
47}
48
49/*
50 * -- Sort methods
51 */
52
53/**
54 * sort helper to sort array elements in ascending order
55 *
56 * @param   {mixed} a - an item to compare
57 * @param   {mixed} b - an item to compare
58 * @returns {number} - comparison result
59 */
60function ascending(a, b)
61{
62  return a < b ? -1 : a > b ? 1 : 0;
63}
64
65/**
66 * sort helper to sort array elements in descending order
67 *
68 * @param   {mixed} a - an item to compare
69 * @param   {mixed} b - an item to compare
70 * @returns {number} - comparison result
71 */
72function descending(a, b)
73{
74  return -1 * ascending(a, b);
75}
76