@rimbu/common
Version:
Common types and objects used in many other Rimbu packages
105 lines • 3.65 kB
JavaScript
export 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) {
if (undefined !== range.amount) {
if (undefined === range.start)
return [0, range.amount - 1];
if (Array.isArray(range.start)) {
const [start, includeStart] = range.start;
if (includeStart)
return [start, start + range.amount - 1];
return [start + 1, start + 1 + range.amount - 1];
}
return [range.start, range.start + range.amount - 1];
}
let start = 0;
let 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 = range.start ?? 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';
let start = 0;
let 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 || (IndexRange = {}));
//# sourceMappingURL=index-range.mjs.map