UNPKG

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
"use strict"; 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;