each = function each(iterator, collection) {
  return (isArrayLike(collection) ? arrayEach : baseEach).call(this, iterator, collection);
}
Iterate over an input collection, invoking an `iterator` function for each element in the
collection and passing to it three arguments: `(value, index, collection)`. The `iterator`
function can end iteration early by returning `false`.

@name each
@api public
@param {Function(value, key, collection)} iterator The function to invoke per iteration.
@param {Array|Object|string} collection The collection to iterate over.
@return {undefined} Because `each` is run only for side effects, always returns `undefined`.
@example
var log = console.log.bind(console);

each(log, ['a', 'b', 'c']);
//-> 'a', 0, ['a', 'b', 'c']
//-> 'b', 1, ['a', 'b', 'c']
//-> 'c', 2, ['a', 'b', 'c']
//=> undefined

each(log, 'tim');
//-> 't', 2, 'tim'
//-> 'i', 1, 'tim'
//-> 'm', 0, 'tim'
//=> undefined

// Note: Iteration order not guaranteed across environments
each(log, { name: 'tim', occupation: 'enchanter' });
//-> 'tim', 'name', { name: 'tim', occupation: 'enchanter' }
//-> 'enchanter', 'occupation', { name: 'tim', occupation: 'enchanter' }
//=> undefined