code: function eachOf(coll, iteratee, callback) {
      var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric;
      return eachOfImplementation(coll, wrapAsync(iteratee), callback);
  }
docs: Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument
  to the iteratee.
  
  @name eachOf
  @static
  @memberOf module:Collections
  @method
  @alias forEachOf
  @category Collection
  @see [async.each]{@link module:Collections.each}
  @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.
  @param {AsyncFunction} iteratee - A function to apply to each
  item in `coll`.
  The `key` is the item's key, or index in the case of an array.
  Invoked with (item, key, callback).
  @param {Function} [callback] - A callback which is called when all
  `iteratee` functions have finished, or an error occurs. Invoked with (err).
  @returns {Promise} a promise, if a callback is omitted
  @example
  
  var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
  var configs = {};
  
  async.forEachOf(obj, function (value, key, callback) {
  fs.readFile(__dirname + value, "utf8", function (err, data) {
  if (err) return callback(err);
  try {
  configs[key] = JSON.parse(data);
  } catch (e) {
  return callback(e);
  }
  callback();
  });
  }, function (err) {
  if (err) console.error(err.message);
  // configs is now a map of JSON data
  doSomethingWith(configs);
  });