Skip to content

Commit 3c22291

Browse files
committed
sliding & windows implementation unification
1 parent 9a31345 commit 3c22291

File tree

3 files changed

+49
-70
lines changed

3 files changed

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

336
// `Iterator.prototype.sliding` method
347
// https://github.com/tc39/proposal-iterator-chunking
358
$({ target: 'Iterator', proto: true, real: true, forced: true }, {
369
sliding: function sliding(windowSize) {
37-
var O = anObject(this);
38-
if (typeof windowSize != 'number' || !windowSize || windowSize >>> 0 !== windowSize) {
39-
return iteratorClose(O, 'throw', new $RangeError('windowSize must be integer in [1, 2^32-1]'));
40-
}
41-
return new IteratorProxy(getIteratorDirect(O), {
42-
windowSize: windowSize,
43-
buffer: []
44-
});
10+
return call(implementation, this, windowSize, true);
4511
}
4612
});
Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,12 @@
11
'use strict';
22
var $ = require('../internals/export');
3-
var anObject = require('../internals/an-object');
43
var call = require('../internals/function-call');
5-
var createIteratorProxy = require('../internals/iterator-create-proxy');
6-
var getIteratorDirect = require('../internals/get-iterator-direct');
7-
var iteratorClose = require('../internals/iterator-close');
8-
var uncurryThis = require('../internals/function-uncurry-this');
9-
10-
var $RangeError = RangeError;
11-
var push = uncurryThis([].push);
12-
var slice = uncurryThis([].slice);
13-
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 result, done;
20-
while (true) {
21-
result = anObject(call(next, iterator));
22-
done = this.done = !!result.done;
23-
if (done) return;
24-
25-
if (buffer.length === windowSize) this.buffer = buffer = slice(buffer, 1);
26-
push(buffer, result.value);
27-
if (buffer.length === windowSize) return buffer;
28-
}
29-
});
4+
var implementation = require('../internals/iterator-chunking');
305

316
// `Iterator.prototype.windows` method
327
// https://github.com/tc39/proposal-iterator-chunking
338
$({ target: 'Iterator', proto: true, real: true, forced: true }, {
349
windows: function windows(windowSize) {
35-
var O = anObject(this);
36-
if (typeof windowSize != 'number' || !windowSize || windowSize >>> 0 !== windowSize) {
37-
return iteratorClose(O, 'throw', new $RangeError('windowSize must be integer in [1, 2^32-1]'));
38-
}
39-
return new IteratorProxy(getIteratorDirect(O), {
40-
windowSize: windowSize,
41-
buffer: []
42-
});
10+
return call(implementation, this, windowSize, false);
4311
}
4412
});

0 commit comments

Comments
 (0)