UNPKG

@rimbu/common

Version:

Common types and objects used in many other Rimbu packages

110 lines 3.9 kB
"use strict"; 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