1 | import { AsyncIterableX } from './asynciterablex';
|
2 | export class BufferAsyncIterable extends AsyncIterableX {
|
3 | constructor(source, count, skip) {
|
4 | super();
|
5 | this._source = source;
|
6 | this._count = count;
|
7 | this._skip = skip;
|
8 | }
|
9 | async *[Symbol.asyncIterator]() {
|
10 | let buffers = [], i = 0;
|
11 | for await (let item of this._source) {
|
12 | if (i % this._skip === 0) {
|
13 | buffers.push([]);
|
14 | }
|
15 | for (let buffer of buffers) {
|
16 | buffer.push(item);
|
17 | }
|
18 | if (buffers.length > 0 && buffers[0].length === this._count) {
|
19 | yield buffers.shift();
|
20 | }
|
21 | i++;
|
22 | }
|
23 | while (buffers.length > 0) {
|
24 | yield buffers.shift();
|
25 | }
|
26 | }
|
27 | }
|
28 | export function buffer(source, count, skip) {
|
29 | if (skip == null) {
|
30 | skip = count;
|
31 | }
|
32 | return new BufferAsyncIterable(source, count, skip);
|
33 | }
|
34 |
|
35 |
|