UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

139 lines 4.47 kB
"use strict"; 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