forEachOf.js
  1  'use strict';
  2  
  3  Object.defineProperty(exports, "__esModule", {
  4      value: true
  5  });
  6  
  7  var _isArrayLike = require('./internal/isArrayLike');
  8  
  9  var _isArrayLike2 = _interopRequireDefault(_isArrayLike);
 10  
 11  var _breakLoop = require('./internal/breakLoop');
 12  
 13  var _breakLoop2 = _interopRequireDefault(_breakLoop);
 14  
 15  var _eachOfLimit = require('./eachOfLimit');
 16  
 17  var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);
 18  
 19  var _once = require('./internal/once');
 20  
 21  var _once2 = _interopRequireDefault(_once);
 22  
 23  var _onlyOnce = require('./internal/onlyOnce');
 24  
 25  var _onlyOnce2 = _interopRequireDefault(_onlyOnce);
 26  
 27  var _wrapAsync = require('./internal/wrapAsync');
 28  
 29  var _wrapAsync2 = _interopRequireDefault(_wrapAsync);
 30  
 31  var _awaitify = require('./internal/awaitify');
 32  
 33  var _awaitify2 = _interopRequireDefault(_awaitify);
 34  
 35  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 36  
 37  // eachOf implementation optimized for array-likes
 38  function eachOfArrayLike(coll, iteratee, callback) {
 39      callback = (0, _once2.default)(callback);
 40      var index = 0,
 41          completed = 0,
 42          { length } = coll,
 43          canceled = false;
 44      if (length === 0) {
 45          callback(null);
 46      }
 47  
 48      function iteratorCallback(err, value) {
 49          if (err === false) {
 50              canceled = true;
 51          }
 52          if (canceled === true) return;
 53          if (err) {
 54              callback(err);
 55          } else if (++completed === length || value === _breakLoop2.default) {
 56              callback(null);
 57          }
 58      }
 59  
 60      for (; index < length; index++) {
 61          iteratee(coll[index], index, (0, _onlyOnce2.default)(iteratorCallback));
 62      }
 63  }
 64  
 65  // a generic version of eachOf which can handle array, object, and iterator cases.
 66  function eachOfGeneric(coll, iteratee, callback) {
 67      return (0, _eachOfLimit2.default)(coll, Infinity, iteratee, callback);
 68  }
 69  
 70  /**
 71   * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument
 72   * to the iteratee.
 73   *
 74   * @name eachOf
 75   * @static
 76   * @memberOf module:Collections
 77   * @method
 78   * @alias forEachOf
 79   * @category Collection
 80   * @see [async.each]{@link module:Collections.each}
 81   * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.
 82   * @param {AsyncFunction} iteratee - A function to apply to each
 83   * item in `coll`.
 84   * The `key` is the item's key, or index in the case of an array.
 85   * Invoked with (item, key, callback).
 86   * @param {Function} [callback] - A callback which is called when all
 87   * `iteratee` functions have finished, or an error occurs. Invoked with (err).
 88   * @returns {Promise} a promise, if a callback is omitted
 89   * @example
 90   *
 91   * var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
 92   * var configs = {};
 93   *
 94   * async.forEachOf(obj, function (value, key, callback) {
 95   *     fs.readFile(__dirname + value, "utf8", function (err, data) {
 96   *         if (err) return callback(err);
 97   *         try {
 98   *             configs[key] = JSON.parse(data);
 99   *         } catch (e) {
100   *             return callback(e);
101   *         }
102   *         callback();
103   *     });
104   * }, function (err) {
105   *     if (err) console.error(err.message);
106   *     // configs is now a map of JSON data
107   *     doSomethingWith(configs);
108   * });
109   */
110  function eachOf(coll, iteratee, callback) {
111      var eachOfImplementation = (0, _isArrayLike2.default)(coll) ? eachOfArrayLike : eachOfGeneric;
112      return eachOfImplementation(coll, (0, _wrapAsync2.default)(iteratee), callback);
113  }
114  
115  exports.default = (0, _awaitify2.default)(eachOf, 3);
116  module.exports = exports['default'];