text: var arrayEach = require('./_arrayEach'),
      baseEach = require('./_baseEach'),
      isArray = require('./isArray'),
      toFunction = require('./_toFunction');
  
  /**
   * Iterates over elements of `collection` invoking `iteratee` for each element.
   * The iteratee is invoked with three arguments: (value, index|key, collection).
   * Iteratee functions may exit iteration early by explicitly returning `false`.
   *
   * **Note:** As with other "Collections" methods, objects with a "length" property
   * are iterated like arrays. To avoid this behavior use `_.forIn` or `_.forOwn`
   * for object iteration.
   *
   * @static
   * @memberOf _
   * @alias each
   * @category Collection
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} [iteratee=_.identity] The function invoked per iteration.
   * @returns {Array|Object} Returns `collection`.
   * @example
   *
   * _([1, 2]).forEach(function(value) {
   *   console.log(value);
   * });
   * // => logs `1` then `2`
   *
   * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
   *   console.log(key);
   * });
   * // => logs 'a' then 'b' (iteration order is not guaranteed)
   */
  function forEach(collection, iteratee) {
    return (typeof iteratee == 'function' && isArray(collection))
      ? arrayEach(collection, iteratee)
      : baseEach(collection, toFunction(iteratee));
  }
  
  module.exports = forEach;
  