asyncChunkIterableBySize

JavaScript
// Yields fixed-size arrays from any iterable, sync or async.
export async function* chunkIterable(iterable, size) {
  if (!Number.isInteger(size) || size < 1) {
    throw new RangeError('size must be a positive integer');
  }
  const iterator = iterable?.[Symbol.asyncIterator]
    ? iterable[Symbol.asyncIterator]()
    : iterable[Symbol.iterator]();
  let batch = [];
  for (;;) {
    const { value, done } = await iterator.next();
    if (done) {
      if (batch.length > 0) yield batch;
      return;
    }
    batch.push(value);
    if (batch.length === size) {
      yield batch;
      batch = [];
    }
  }
}