iter-tools-es
Version:
The iterable toolbox
68 lines (54 loc) • 1.26 kB
JavaScript
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;