@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
67 lines • 2.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRangeStart = getRangeStart;
exports.getRangeEnd = getRangeEnd;
exports.rangeFrom = rangeFrom;
exports.mergeRanges = mergeRanges;
exports.rangeStartsCompletelyBefore = rangeStartsCompletelyBefore;
exports.rangesOverlap = rangesOverlap;
exports.addRanges = addRanges;
exports.rangeCompare = rangeCompare;
const assert_1 = require("./assert");
function getRangeStart(p) {
return p === undefined ? undefined : [p[0], p[1]];
}
function getRangeEnd(p) {
return p === undefined ? undefined : [p[2], p[3]];
}
/**
* This does not ensure ordering of start and end!
*
* @param sl - start line
* @param sc - start column
* @param el - end line
* @param ec - end column
*/
function rangeFrom(sl, sc, el, ec) {
return [Number(sl), Number(sc), Number(el), Number(ec)];
}
function mergeRanges(...rs) {
(0, assert_1.guard)(rs.length > 0, 'Cannot merge no ranges');
return rs.reduce(([sl, sc, el, ec], [nsl, nsc, nel, nec]) => [
...(sl < nsl || (sl === nsl && sc < nsc) ? [sl, sc] : [nsl, nsc]),
...(el > nel || (el === nel && ec > nec) ? [el, ec] : [nel, nec])
], rs[0]);
}
/**
* @returns true iff `r1` starts and ends before `r2` starts (i.e., if `r1` and `r2` do not overlap and `r1` comes before `r2`
*/
function rangeStartsCompletelyBefore([, , r1el, r1ec], [r2sl, r2sc, ,]) {
return r1el < r2sl || (r1el === r2sl && r1ec < r2sc);
}
/**
* Checks if the two ranges overlap.
*/
function rangesOverlap([r1sl, r1sc, r1el, r1ec], [r2sl, r2sc, r2el, r2ec]) {
return r1sl <= r2el && r2sl <= r1el && r1sc <= r2ec && r2sc <= r1ec;
}
/**
* Calculate the component-wise sum of two ranges
*/
function addRanges([r1sl, r1sc, r1el, r1ec], [r2sl, r2sc, r2el, r2ec]) {
return [r1sl + r2sl, r1sc + r2sc, r1el + r2el, r1ec + r2ec];
}
/**
* Provides a comparator for {@link SourceRange}s that sorts them in ascending order.
*
* @returns a positive number if `r1` comes after `r2`, a negative number if `r1` comes before `r2`, and `0` if they are equal
*/
function rangeCompare([r1sl, r1sc, ,], [r2sl, r2sc, ,]) {
if (r1sl === r2sl) {
return r1sc - r2sc;
}
else {
return r1sl - r2sl;
}
}
//# sourceMappingURL=range.js.map