es.iterator.drop.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 'use strict';
  2. var $ = require('../internals/export');
  3. var call = require('../internals/function-call');
  4. var anObject = require('../internals/an-object');
  5. var getIteratorDirect = require('../internals/get-iterator-direct');
  6. var notANaN = require('../internals/not-a-nan');
  7. var toPositiveInteger = require('../internals/to-positive-integer');
  8. var iteratorClose = require('../internals/iterator-close');
  9. var createIteratorProxy = require('../internals/iterator-create-proxy');
  10. var iteratorHelperWithoutClosingOnEarlyError = require('../internals/iterator-helper-without-closing-on-early-error');
  11. var IS_PURE = require('../internals/is-pure');
  12. var dropWithoutClosingOnEarlyError = !IS_PURE && iteratorHelperWithoutClosingOnEarlyError('drop', RangeError);
  13. var IteratorProxy = createIteratorProxy(function () {
  14. var iterator = this.iterator;
  15. var next = this.next;
  16. var result, done;
  17. while (this.remaining) {
  18. this.remaining--;
  19. result = anObject(call(next, iterator));
  20. done = this.done = !!result.done;
  21. if (done) return;
  22. }
  23. result = anObject(call(next, iterator));
  24. done = this.done = !!result.done;
  25. if (!done) return result.value;
  26. });
  27. // `Iterator.prototype.drop` method
  28. // https://tc39.es/ecma262/#sec-iterator.prototype.drop
  29. $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE || dropWithoutClosingOnEarlyError }, {
  30. drop: function drop(limit) {
  31. anObject(this);
  32. var remaining;
  33. try {
  34. remaining = toPositiveInteger(notANaN(+limit));
  35. } catch (error) {
  36. iteratorClose(this, 'throw', error);
  37. }
  38. if (dropWithoutClosingOnEarlyError) return call(dropWithoutClosingOnEarlyError, this, remaining);
  39. return new IteratorProxy(getIteratorDirect(this), {
  40. remaining: remaining
  41. });
  42. }
  43. });