molstar
Version:
A comprehensive macromolecular library.
122 lines • 4.71 kB
JavaScript
/**
* Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { OrderedSet, SortedArray, Interval } from '../int';
var SortedRanges;
(function (SortedRanges) {
function ofSortedRanges(array) { return SortedArray.ofSortedArray(array); }
SortedRanges.ofSortedRanges = ofSortedRanges;
function start(ranges) { return ranges[0]; }
SortedRanges.start = start;
function end(ranges) { return ranges[ranges.length - 1] + 1; }
SortedRanges.end = end;
function min(ranges) { return ranges[0]; }
SortedRanges.min = min;
function max(ranges) { return ranges[ranges.length - 1]; }
SortedRanges.max = max;
function size(ranges) {
var size = 0;
for (var i = 0, il = ranges.length; i < il; i += 2) {
size += ranges[i + 1] - ranges[i] + 1;
}
return size;
}
SortedRanges.size = size;
function count(ranges) { return ranges.length / 2; }
SortedRanges.count = count;
function startAt(ranges, index) {
return ranges[index * 2];
}
SortedRanges.startAt = startAt;
function endAt(ranges, index) {
return ranges[index * 2 + 1] + 1;
}
SortedRanges.endAt = endAt;
function minAt(ranges, index) {
return ranges[index * 2];
}
SortedRanges.minAt = minAt;
function maxAt(ranges, index) {
return ranges[index * 2 + 1];
}
SortedRanges.maxAt = maxAt;
function areEqual(a, b) {
if (a.length !== b.length)
return false;
for (var i = 0, il = a.length; i < il; ++i) {
if (a[i] !== b[i])
return false;
}
return true;
}
SortedRanges.areEqual = areEqual;
function forEach(ranges, f) {
var k = 0;
for (var i = 0, il = ranges.length; i < il; i += 2) {
for (var j = ranges[i], jl = ranges[i + 1]; j <= jl; ++j) {
f(j, k);
++k;
}
}
}
SortedRanges.forEach = forEach;
/** Returns if a value of `set` is included in `ranges` */
function has(ranges, set) {
return firstIntersectionIndex(ranges, set) !== -1;
}
SortedRanges.has = has;
/** Returns if a value of `set` is included in `ranges` from given index */
function hasFrom(ranges, set, from) {
return firstIntersectionIndexFrom(ranges, set, from) !== -1;
}
SortedRanges.hasFrom = hasFrom;
function firstIntersectionIndex(ranges, set) {
return firstIntersectionIndexFrom(ranges, set, 0);
}
SortedRanges.firstIntersectionIndex = firstIntersectionIndex;
function firstIntersectionIndexFrom(ranges, set, from) {
if (minAt(ranges, from) > OrderedSet.max(set) || max(ranges) < OrderedSet.min(set))
return -1;
for (var i = from, il = count(ranges); i < il; ++i) {
var interval = Interval.ofRange(minAt(ranges, i), maxAt(ranges, i));
if (OrderedSet.areIntersecting(interval, set))
return i;
}
return -1;
}
SortedRanges.firstIntersectionIndexFrom = firstIntersectionIndexFrom;
function transientSegments(ranges, set) {
return new Iterator(ranges, set);
}
SortedRanges.transientSegments = transientSegments;
var Iterator = /** @class */ (function () {
function Iterator(ranges, set) {
this.ranges = ranges;
this.set = set;
this.value = { index: 0, start: 0, end: 0 };
this.curIndex = 0;
this.hasNext = false;
this.curIndex = firstIntersectionIndex(ranges, set);
this.hasNext = this.curIndex !== -1;
}
Iterator.prototype.updateValue = function () {
this.value.index = this.curIndex;
this.value.start = OrderedSet.findPredecessorIndex(this.set, startAt(this.ranges, this.curIndex));
this.value.end = OrderedSet.findPredecessorIndex(this.set, endAt(this.ranges, this.curIndex));
};
Iterator.prototype.move = function () {
if (this.hasNext) {
this.updateValue();
this.curIndex = firstIntersectionIndexFrom(this.ranges, this.set, this.curIndex + 1);
this.hasNext = this.curIndex !== -1;
}
return this.value;
};
return Iterator;
}());
SortedRanges.Iterator = Iterator;
})(SortedRanges || (SortedRanges = {}));
export { SortedRanges };
//# sourceMappingURL=sorted-ranges.js.map