function each (iterable, fn) {
      var len
          , i = 0
          , iter
          , item
          , ret
      ;

      if (!iterable) throw genTypeError($invalidArgument);

      var gen = iterable[Yaku[$Symbol][$iterator]];
      if (isFunction(gen))
          iter = gen.call(iterable);
      else if (isFunction(iterable.next)) {
          iter = iterable;
      }
      else if (isInstanceOf(iterable, Arr)) {
          len = iterable.length;
          while (i < len) {
              fn(iterable[i], i++);
          }
          return i;
      } else
          throw genTypeError($invalidArgument);

      while (!(item = iter.next()).done) {
          ret = genTryCatcher(fn)(item.value, i++);
          if (ret === $tryErr) {
              isFunction(iter[$return]) && iter[$return]();
              throw ret.e;
          }
      }

      return i;
  }
Generate a iterator
@param  {Any} obj
@private
@return {Object || TypeError}