UNPKG

iter-tools-es

Version:
72 lines (60 loc) 1.6 kB
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;