the-math
Version:
TheMath is an extensive math library for JavaScript and Node.js. It features a flexible expression parser
116 lines (115 loc) • 4.94 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable no-param-reassign */
var getBracketOperation_1 = require("./getBracketOperation");
var multiply_1 = __importDefault(require("../operations/multiply"));
var divide_1 = __importDefault(require("../operations/divide"));
var sum_1 = __importDefault(require("../operations/sum"));
var subtract_1 = __importDefault(require("../operations/subtract"));
var getNegativeOperation_1 = require("./getNegativeOperation");
function divisionOrMultiplication(fragments) {
var multiplyIndexX = fragments.indexOf('x');
var multiplyAsteriskIndex = fragments.indexOf('*');
var multiplyIndex = multiplyIndexX > multiplyAsteriskIndex
? multiplyIndexX
: multiplyAsteriskIndex;
var divisionIndex = fragments.indexOf('/');
if (multiplyIndex === -1 && divisionIndex === -1) {
return;
}
if (multiplyIndex !== -1 &&
(multiplyIndex < divisionIndex || divisionIndex === -1)) {
var internalResult = (0, multiply_1.default)(Number(fragments[multiplyIndex - 1]), Number(fragments[multiplyIndex + 1]));
fragments[multiplyIndex - 1] = String(internalResult);
fragments.splice(multiplyIndex, 2);
}
if (divisionIndex !== -1 &&
(divisionIndex < multiplyIndex || multiplyIndex === -1)) {
var internalResult = (0, divide_1.default)(Number(fragments[divisionIndex - 1]), Number(fragments[divisionIndex + 1]));
fragments[divisionIndex - 1] = String(internalResult);
fragments.splice(divisionIndex, 2);
}
divisionOrMultiplication(fragments);
}
function additionsOrSubtract(fragments) {
var subtractIndex = fragments.indexOf('-');
var addIndex = fragments.indexOf('+');
if (subtractIndex === -1 && addIndex === -1) {
return;
}
if (subtractIndex !== -1 && subtractIndex > addIndex) {
var internalResult = (0, subtract_1.default)(Number(fragments[subtractIndex - 1]), Number(fragments[subtractIndex + 1]));
fragments[subtractIndex - 1] = String(internalResult);
fragments.splice(subtractIndex, 2);
}
if (addIndex !== -1 && addIndex > subtractIndex) {
var internalResult = (0, sum_1.default)(Number(fragments[addIndex - 1]), Number(fragments[addIndex + 1]));
fragments[addIndex - 1] = String(internalResult);
fragments.splice(addIndex, 2);
}
additionsOrSubtract(fragments);
}
function resolveOperations(fragments) {
var numberMultipliesOrDivision = fragments.filter(function (value) {
return /(x|\*|\/)/g.test(value);
}).length;
if (numberMultipliesOrDivision > 0) {
divisionOrMultiplication(fragments);
}
var numberAdditionsOrMinus = fragments.filter(function (value) {
return /(\+|-)/g.test(value);
}).length;
if (numberAdditionsOrMinus > 0) {
additionsOrSubtract(fragments);
}
}
function resolveBracket(fragments) {
var numberBrackets = fragments.filter(function (value) {
return /(\(|\)W)/g.test(value);
}).length;
if (numberBrackets > 0) {
var _a = (0, getBracketOperation_1.getBracketOperation)(fragments), openIndex = _a[0], closeIndex = _a[1];
var bracketOperation = fragments.splice(openIndex + 1, closeIndex - openIndex - 1);
resolveOperations(bracketOperation);
var resultBracketOperation = bracketOperation[0];
fragments[openIndex] = resultBracketOperation;
fragments.splice(openIndex + 1, 1);
resolveBracket(fragments);
}
}
function resolveNegativeNumber(fragments) {
var numberNegative = (0, getNegativeOperation_1.getNegativeOperation)(fragments);
if (numberNegative === -1) {
return;
}
var internalResult = (0, multiply_1.default)(Number(fragments[numberNegative + 1]), -1);
fragments[numberNegative + 1] = String(internalResult);
if (fragments[numberNegative] === '-') {
fragments.shift();
}
else {
fragments[numberNegative] = fragments[numberNegative].slice(0, 1);
}
resolveNegativeNumber(fragments);
}
function resolveArguments(fragments, parameters) {
fragments.forEach(function (fragment, index) {
if (parameters[fragment]) {
fragments[index] = String(parameters[fragment]);
}
});
}
function resolve(operation, parameters) {
var fragments = ((operation === null || operation === void 0 ? void 0 : operation.split(/(--?|\+-?|\*-?|x-?|\/-?|\(|\))/g)) || []).filter(function (value) { return value; });
if (parameters)
resolveArguments(fragments, parameters);
resolveNegativeNumber(fragments);
resolveBracket(fragments);
resolveOperations(fragments);
var result = fragments[0];
return Number(result);
}
exports.default = resolve;