iter-tools-es
Version:
The iterable toolbox
59 lines (46 loc) • 1.22 kB
JavaScript
const {
asyncIterableCurry
} = require('../../internal/async-iterable.js');
const {
CircularBuffer,
ReadOnlyCircularBuffer
} = require('../../internal/circular-buffer.js');
async function* __asyncWindowAhead(source, size, {
filler = undefined,
useFiller = true
} = {}) {
const buffer = new CircularBuffer(size);
const bufferReadProxy = new ReadOnlyCircularBuffer(buffer);
let len = 0;
for await (const value of source) {
buffer.push(value);
if (buffer.isFull()) {
yield bufferReadProxy;
}
len++;
}
if (useFiller) {
for (let i = len; i < size; i++) {
buffer.push(filler);
}
}
if (len > 0 && len < size) yield bufferReadProxy;
for (let i = 0; i < Math.min(size, len) - 1; i++) {
buffer.shift();
if (useFiller) {
buffer.push(filler);
}
yield bufferReadProxy;
}
}
exports.__asyncWindowAhead = __asyncWindowAhead;
const asyncWindowAhead = /*#__PURE__*/asyncIterableCurry(__asyncWindowAhead, {
minArgs: 1,
maxArgs: 2,
validateArgs(args) {
if (typeof args[1] !== 'number') {
throw new Error(`${'asyncWindowAhead'} must be passed a numeric size`);
}
}
});
exports.asyncWindowAhead = asyncWindowAhead;