iter-tools-es
Version:
The iterable toolbox
72 lines (60 loc) • 1.73 kB
JavaScript
const {
asyncIterableCurry
} = require('../../internal/async-iterable.js');
const {
asyncSeqsToArray
} = require('../../internal/async-any-seq.js');
const {
__startsWithSeq
} = require('../$starts-with-seq/starts-with-seq.js');
const {
__asyncWindowAhead
} = require('../$window-ahead/async-window-ahead.js');
const {
__asyncSpliterate
} = require('../$spliterate/async-spliterate.js');
function getMatchingLength(buffer, separatorSeqs, same) {
for (const subsequence of separatorSeqs) {
if (__startsWithSeq(buffer, subsequence, same)) {
return subsequence.length;
}
}
return 0;
}
async function* asyncAnySeqspliterator(split, {
separatorSeqs,
same
}, source) {
const maxMatchLength = separatorSeqs.reduce((max, {
length
}) => Math.max(max, length), 1);
let skip = 0;
for await (const buffer of __asyncWindowAhead(source, maxMatchLength, {
useFiller: false
})) {
if (skip > 0) {
skip--;
continue;
}
const matchingLength = getMatchingLength(buffer, separatorSeqs, same);
if (matchingLength > 0) {
yield split;
skip = matchingLength - 1;
} else {
yield buffer.get(0);
}
}
}
async function* __asyncSplitOnAnySeq(source, separatorSeqs, same = Object.is) {
const separatorSeqsArr = (await asyncSeqsToArray(separatorSeqs)).filter(s => s.length > 0);
yield* __asyncSpliterate(source, asyncAnySeqspliterator, {
separatorSeqs: separatorSeqsArr.sort((a, b) => b.length - a.length),
same
});
}
exports.__asyncSplitOnAnySeq = __asyncSplitOnAnySeq;
const asyncSplitOnAnySeq = /*#__PURE__*/asyncIterableCurry(__asyncSplitOnAnySeq, {
minArgs: 1,
maxArgs: 2
});
exports.asyncSplitOnAnySeq = asyncSplitOnAnySeq;