UNPKG

iter-tools-es

Version:
68 lines (54 loc) 1.26 kB
const { iterableCurry } = require('../../internal/iterable.js'); const { Bisector } = require('../../internal/bisector.js'); const { __toArray } = require('../$to-array/to-array.js'); const { __peekerate } = require('../$peekerate/peekerate.js'); function* indexStrategy(split, { at }, source) { const _source = at < 0 ? __toArray(source) : source; const idx = at < 0 ? _source.length + at : at; const peekr = __peekerate(_source); try { while (!peekr.done) { if (peekr.index === idx) yield split; yield peekr.value; peekr.advance(); } } finally { peekr.return(); } } exports.indexStrategy = indexStrategy; function* conditionStrategy(split, { at: predicate }, source) { let i = 0; let splat = false; for (const value of source) { if (!splat && predicate(value, i++)) { yield split; splat = true; } yield value; } } exports.conditionStrategy = conditionStrategy; function __bisect(source, at) { const strategy = typeof at === 'number' ? indexStrategy : conditionStrategy; return new Bisector(source, strategy, { at }); } exports.__bisect = __bisect; const bisect = /*#__PURE__*/iterableCurry(__bisect, { forceSync: true }); exports.bisect = bisect;