@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
139 lines • 4.47 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isRStringValue = isRStringValue;
exports.isRNumberValue = isRNumberValue;
exports.isRLogicalValue = isRLogicalValue;
exports.unwrapRValue = unwrapRValue;
exports.unwrapRVector = unwrapRVector;
exports.unwrapRValueToString = unwrapRValueToString;
exports.unliftRValue = unliftRValue;
const r_value_1 = require("../dataflow/eval/values/r-value");
const convert_values_1 = require("../r-bridge/lang-4.x/convert-values");
const assert_1 = require("./assert");
function isRValue(value) {
return isRStringValue(value) || isRNumberValue(value) || isRLogicalValue(value) || typeof value === 'string' || typeof value === 'number';
}
/**
* Checks whether the given value is an R string value.
*/
function isRStringValue(value) {
return typeof value === 'object' && value !== null && 'str' in value && typeof value.str === 'string';
}
/**
* Checks whether the given value is an R number value.
*/
function isRNumberValue(value) {
return typeof value === 'object' && value !== null && 'num' in value && typeof value.num === 'number';
}
/**
* Checks whether the given value is an R logical value.
*/
function isRLogicalValue(value) {
return typeof value === 'boolean';
}
/**
* Unwraps an R value to a (TS) native value.
*/
function unwrapRValue(value) {
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
return value;
}
else if (isRStringValue(value)) {
return value.str;
}
else if (isRNumberValue(value)) {
return value.num;
}
else {
return undefined;
}
}
/**
* Unwraps an R vector to a (TS) native array.
*/
function unwrapRVector(value) {
if (!Array.isArray(value)) {
return undefined;
}
else if (value.every(entry => typeof entry === 'string') || value.every(entry => typeof entry === 'number') || value.every(entry => typeof entry === 'boolean')) {
return value;
}
else if (value.every(isRStringValue)) {
return value.map(entry => unwrapRValue(entry));
}
else if (value.every(isRNumberValue)) {
return value.map(entry => unwrapRValue(entry));
}
else if (value.every(isRValue)) {
return value.map(entry => unwrapRValue(entry));
}
else {
return undefined;
}
}
/**
* Unwraps an R value to a string representation.
*/
function unwrapRValueToString(value) {
if (typeof value === 'string') {
return value;
}
else if (typeof value === 'number') {
return value.toString();
}
else if (typeof value === 'boolean') {
return value ? convert_values_1.RTrue : convert_values_1.RFalse;
}
else if (isRStringValue(value)) {
return value.str;
}
else if (isRNumberValue(value)) {
return value.num.toString();
}
else {
return undefined;
}
}
/**
* Unlifts an R value to its core representation.
*/
function unliftRValue(value) {
if (!(0, r_value_1.isValue)(value)) {
return undefined;
}
const type = value.type;
switch (type) {
case 'null': {
return null;
}
case 'string': {
return (0, r_value_1.isValue)(value.value) ? value.value : undefined;
}
case 'number': {
return (0, r_value_1.isValue)(value.value) ? value.value : undefined;
}
case 'logical': {
return (0, r_value_1.isValue)(value.value) && typeof value.value === 'boolean' ? value.value : undefined;
}
case 'interval': {
const start = unliftRValue(value.start);
const end = unliftRValue(value.end);
return start !== undefined && end !== undefined && start.num === end.num ? start : undefined;
}
case 'vector': {
const values = (0, r_value_1.isValue)(value.elements) ? value.elements.map(unliftRValue) : undefined;
return values?.every(assert_1.isNotUndefined) ? values.flat() : undefined;
}
case 'set': {
return (0, r_value_1.isValue)(value.elements) && value.elements.length === 1 ? unliftRValue(value.elements[0]) : undefined;
}
case 'missing': {
return undefined;
}
case 'function-definition':
return 'fn-def';
default:
(0, assert_1.assertUnreachable)(type);
}
}
//# sourceMappingURL=r-value.js.map