iterator-window.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. 'use strict';
  2. var anObject = require('../internals/an-object');
  3. var call = require('../internals/function-call');
  4. var createIteratorProxy = require('../internals/iterator-create-proxy');
  5. var createIterResultObject = require('../internals/create-iter-result-object');
  6. var getIteratorDirect = require('../internals/get-iterator-direct');
  7. var iteratorClose = require('../internals/iterator-close');
  8. var uncurryThis = require('../internals/function-uncurry-this');
  9. var $RangeError = RangeError;
  10. var $TypeError = TypeError;
  11. var push = uncurryThis([].push);
  12. var slice = uncurryThis([].slice);
  13. var ALLOW_PARTIAL = 'allow-partial';
  14. var IteratorProxy = createIteratorProxy(function () {
  15. var iterator = this.iterator;
  16. var next = this.next;
  17. var buffer = this.buffer;
  18. var windowSize = this.windowSize;
  19. var allowPartial = this.allowPartial;
  20. var result, done;
  21. while (true) {
  22. result = anObject(call(next, iterator));
  23. done = this.done = !!result.done;
  24. if (allowPartial && done && buffer.length && buffer.length < windowSize) return createIterResultObject(buffer, false);
  25. if (done) return createIterResultObject(undefined, true);
  26. if (buffer.length === windowSize) this.buffer = buffer = slice(buffer, 1);
  27. push(buffer, result.value);
  28. if (buffer.length === windowSize) return createIterResultObject(buffer, false);
  29. }
  30. }, false, true);
  31. // `Iterator.prototype.windows` and obsolete `Iterator.prototype.sliding` methods
  32. // https://github.com/tc39/proposal-iterator-chunking
  33. module.exports = function (O, windowSize, undersized) {
  34. anObject(O);
  35. if (typeof windowSize != 'number' || !windowSize || windowSize >>> 0 !== windowSize) {
  36. return iteratorClose(O, 'throw', new $RangeError('`windowSize` must be integer in [1, 2^32-1]'));
  37. }
  38. if (undersized !== undefined && undersized !== 'only-full' && undersized !== ALLOW_PARTIAL) {
  39. return iteratorClose(O, 'throw', new $TypeError('Incorrect `undersized` argument'));
  40. }
  41. return new IteratorProxy(getIteratorDirect(O), {
  42. windowSize: windowSize,
  43. buffer: [],
  44. allowPartial: undersized === ALLOW_PARTIAL
  45. });
  46. };