es.iterator.take.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 createIteratorProxy = require('../internals/iterator-create-proxy');
  9. var iteratorClose = require('../internals/iterator-close');
  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 TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('take', 1);
  14. var takeWithoutClosingOnEarlyError = !IS_PURE && !TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR
  15. && iteratorHelperWithoutClosingOnEarlyError('take', RangeError);
  16. var FORCED = IS_PURE || TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR || takeWithoutClosingOnEarlyError;
  17. var IteratorProxy = createIteratorProxy(function () {
  18. var iterator = this.iterator;
  19. if (!this.remaining--) {
  20. this.done = true;
  21. return iteratorClose(iterator, 'normal', undefined);
  22. }
  23. var result = anObject(call(this.next, iterator));
  24. var done = this.done = !!result.done;
  25. if (!done) return result.value;
  26. });
  27. // `Iterator.prototype.take` method
  28. // https://tc39.es/ecma262/#sec-iterator.prototype.take
  29. $({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {
  30. take: function take(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 (takeWithoutClosingOnEarlyError) return call(takeWithoutClosingOnEarlyError, this, remaining);
  39. return new IteratorProxy(getIteratorDirect(this), {
  40. remaining: remaining
  41. });
  42. }
  43. });