UNPKG

range-ts

Version:

RangeMap implementation based on Guava

176 lines 7.3 kB
"use strict"; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RangeMap = void 0; var number_range_1 = require("../number-range/number-range"); var bound_type_1 = require("../core/bound-type"); var RangeMap = (function () { function RangeMap(eq) { if (eq === void 0) { eq = function (a, b) { return a === b; }; } this.eq = eq; this.rangeValues = []; } RangeMap.fromRangeValues = function (values, eq) { var rangeMap = new RangeMap(eq); rangeMap.rangeValues = values; return rangeMap; }; RangeMap.prototype.put = function (range, value) { this.combinedPut(range, value, false); }; RangeMap.prototype.putCoalescing = function (range, value) { this.combinedPut(range, value, true); }; RangeMap.prototype.get = function (value) { var foundRangeValue = this.rangeValues.find(function (currentRangeValue) { return currentRangeValue.range.contains(value); }); if (foundRangeValue) { return foundRangeValue.value; } return null; }; RangeMap.prototype.asMapOfRanges = function () { var newMap = new Map(); this.rangeValues .filter(function (range) { return !range.range.isEmpty(); }) .sort(function (a, b) { return a.range.lowerEndpoint.valueOf() - b.range.lowerEndpoint.valueOf(); }) .forEach(function (currentRangeValue) { newMap.set(currentRangeValue.range, currentRangeValue.value); }); return newMap; }; RangeMap.prototype.asMapOfValues = function () { var newMap = new Map(); this.rangeValues .filter(function (range) { return !range.range.isEmpty(); }) .sort(function (a, b) { return a.range.lowerEndpoint.valueOf() - b.range.lowerEndpoint.valueOf(); }) .forEach(function (currentRangeValue) { if (newMap.has(currentRangeValue.value)) { newMap.get(currentRangeValue.value).push(currentRangeValue.range); } else { newMap.set(currentRangeValue.value, [currentRangeValue.range]); } }); return newMap; }; RangeMap.prototype.subRangeMap = function (range) { var rangeValues = this.rangeValues.flatMap(function (rangeValue) { var intersection = rangeValue.range.intersection(range); if (!intersection) { return []; } return [ { range: intersection, value: rangeValue.value, }, ]; }); return RangeMap.fromRangeValues(rangeValues); }; RangeMap.prototype.getEntry = function (key) { var foundRangeValue = this.rangeValues.find(function (currentRangeValue) { return currentRangeValue.range.contains(key); }); if (foundRangeValue) { return [foundRangeValue.range, foundRangeValue.value]; } return null; }; RangeMap.prototype.span = function () { if (this.rangeValues.length === 0) { return null; } var sortedRangeValues = this.rangeValues.sort(function (a, b) { return a.range.lowerEndpoint.valueOf() - b.range.lowerEndpoint.valueOf(); }); return new number_range_1.NumberRange(sortedRangeValues[0].range.lowerEndpoint, sortedRangeValues[0].range.lowerBoundType, sortedRangeValues[sortedRangeValues.length - 1].range.upperEndpoint, sortedRangeValues[sortedRangeValues.length - 1].range.upperBoundType); }; RangeMap.prototype.remove = function (range) { if (range.isEmpty()) { return; } var toDelete = { toDeleteId: Math.random() }; this.put(range, toDelete); this.rangeValues = this.rangeValues.filter(function (rangeValue) { return rangeValue.value !== toDelete; }); }; RangeMap.prototype.combinedPut = function (range, value, shouldPutCoalescing) { var _this = this; if (shouldPutCoalescing === void 0) { shouldPutCoalescing = false; } var newRange = range; var affectedRangeValues = []; var unaffectedRangeValues = []; this.rangeValues.forEach(function (currentRangeValue) { if (currentRangeValue.range.isConnected(newRange)) { affectedRangeValues.push(currentRangeValue); } else { unaffectedRangeValues.push(currentRangeValue); } }); affectedRangeValues = affectedRangeValues.flatMap(function (currentRangeValue) { var _a; if (shouldPutCoalescing && _this.eq(value, currentRangeValue.value)) { newRange = newRange.span(currentRangeValue.range); return []; } if ((_a = currentRangeValue.range.intersection(newRange)) === null || _a === void 0 ? void 0 : _a.isEmpty()) { return [currentRangeValue]; } var rangeBefore = currentRangeValue.range.intersection(number_range_1.NumberRange.upTo(newRange.lowerEndpoint, newRange.lowerBoundType === bound_type_1.BoundType.OPEN ? bound_type_1.BoundType.CLOSED : bound_type_1.BoundType.OPEN)); var rangeAfter = currentRangeValue.range.intersection(new number_range_1.NumberRange(newRange.upperEndpoint, newRange.upperBoundType === bound_type_1.BoundType.OPEN ? bound_type_1.BoundType.CLOSED : bound_type_1.BoundType.OPEN, Number.POSITIVE_INFINITY, bound_type_1.BoundType.OPEN)); return [rangeBefore, rangeAfter] .filter(function (a) { return !!a; }) .filter(function (a) { return !a.isEmpty(); }) .map(function (currentRange) { return ({ range: currentRange, value: currentRangeValue.value, }); }); }); this.rangeValues = __spreadArray(__spreadArray(__spreadArray([], __read(unaffectedRangeValues), false), __read(affectedRangeValues), false), [ { range: newRange, value: value, }, ], false); }; return RangeMap; }()); exports.RangeMap = RangeMap; //# sourceMappingURL=range-map.js.map