35 lines
730 B
TypeScript
35 lines
730 B
TypeScript
export async function* bufferIter<T>(
|
|
iterator: AsyncIterableIterator<T>,
|
|
size = 60
|
|
) {
|
|
const buffer: T[] = [];
|
|
for (let i = 0; i < size; i++) {
|
|
const result = await iterator.next();
|
|
if (result.done) {
|
|
break;
|
|
} else {
|
|
buffer.push(result.value);
|
|
}
|
|
}
|
|
let done = false;
|
|
while (!done || buffer.length > 0) {
|
|
if (buffer.length > 0) {
|
|
yield buffer.shift()!;
|
|
iterator.next().then((result) => {
|
|
if (result.done) {
|
|
done = true;
|
|
} else {
|
|
buffer.push(result.value);
|
|
}
|
|
});
|
|
} else {
|
|
const result = await iterator.next();
|
|
if (result.done) {
|
|
return;
|
|
} else {
|
|
yield result.value;
|
|
}
|
|
}
|
|
}
|
|
}
|