UNPKG

iter-tools-es

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