iter-tools-es
Version:
The iterable toolbox
52 lines (42 loc) • 1.15 kB
JavaScript
const {
AsyncPartsIterator,
AsyncPartIterator
} = require('./async-parts-iterator.js');
const {
split
} = require('./symbols.js');
class AsyncGroupsIterator extends AsyncPartsIterator {
async next() {
if (!this.initialized) await this.init();
const {
spliterator
} = this;
if (this.currentPart !== null) {
if (spliterator.value !== split || spliterator.current === this.splitStep) {
this.currentPart.inactive = true;
while (!spliterator.done && spliterator.value !== split) {
await spliterator.advance();
}
}
}
if (spliterator.done) {
return {
value: undefined,
done: true
};
}
await spliterator.advance();
if (spliterator.done || spliterator.value === split) {
throw new Error('Unexpected empty group');
}
const key = spliterator.value;
await spliterator.advance();
this.splitStep = spliterator.current;
this.currentPart = new AsyncPartIterator(this);
return {
value: [key, this.currentPart],
done: false
};
}
}
exports.AsyncGroupsIterator = AsyncGroupsIterator;