es.iterator.drop.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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 iteratorHelperThrowsOnInvalidIterator = require('../internals/iterator-helper-throws-on-invalid-iterator');
  11. var iteratorHelperWithoutClosingOnEarlyError = require('../internals/iterator-helper-without-closing-on-early-error');
  12. var IS_PURE = require('../internals/is-pure');
  13. var DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('drop', 0);
  14. var dropWithoutClosingOnEarlyError = !IS_PURE && !DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR
  15. && iteratorHelperWithoutClosingOnEarlyError('drop', RangeError);
  16. var FORCED = IS_PURE || DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR || dropWithoutClosingOnEarlyError;
  17. var IteratorProxy = createIteratorProxy(function () {
  18. var iterator = this.iterator;
  19. var next = this.next;
  20. var result, done;
  21. while (this.remaining) {
  22. this.remaining--;
  23. result = anObject(call(next, iterator));
  24. done = this.done = !!result.done;
  25. if (done) return;
  26. }
  27. result = anObject(call(next, iterator));
  28. done = this.done = !!result.done;
  29. if (!done) return result.value;
  30. });
  31. // `Iterator.prototype.drop` method
  32. // https://tc39.es/ecma262/#sec-iterator.prototype.drop
  33. $({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {
  34. drop: function drop(limit) {
  35. anObject(this);
  36. var remaining;
  37. try {
  38. remaining = toPositiveInteger(notANaN(+limit));
  39. } catch (error) {
  40. iteratorClose(this, 'throw', error);
  41. }
  42. if (dropWithoutClosingOnEarlyError) return call(dropWithoutClosingOnEarlyError, this, remaining);
  43. return new IteratorProxy(getIteratorDirect(this), {
  44. remaining: remaining
  45. });
  46. }
  47. });