Skip to content

Commit c5fe884

Browse files
add polyfill and tests for new sliding method
1 parent 35c4297 commit c5fe884

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

src/index.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,35 @@ function windows(this: unknown, windowSize: unknown): Generator<unknown> {
5757
return windowsImpl(this as Iterator<unknown>, windowSize);
5858
}
5959

60+
function* slidingImpl<A>(iter: Iterator<A>, windowSize: number): Generator<Array<A>> {
61+
let buffer = [];
62+
for (const elem of liftIterator(iter)) {
63+
if (buffer.length === windowSize) {
64+
buffer.shift();
65+
}
66+
buffer.push(elem);
67+
if (buffer.length === windowSize) {
68+
yield buffer.slice();
69+
}
70+
}
71+
if (0 < buffer.length && buffer.length < windowSize) {
72+
yield buffer;
73+
}
74+
}
75+
76+
function sliding<A>(this: Iterator<A>, windowSize: number): Generator<Array<A>>
77+
function sliding(this: unknown, windowSize: unknown): Generator<unknown> {
78+
if (
79+
typeof windowSize !== 'number'
80+
|| windowSize <= 0
81+
|| Math.floor(windowSize) !== windowSize
82+
|| windowSize >= Math.pow(2, 53)
83+
) {
84+
throw new RangeError;
85+
}
86+
return slidingImpl(this as Iterator<unknown>, windowSize);
87+
}
88+
6089
Object.defineProperty(IteratorPrototype, 'chunks', {
6190
configurable: true,
6291
writable: true,
@@ -70,3 +99,10 @@ Object.defineProperty(IteratorPrototype, 'windows', {
7099
enumerable: false,
71100
value: windows,
72101
});
102+
103+
Object.defineProperty(IteratorPrototype, 'sliding', {
104+
configurable: true,
105+
writable: true,
106+
enumerable: false,
107+
value: sliding,
108+
});

test/index.mjs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,45 @@ test('windows', async t => {
9797
nats(1).windows(Math.pow(2, 53));
9898
}, RangeError)
9999
});
100+
101+
test('sliding', async t => {
102+
assert.deepEqual(
103+
Array.from(nats(5).sliding(2)),
104+
[[0, 1], [1, 2], [2, 3], [3, 4]],
105+
);
106+
assert.deepEqual(
107+
Array.from(nats(5).sliding(1)),
108+
[[0], [1], [2], [3], [4]],
109+
);
110+
assert.deepEqual(
111+
Array.from(nats(6).sliding(3)),
112+
[[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]],
113+
);
114+
assert.deepEqual(
115+
Array.from(nats(6).sliding(100)),
116+
[[0, 1, 2, 3, 4, 5]],
117+
);
118+
assert.deepEqual(
119+
Array.from(nats(0).sliding(2)),
120+
[],
121+
);
122+
123+
assert.throws(() => {
124+
nats(1).sliding()
125+
}, RangeError)
126+
assert.throws(() => {
127+
nats(1).sliding([2]);
128+
}, RangeError)
129+
assert.throws(() => {
130+
nats(1).sliding(0);
131+
}, RangeError)
132+
assert.throws(() => {
133+
nats(1).sliding(-1);
134+
}, RangeError)
135+
assert.throws(() => {
136+
nats(1).sliding(1.5);
137+
}, RangeError)
138+
assert.throws(() => {
139+
nats(1).sliding(Math.pow(2, 53));
140+
}, RangeError)
141+
});

0 commit comments

Comments
 (0)