UNPKG

iter-tools-es

Version:
74 lines (56 loc) 1.58 kB
const { iterableCurry, ensureIterable } = require('../../internal/iterable.js'); const { __zipAll } = require('../$zip-all/zip-all.js'); const { __peekerate } = require('../$peekerate/peekerate.js'); const none = Symbol('none'); function _startsWithAnySeq(peekr, subseqPeekr, same) { if (subseqPeekr.done || subseqPeekr.value.includes(none)) return true; const matches = subseqPeekr.value.map(() => true); while (!peekr.done && !subseqPeekr.done) { const { value } = peekr; const { value: seqValue } = subseqPeekr; for (let i = 0; i < seqValue.length; i++) { if (!matches[i]) continue; if (seqValue[i] === none) { return true; } else { matches[i] = same(seqValue[i], value); } } subseqPeekr.advance(); peekr.advance(); } return subseqPeekr.done && matches.includes(true); } exports._startsWithAnySeq = _startsWithAnySeq; function __startsWithAnySeq(iterable, seqs, same = Object.is) { if (!seqs.length) return false; const peekr = __peekerate(iterable); const subseqPeekr = __peekerate(__zipAll(seqs, { filler: none })); const seqFound = _startsWithAnySeq(peekr, subseqPeekr, same); subseqPeekr.return(); peekr.return(); return seqFound; } exports.__startsWithAnySeq = __startsWithAnySeq; const startsWithAnySeq = /*#__PURE__*/iterableCurry(__startsWithAnySeq, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs(args) { args[1] = args[1].map(arg => ensureIterable(arg)); } }); exports.startsWithAnySeq = startsWithAnySeq;