@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
35 lines • 1.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.vectorFrom = vectorFrom;
exports.flattenVectorElements = flattenVectorElements;
const r_value_1 = require("../r-value");
const assert_1 = require("../../../../util/assert");
const general_1 = require("../general");
/**
* Creates an abstract vector from abstract values
* @param elements - elements that the vector should contain
* @returns abstract ValueVector
*/
function vectorFrom(elements) {
(0, assert_1.guard)((0, r_value_1.isTop)(elements) || (0, r_value_1.isBottom)(elements) || Array.isArray(elements), 'Expected array of values');
return {
type: 'vector',
elements,
elementDomain: r_value_1.Top
};
}
/**
* Flattens all elements inside of a vector
* A set containing only one element is also replaced by its only element
* @param s - vector to flatten
* @returns flattened vactor, if all elements are not bottom / top
*/
function flattenVectorElements(s) {
return (0, general_1.bottomTopGuard)(s) ?? s.flatMap(e => {
return e.type === 'vector' ? flattenVectorElements(e.elements) :
e.type === 'set' && (0, r_value_1.isValue)(e.elements) && e.elements.length === 1 ?
e.elements[0].type === 'vector' ? flattenVectorElements(e.elements[0].elements) : e.elements :
e;
});
}
//# sourceMappingURL=vector-constants.js.map