@rimbu/common
Version:
Common types and objects used in many other Rimbu packages
110 lines • 3.9 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.IndexRange = void 0;
var tslib_1 = require("tslib");
var IndexRange;
(function (IndexRange) {
/**
* Returns, given the `range` `IndexRange`, a normalized tuple containing the
* start index, and optionally an end index.
* @param range - the `IndexRange` to use
*/
function getIndexRangeIndices(range) {
var _a;
if (undefined !== range.amount) {
if (undefined === range.start)
return [0, range.amount - 1];
if (Array.isArray(range.start)) {
var _b = tslib_1.__read(range.start, 2), start_1 = _b[0], includeStart = _b[1];
if (includeStart)
return [start_1, start_1 + range.amount - 1];
return [start_1 + 1, start_1 + 1 + range.amount - 1];
}
return [range.start, range.start + range.amount - 1];
}
var start = 0;
var end = undefined;
if ("start" in range) {
if (Array.isArray(range.start)) {
if (range.start[1])
start = range.start[0];
else
start = range.start[0] + 1;
}
else
start = (_a = range.start) !== null && _a !== void 0 ? _a : 0;
}
if ("end" in range) {
if (Array.isArray(range.end)) {
if (range.end[1])
end = range.end[0];
else
end = range.end[0] - 1;
}
else
end = range.end;
}
return [start, end];
}
IndexRange.getIndexRangeIndices = getIndexRangeIndices;
/**
* Returns, given the `range` `IndexRange`, and a target maximum `length`, the actual index range.
* This can be one of three options:
* - 'empty': there are no elements within the range
* - 'all': all elements are within the range
* - [start: number, end: number]: an inclusive range of element indices within the given range
* @param range - the `IndexRange` to use
* @param length - the target maximum length
*/
function getIndicesFor(range, length) {
if (length <= 0)
return 'empty';
var start = 0;
var end = length - 1;
if (undefined !== range.start) {
if (Array.isArray(range.start)) {
start = range.start[0];
if (!range.start[1])
start++;
}
else
start = range.start;
if (start >= length || -start > length)
return 'empty';
if (start < 0)
start = length + start;
}
if (undefined !== range.amount) {
if (range.amount <= 0)
return 'empty';
if (undefined === range.start) {
if (range.amount >= length)
return 'all';
return [0, Math.min(end, range.amount - 1)];
}
end = start + range.amount - 1;
}
else if (undefined !== range.end) {
if (Array.isArray(range.end)) {
end = range.end[0];
if (!range.end[1]) {
if (end === 0)
return 'empty';
end--;
}
}
else
end = range.end;
if (end < 0)
end = length + end;
}
if (end < start)
return 'empty';
end = Math.min(length - 1, end);
if (start === 0 && end === length - 1)
return 'all';
return [start, end];
}
IndexRange.getIndicesFor = getIndicesFor;
})(IndexRange || (exports.IndexRange = IndexRange = {}));
//# sourceMappingURL=index-range.cjs.map
;