iterator-window.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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 push = uncurryThis([].push);
  11. var slice = uncurryThis([].slice);
  12. var IteratorProxy = createIteratorProxy(function () {
  13. var iterator = this.iterator;
  14. var next = this.next;
  15. var buffer = this.buffer;
  16. var windowSize = this.windowSize;
  17. var sliding = this.sliding;
  18. var result, done;
  19. while (true) {
  20. result = anObject(call(next, iterator));
  21. done = this.done = !!result.done;
  22. if (sliding && done && buffer.length && buffer.length < windowSize) return createIterResultObject(buffer, false);
  23. if (done) return createIterResultObject(undefined, true);
  24. if (buffer.length === windowSize) this.buffer = buffer = slice(buffer, 1);
  25. push(buffer, result.value);
  26. if (buffer.length === windowSize) return createIterResultObject(buffer, false);
  27. }
  28. }, false, true);
  29. // `Iterator.prototype.sliding` and `Iterator.prototype.windows` methods
  30. // https://github.com/tc39/proposal-iterator-chunking
  31. module.exports = function (O, windowSize, sliding) {
  32. anObject(O);
  33. if (typeof windowSize != 'number' || !windowSize || windowSize >>> 0 !== windowSize) {
  34. return iteratorClose(O, 'throw', new $RangeError('windowSize must be integer in [1, 2^32-1]'));
  35. }
  36. return new IteratorProxy(getIteratorDirect(O), {
  37. windowSize: windowSize,
  38. buffer: [],
  39. sliding: sliding
  40. });
  41. };