iter-tools-es
Version:
The iterable toolbox
72 lines (60 loc) • 1.6 kB
JavaScript
const {
iterableCurry
} = require('../../internal/iterable.js');
const {
seqsToArray
} = require('../../internal/any-seq.js');
const {
__startsWithSeq
} = require('../$starts-with-seq/starts-with-seq.js');
const {
__windowAhead
} = require('../$window-ahead/window-ahead.js');
const {
__spliterate
} = require('../$spliterate/spliterate.js');
function getMatchingLength(buffer, separatorSeqs, same) {
for (const subsequence of separatorSeqs) {
if (__startsWithSeq(buffer, subsequence, same)) {
return subsequence.length;
}
}
return 0;
}
function* anySeqspliterator(split, {
separatorSeqs,
same
}, source) {
const maxMatchLength = separatorSeqs.reduce((max, {
length
}) => Math.max(max, length), 1);
let skip = 0;
for (const buffer of __windowAhead(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);
}
}
}
function* __splitOnAnySeq(source, separatorSeqs, same = Object.is) {
const separatorSeqsArr = seqsToArray(separatorSeqs).filter(s => s.length > 0);
yield* __spliterate(source, anySeqspliterator, {
separatorSeqs: separatorSeqsArr.sort((a, b) => b.length - a.length),
same
});
}
exports.__splitOnAnySeq = __splitOnAnySeq;
const splitOnAnySeq = /*#__PURE__*/iterableCurry(__splitOnAnySeq, {
minArgs: 1,
maxArgs: 2
});
exports.splitOnAnySeq = splitOnAnySeq;