iter-tools-es
Version:
The iterable toolbox
47 lines (38 loc) • 1.04 kB
JavaScript
const {
asyncIterableCurry
} = require('../../internal/async-iterable.js');
const {
__asyncSpliterateGrouped
} = require('../$spliterate-grouped/async-spliterate-grouped.js');
const {
__asyncPeekerate
} = require('../$peekerate/async-peekerate.js');
const initialKey = Symbol('initial group key');
async function* asyncGroupingSpliterator(split, {
getKey
}, source) {
const peekr = await __asyncPeekerate(source);
let key = initialKey;
let idx = 0;
while (!peekr.done) {
const lastKey = key;
key = await getKey(peekr.value, idx++);
if (lastKey !== key) {
yield split;
yield key;
}
yield peekr.value;
await peekr.advance();
}
}
function __asyncSplitGroups(source, getKey = value => value) {
return __asyncSpliterateGrouped(source, asyncGroupingSpliterator, {
getKey
});
}
exports.__asyncSplitGroups = __asyncSplitGroups;
const asyncSplitGroups = /*#__PURE__*/asyncIterableCurry(__asyncSplitGroups, {
minArgs: 0,
maxArgs: 1
});
exports.asyncSplitGroups = asyncSplitGroups;