From 6ddc1b1c9c0e863126cdc096631d4fe65f941611 Mon Sep 17 00:00:00 2001 From: d98762625 Date: Tue, 15 May 2018 14:32:39 +0100 Subject: [PATCH] export Arithmetic funcs individually. Use existing Delim --- src/core/lib/Arithmetic.mjs | 262 ++++++++++------------ src/core/operations/Divide.mjs | 10 +- src/core/operations/Mean.mjs | 7 +- src/core/operations/Median.mjs | 9 +- src/core/operations/Multiply.mjs | 10 +- src/core/operations/StandardDeviation.mjs | 10 +- src/core/operations/Subtract.mjs | 10 +- src/core/operations/Sum.mjs | 10 +- 8 files changed, 158 insertions(+), 170 deletions(-) diff --git a/src/core/lib/Arithmetic.mjs b/src/core/lib/Arithmetic.mjs index 199e89bc..3ee2372f 100644 --- a/src/core/lib/Arithmetic.mjs +++ b/src/core/lib/Arithmetic.mjs @@ -8,156 +8,132 @@ import Utils from "../Utils"; import BigNumber from "bignumber.js"; + /** - * Arithmetic functions used by Sum, Multiply, Divide, Subtract (etc) - * functions. + * Converts a string array to a number array. + * + * @param {string[]} input + * @param {string} delim + * @returns {BigNumber[]} */ -class Arithmetic { +export function createNumArray(input, delim) { + delim = Utils.charRep(delim || "Space"); + const splitNumbers = input.split(delim); + const numbers = []; + let num; - /** - * @constant - * @default - */ - static get DELIM_OPTIONS() { - return ["Line feed", "Space", "Comma", "Semi-colon", "Colon", "CRLF"]; - } - - /** - * Converts a string array to a number array. - * - * @private - * @param {string[]} input - * @param {string} delim - * @returns {BigNumber[]} - */ - static _createNumArray(input, delim) { - delim = Utils.charRep(delim || "Space"); - const splitNumbers = input.split(delim); - const numbers = []; - let num; - - splitNumbers.map((number) => { - try { - num = BigNumber(number.trim()); - if (!num.isNaN()) { - numbers.push(num); - } - } catch (err) { - // This line is not a valid number + splitNumbers.map((number) => { + try { + num = BigNumber(number.trim()); + if (!num.isNaN()) { + numbers.push(num); } - }); - return numbers; - } - - - /** - * Adds an array of numbers and returns the value. - * - * @private - * @param {BigNumber[]} data - * @returns {BigNumber} - */ - static _sum(data) { - if (data.length > 0) { - return data.reduce((acc, curr) => acc.plus(curr)); + } catch (err) { + // This line is not a valid number } - } + }); + return numbers; +} - /** - * Subtracts an array of numbers and returns the value. - * - * @private - * @param {BigNumber[]} data - * @returns {BigNumber} - */ - static _sub(data) { - if (data.length > 0) { - return data.reduce((acc, curr) => acc.minus(curr)); - } - } - - - /** - * Multiplies an array of numbers and returns the value. - * - * @private - * @param {BigNumber[]} data - * @returns {BigNumber} - */ - static _multi(data) { - if (data.length > 0) { - return data.reduce((acc, curr) => acc.times(curr)); - } - } - - - /** - * Divides an array of numbers and returns the value. - * - * @private - * @param {BigNumber[]} data - * @returns {BigNumber} - */ - static _div(data) { - if (data.length > 0) { - return data.reduce((acc, curr) => acc.div(curr)); - } - } - - - /** - * Computes mean of a number array and returns the value. - * - * @private - * @param {BigNumber[]} data - * @returns {BigNumber} - */ - static _mean(data) { - if (data.length > 0) { - return Arithmetic._sum(data).div(data.length); - } - } - - - /** - * Computes median of a number array and returns the value. - * - * @private - * @param {BigNumber[]} data - * @returns {BigNumber} - */ - static _median(data) { - if ((data.length % 2) === 0 && data.length > 0) { - data.sort(function(a, b){ - return a.minus(b); - }); - const first = data[Math.floor(data.length / 2)]; - const second = data[Math.floor(data.length / 2) - 1]; - return Arithmetic._mean([first, second]); - } else { - return data[Math.floor(data.length / 2)]; - } - } - - - /** - * Computes standard deviation of a number array and returns the value. - * - * @private - * @param {BigNumber[]} data - * @returns {BigNumber} - */ - static _stdDev(data) { - if (data.length > 0) { - const avg = Arithmetic._mean(data); - let devSum = new BigNumber(0); - data.map((datum) => { - devSum = devSum.plus(datum.minus(avg).pow(2)); - }); - return devSum.div(data.length).sqrt(); - } +/** + * Adds an array of numbers and returns the value. + * + * @param {BigNumber[]} data + * @returns {BigNumber} + */ +export function sum(data) { + if (data.length > 0) { + return data.reduce((acc, curr) => acc.plus(curr)); } } -export default Arithmetic; + +/** + * Subtracts an array of numbers and returns the value. + * + * @param {BigNumber[]} data + * @returns {BigNumber} + */ +export function sub(data) { + if (data.length > 0) { + return data.reduce((acc, curr) => acc.minus(curr)); + } +} + + +/** + * Multiplies an array of numbers and returns the value. + * + * @param {BigNumber[]} data + * @returns {BigNumber} + */ +export function multi(data) { + if (data.length > 0) { + return data.reduce((acc, curr) => acc.times(curr)); + } +} + + +/** + * Divides an array of numbers and returns the value. + * + * @param {BigNumber[]} data + * @returns {BigNumber} + */ +export function div(data) { + if (data.length > 0) { + return data.reduce((acc, curr) => acc.div(curr)); + } +} + + +/** + * Computes mean of a number array and returns the value. + * + * @param {BigNumber[]} data + * @returns {BigNumber} + */ +export function mean(data) { + if (data.length > 0) { + return sum(data).div(data.length); + } +} + + +/** + * Computes median of a number array and returns the value. + * + * @param {BigNumber[]} data + * @returns {BigNumber} + */ +export function median(data) { + if ((data.length % 2) === 0 && data.length > 0) { + data.sort(function(a, b){ + return a.minus(b); + }); + const first = data[Math.floor(data.length / 2)]; + const second = data[Math.floor(data.length / 2) - 1]; + return mean([first, second]); + } else { + return data[Math.floor(data.length / 2)]; + } +} + + +/** + * Computes standard deviation of a number array and returns the value. + * + * @param {BigNumber[]} data + * @returns {BigNumber} + */ +export function stdDev(data) { + if (data.length > 0) { + const avg = mean(data); + let devSum = new BigNumber(0); + data.map((datum) => { + devSum = devSum.plus(datum.minus(avg).pow(2)); + }); + return devSum.div(data.length).sqrt(); + } +} diff --git a/src/core/operations/Divide.mjs b/src/core/operations/Divide.mjs index e3402b2a..66463274 100644 --- a/src/core/operations/Divide.mjs +++ b/src/core/operations/Divide.mjs @@ -5,9 +5,11 @@ * @license Apache-2.0 */ -import Operation from "../Operation"; -import Arithmetic from "../lib/Arithmetic"; import BigNumber from "bignumber.js"; +import Operation from "../Operation"; +import { div, createNumArray } from "../lib/Arithmetic"; +import { DELIM_OPTIONS } from "../lib/Delim"; + /** * Divide operation @@ -29,7 +31,7 @@ class Divide extends Operation { { "name": "Delimiter", "type": "option", - "value": Arithmetic.DELIM_OPTIONS, + "value": DELIM_OPTIONS, } ]; } @@ -40,7 +42,7 @@ class Divide extends Operation { * @returns {BigNumber} */ run(input, args) { - const val = Arithmetic._div(Arithmetic._createNumArray(input, args[0])); + const val = div(createNumArray(input, args[0])); return val instanceof BigNumber ? val : new BigNumber(NaN); } diff --git a/src/core/operations/Mean.mjs b/src/core/operations/Mean.mjs index b3384585..2bd5f3bc 100644 --- a/src/core/operations/Mean.mjs +++ b/src/core/operations/Mean.mjs @@ -6,7 +6,8 @@ */ import Operation from "../Operation"; -import Arithmetic from "../lib/Arithmetic"; +import { mean, createNumArray } from "../lib/Arithmetic"; +import { DELIM_OPTIONS } from "../lib/Delim"; import BigNumber from "bignumber.js"; /** @@ -29,7 +30,7 @@ class Mean extends Operation { { "name": "Delimiter", "type": "option", - "value": Arithmetic.DELIM_OPTIONS, + "value": DELIM_OPTIONS, } ]; } @@ -40,7 +41,7 @@ class Mean extends Operation { * @returns {BigNumber} */ run(input, args) { - const val = Arithmetic._mean(Arithmetic._createNumArray(input, args[0])); + const val = mean(createNumArray(input, args[0])); return val instanceof BigNumber ? val : new BigNumber(NaN); } diff --git a/src/core/operations/Median.mjs b/src/core/operations/Median.mjs index 51e0e248..df2b8418 100644 --- a/src/core/operations/Median.mjs +++ b/src/core/operations/Median.mjs @@ -5,9 +5,10 @@ * @license Apache-2.0 */ -import Operation from "../Operation"; -import Arithmetic from "../lib/Arithmetic"; import BigNumber from "bignumber.js"; +import Operation from "../Operation"; +import { median, createNumArray } from "../lib/Arithmetic"; +import { DELIM_OPTIONS } from "../lib/Delim"; /** * Median operation @@ -29,7 +30,7 @@ class Median extends Operation { { "name": "Delimiter", "type": "option", - "value": Arithmetic.DELIM_OPTIONS, + "value": DELIM_OPTIONS, } ]; } @@ -40,7 +41,7 @@ class Median extends Operation { * @returns {BigNumber} */ run(input, args) { - const val = Arithmetic._median(Arithmetic._createNumArray(input, args[0])); + const val = median(createNumArray(input, args[0])); return val instanceof BigNumber ? val : new BigNumber(NaN); } diff --git a/src/core/operations/Multiply.mjs b/src/core/operations/Multiply.mjs index f903010a..6312cf2b 100644 --- a/src/core/operations/Multiply.mjs +++ b/src/core/operations/Multiply.mjs @@ -5,9 +5,11 @@ * @license Apache-2.0 */ -import Operation from "../Operation"; -import Arithmetic from "../lib/Arithmetic"; import BigNumber from "bignumber.js"; +import Operation from "../Operation"; +import { multi, createNumArray } from "../lib/Arithmetic"; +import { DELIM_OPTIONS } from "../lib/Delim"; + /** * Multiply operation @@ -29,7 +31,7 @@ class Multiply extends Operation { { "name": "Delimiter", "type": "option", - "value": Arithmetic.DELIM_OPTIONS, + "value": DELIM_OPTIONS, } ]; } @@ -40,7 +42,7 @@ class Multiply extends Operation { * @returns {BigNumber} */ run(input, args) { - const val = Arithmetic._multi(Arithmetic._createNumArray(input, args[0])); + const val = multi(createNumArray(input, args[0])); return val instanceof BigNumber ? val : new BigNumber(NaN); } diff --git a/src/core/operations/StandardDeviation.mjs b/src/core/operations/StandardDeviation.mjs index 0357f4e9..65bd2e1b 100644 --- a/src/core/operations/StandardDeviation.mjs +++ b/src/core/operations/StandardDeviation.mjs @@ -5,9 +5,11 @@ * @license Apache-2.0 */ -import Operation from "../Operation"; -import Arithmetic from "../lib/Arithmetic"; import BigNumber from "bignumber.js"; +import Operation from "../Operation"; +import { stdDev, createNumArray } from "../lib/Arithmetic"; +import { DELIM_OPTIONS } from "../lib/Delim"; + /** * Standard Deviation operation @@ -29,7 +31,7 @@ class StandardDeviation extends Operation { { "name": "Delimiter", "type": "option", - "value": Arithmetic.DELIM_OPTIONS, + "value": DELIM_OPTIONS, } ]; } @@ -40,7 +42,7 @@ class StandardDeviation extends Operation { * @returns {BigNumber} */ run(input, args) { - const val = Arithmetic._stdDev(Arithmetic._createNumArray(input, args[0])); + const val = stdDev(createNumArray(input, args[0])); return val instanceof BigNumber ? val : new BigNumber(NaN); } diff --git a/src/core/operations/Subtract.mjs b/src/core/operations/Subtract.mjs index e6ac32ac..c45a93b2 100644 --- a/src/core/operations/Subtract.mjs +++ b/src/core/operations/Subtract.mjs @@ -5,9 +5,11 @@ * @license Apache-2.0 */ -import Operation from "../Operation"; -import Arithmetic from "../lib/Arithmetic"; import BigNumber from "bignumber.js"; +import Operation from "../Operation"; +import { sub, createNumArray } from "../lib/Arithmetic"; +import { DELIM_OPTIONS } from "../lib/Delim"; + /** * Subtract operation @@ -29,7 +31,7 @@ class Subtract extends Operation { { "name": "Delimiter", "type": "option", - "value": Arithmetic.DELIM_OPTIONS, + "value": DELIM_OPTIONS, } ]; } @@ -40,7 +42,7 @@ class Subtract extends Operation { * @returns {BigNumber} */ run(input, args) { - const val = Arithmetic._sub(Arithmetic._createNumArray(input, args[0])); + const val = sub(createNumArray(input, args[0])); return val instanceof BigNumber ? val : new BigNumber(NaN); } diff --git a/src/core/operations/Sum.mjs b/src/core/operations/Sum.mjs index a79a8d7f..a1a0fa83 100644 --- a/src/core/operations/Sum.mjs +++ b/src/core/operations/Sum.mjs @@ -4,9 +4,11 @@ * @license Apache-2.0 */ -import Operation from "../Operation"; -import Arithmetic from "../lib/Arithmetic"; import BigNumber from "bignumber.js"; +import Operation from "../Operation"; +import { sum, createNumArray } from "../lib/Arithmetic"; +import { DELIM_OPTIONS } from "../lib/Delim"; + /** * Sum operation @@ -28,7 +30,7 @@ class Sum extends Operation { { "name": "Delimiter", "type": "option", - "value": Arithmetic.DELIM_OPTIONS, + "value": DELIM_OPTIONS, } ]; } @@ -39,7 +41,7 @@ class Sum extends Operation { * @returns {BigNumber} */ run(input, args) { - const val = Arithmetic._sum(Arithmetic._createNumArray(input, args[0])); + const val = sum(createNumArray(input, args[0])); return val instanceof BigNumber ? val : new BigNumber(NaN); }