UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

79 lines 2.83 kB
"use strict"; 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; exports.rangeIsSubsetOf = rangeIsSubsetOf; exports.combineRanges = combineRanges; 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) { const rsSafe = rs.filter(assert_1.isNotUndefined); (0, assert_1.guard)(rsSafe.length > 0, 'Cannot merge no ranges'); return rsSafe.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]) ], rsSafe[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; } } /** * Checks if the first range is a subset of the second range. */ function rangeIsSubsetOf([r1sl, r1sc, r1el, r1ec], [r2sl, r2sc, r2el, r2ec]) { return (r1sl > r2sl || r1sl === r2sl && r1sc >= r2sc) && (r1el < r2el || r1sl === r2sl && r1ec <= r2ec); } function combineRanges(...ranges) { return ranges.filter(range => !ranges.some(other => range !== other && rangeIsSubsetOf(range, other))); } //# sourceMappingURL=range.js.map