-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.ts
More file actions
77 lines (70 loc) · 2.27 KB
/
index.ts
File metadata and controls
77 lines (70 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([].values()))
function liftIterator<A>(iter: Iterator<A>): Iterable<A> {
return { [Symbol.iterator]() { return iter; } };
}
function* chunksImpl<A>(iter: Iterator<A>, chunkSize: number): Generator<Array<A>> {
let buffer = [];
for (const elem of liftIterator(iter)) {
buffer.push(elem);
if (buffer.length === chunkSize) {
yield buffer;
buffer = [];
}
}
if (buffer.length > 0) {
yield buffer;
}
}
function chunks<A>(this: Iterator<A>, chunkSize: number): Generator<Array<A>>
function chunks(this: unknown, chunkSize: unknown): Generator<unknown> {
if (typeof chunkSize !== 'number' || Math.floor(chunkSize) !== chunkSize) {
throw new TypeError;
}
if (chunkSize <= 0 || chunkSize >= Math.pow(2, 53)) {
throw new RangeError;
}
return chunksImpl(this as Iterator<unknown>, chunkSize)
}
function* windowsImpl<A>(iter: Iterator<A>, windowSize: number, undersized: 'only-full' | 'allow-partial'): Generator<Array<A>> {
let buffer = [];
for (const elem of liftIterator(iter)) {
if (buffer.length === windowSize) {
buffer.shift();
}
buffer.push(elem);
if (buffer.length === windowSize) {
yield buffer.slice();
}
}
if (undersized === 'allow-partial' && 0 < buffer.length && buffer.length < windowSize) {
yield buffer;
}
}
function windows<A>(this: Iterator<A>, windowSize: number, undersized?: 'only-full' | 'allow-partial'): Generator<Array<A>>
function windows(this: unknown, windowSize: unknown, undersized?: unknown): Generator<unknown> {
if (typeof windowSize !== 'number' || Math.floor(windowSize) !== windowSize) {
throw new TypeError;
}
if (windowSize <= 0 || windowSize >= Math.pow(2, 53)) {
throw new RangeError;
}
if (undersized === undefined) {
undersized = 'only-full';
}
if (undersized !== 'only-full' && undersized !== 'allow-partial') {
throw new TypeError;
}
return windowsImpl(this as Iterator<unknown>, windowSize, undersized);
}
Object.defineProperty(IteratorPrototype, 'chunks', {
configurable: true,
writable: true,
enumerable: false,
value: chunks,
});
Object.defineProperty(IteratorPrototype, 'windows', {
configurable: true,
writable: true,
enumerable: false,
value: windows,
});