@princedev/calculate
Version:
Fast, lightweight, and extinsible mathematical and statistical functions.
648 lines (585 loc) • 14.1 kB
JavaScript
/**
* @name leastArguments
*
* @description - Throws error when number of arguments recieved did not meet expected minimum.
*
* @param {number} required required number of arguments.
* @param {Array<any>} argument arguments received.
*/
function leastArguments(required, argument) {
if (argument.length < required) {
throw new TypeError(required + " argument" + (required > 1 ? 's' : '') + " required, but only " + argument.length + " is present");
}
}
/**
* @name sum
* @summary Returns the sum.
*
* @description Adds given numbers from left to right.
*
* @example
* // Normal usage
* let return sum(10,20,30);
* // => 60
*
* // Using an array
* let return sum(...[10,20,30]);
* // => 60
*
* @param {Array<number>} args numbers to be added.
* @returns {number} the resulting sum.
*
* @function pure
*/
function sum() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(2, arguments);
return args.reduce(function (a, b) {
return a + b;
});
}
/**
* @name difference
* @summary Returns the difference.
*
* @description Subtracts given numbers from left to right.
*
* @example
* // Normal usage
* let result = difference(120,200,-40);
* // => -40
*
* // Using an array
* let result = difference(...[120,200,-40]);
* // => -40
*
* @param {Array<number>} args numbers to be subtracted.
* @returns {number} the resulting difference.
*
* @function pure
*/
function difference() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(2, arguments);
return args.reduce(function (a, b) {
return a - b;
});
}
/**
* @name product
* @summary Returns the product.
*
* @description Multiplies given numbers from left to right.
*
* @example
* // Normal usage
* let result = product(-2,-4,6);
* // => 48
*
* // Using an array
* let result = product(...[-2,-4,6]);
* // => 48
*
* @param {Array<number>} args numbers to be multiplied.
* @returns {number} the resulting product.
*
* @function pure
*/
function product() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(2, arguments);
return args.reduce(function (a, b) {
return a * b;
});
}
/**
* @name quotient
* @summary Returns the quotient.
*
* @description Divides given numbers from left to right.
*
* @example
* // Normal usage
* let result = quotient(8,4,2);
* // => 1
*
* // Using an array
* let result = quotient(...[8,4,2]);
* // => 1
*
* @param {Array<number>} args numbers to be divided
* @returns {number} the resulting quotient.
*
* @function pure
*/
function quotient() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(2, arguments);
return args.reduce(function (a, b) {
return a / b;
});
}
/**
* @name remainder
* @summary Returns the remainder.
*
* @description Divides given numbers from left to right and gets its remainder.
*
* @example
* // Normal usage
* let result = remainder(8,4,2);
* // => 0
*
* // Using an array
* let result = remainder(...[8,4,2]);
* // => 0
*
* @param {Array<number>} args numbers given.
* @returns {number} the resulting remainder.
*
* @function pure
*/
function remainder() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(2, arguments);
return args.reduce(function (a, b) {
return a % b;
});
}
/**
* @name exactArguments
*
* @description - Throws error when number of arguments recieved did not meet exact number.
*
* @param {number} required required number of arguments.
* @param {Array<any>} argument arguments received.
*/
function exactArguments(required, argument) {
if (argument.length !== required) {
throw new TypeError(required + " argument" + (required > 1 ? 's' : '') + " required, but " + argument.length + " is present");
}
}
/**
* @name sqaureRoot
* @summary Returns the sqaure root of a number.
*
* @description Returns the sqaure root of a number.
*
* @example
* // Normal usage
* let result = sqaureRoot(16);
* // => 4
*
* @param {numberr} a number to be solved.
* @returns {number}
*
* @function pure
*/
function sqaureRoot(a) {
exactArguments(1, arguments);
return Math.pow(a, 0.5);
}
/**
* @name square
* @summary Returns the square of a number.
*
* @description Returns the square of a number.
*
* @example
* // Normal usage
* let result = sqaure(4);
* // => 16
*
* @param {numberr} a number to be squared.
* @returns {number}
*
* @function pure
*/
function square(a) {
exactArguments(1, arguments);
return Math.pow(a, 2);
}
/**
* @name cube
* @summary Returns the cube of a number.
*
* @description Returns the cube of a number.
*
* @example
* // Normal usage
* let result = cube(2);
* // => 8
*
* @param {numberr} a - number to be cubed.
* @returns {number}
*
* @function pure
*/
function cube(a) {
exactArguments(1, arguments);
return Math.pow(a, 3);
}
/**
* @name power
* @summary Returns the power.
*
* @description Returns the power of given base (left most) raise to its succeeding numbers.
*
* @example
* // Normal usage
* let result = power(2,5,2); // the same as ((2)^5)^2
* // => 1024
*
* @param {Array<number>} args given numbers.
* @returns {number} the power
*
* @function pure
*/
function power() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(2, arguments);
return args.reduce(function (a, b) {
return Math.pow(a, b);
});
}
/**
* @name factorial
* @summary Returns the factorial of a number.
*
* @description Returns the factorial of a number.
*
* @example
* // Normal usage
* let result = factorial(4);
* // => 24
*
* @param {numberr} a numbers given.
* @returns {number}
*
* @function pure
*/
function factorial(a) {
exactArguments(1, arguments);
return factorialStep(a);
}
function factorialStep(a) {
if (a === 1 || a === 0) {
return 1;
}
return a * factorialStep(a - 1);
}
/**
* @name negate
* @summary Returns the negated value.
*
* @description Returns a same number with an opposite sign.
*
* @example
* // Normal usage
* let result = negate(2);
* // => -2
*
* let result = negate(-4);
* // => 4
*
* @param {number} a given number.
* @returns {number} the negated value
*
* @function pure
*/
function negate(a) {
exactArguments(1, arguments);
return -a;
}
/**
* @name absolute
* @summary Returns the absolute number.
*
* @description Returns the absolute number.
*
* @example
* // Normal usage
* let result = absolute(-6);
* // => 6;
*
* @param {number} arg number given.
* @returns {number} absolute number of given.
*
* @function pure
*/
function min(x) {
exactArguments(1, arguments);
return Math.abs(x);
}
/**
* @name notAllowed
*
* @description - Throws error when number of arguments recieved did not meet expected minimum.
*
* @param {{ [key: string]: number }} variable variable to be compared.
* @param {number} value value which the variable must not equal to.
*/
function notAllowed(variable, value) {
if (Object.values(variable)[0] === value) {
throw new TypeError(Object.keys(variable)[0] + " must not be equal to " + value);
}
}
/**
* @name quadratic
* @summary Returns the root.
*
* @description Returns the first and second root of a quadratice equation
*
* @example
* // Normal usage
* let result = root(4,4,1);
* // => {firstRoot: -0.5, secondRoot: -0.5}
*
* @param {number} a
* @param {number} b
* @param {number} c
* @returns {IRoot} the resulting root.
*
* @function pure
*/
function quadratic(a, b, c) {
exactArguments(3, arguments);
notAllowed({
a: a
}, 0);
var bSquared = b * b;
var fourAC = 4 * a * c;
var twiceA = a * 2;
var rSquareRoot = sqaureRoot(bSquared - fourAC);
return {
firstRoot: (-b + rSquareRoot) / twiceA,
secondRoot: (-b - rSquareRoot) / twiceA
};
}
/**
* @name mean
* @summary Returns the mean (average).
*
* @description Adds given numbers from left to right and divides the sum by the amount of the numbers.
*
* @example
* // Normal usage
* let result = mean(10,20,30);
* // => 30
*
* // Using an array
* let result = mean(...[10,20,30]);
* // => 30
*
* @param {Array<number>} args numbers to be averaged..
* @returns {number} the resulting mean.
*
* @function pure
*/
function mean() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(2, arguments);
return sum.apply(void 0, args) / arguments.length;
}
/**
* @name immutableSort
*
* @description - Accepts an array and returns a new array that is sorted. (numbers only)
*
* @param {Array<number>} required array to be sorted.
* @param {Array<number>} argument new sorted array.
*/
function immutableSort(arr) {
return [].concat(arr).sort(function (a, b) {
return a - b;
});
}
/**
* @name median
* @summary Returns the median.
*
* @description Arranges the numbers in order and gets the number halfway the list.
*
* @example
* // Normal usage
* let result = median(21,4,8,6);
* // => 7
*
* // Using an array
* let result = median(...[21,4,8,6]);
* // => 7
*
* @param {Array<number>} args given numbers.
* @returns {number} the resulting median.
*
* @function pure
*/
function median() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var sortedArr = immutableSort(args);
var length = sortedArr.length;
if (length % 2 === 0) {
var halfLength = length / 2;
return (sortedArr[halfLength - 1] + sortedArr[halfLength]) / 2;
}
return sortedArr[(length - 1) / 2];
}
/**
* @name mode
* @summary Returns the mode.
*
* @description Returns the highest occuring number/s in a given numbers.
*
* @example
* // Normal usage
* let result = mode(2, 1, 8, 3, 2, 7, 4, 2, 6, 8);
* // => [2]
*
* // Using an array
* let result = mode(...[2, 1, 8, 3, 2, 7, 4, 2, 6, 8]);
* // => [2]
*
* @param {Array<number>} args given numbers.
* @returns {Array<number>} the resulting mode.
*
* @function pure
*/
function mode() {
var count = {};
var result = [];
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
args.forEach(function (num) {
if (!count[num]) {
count[num] = 1;
return;
}
count[num] += 1;
});
var highest = Math.max.apply(null, Object.values(count));
Object.entries(count).forEach(function (_ref) {
var key = _ref[0],
value = _ref[1];
if (value === highest) {
result.push(parseInt(key, 10));
}
});
return result;
}
/**
* @name range
* @summary Returns the range
*
* @description Returns the difference of the highest and lowest number in the given numbers
*
* @example
* // Normal usage
* let result = range(10,20,30);
* // => 20
* // Using an array
* let result = range(...[10,20,30]);
* // => 20
*
* @param {Array<number>} args given numbers
* @returns {number} the resulting range
*
* @function pure
*/
function range() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var sortedArr = immutableSort(args);
var lastIndex = sortedArr.length - 1;
return sortedArr[lastIndex] - sortedArr[0];
}
/**
* @name max
* @summary Returns the largest number.
*
* @description Returns the largest number.
*
* @example
* // Normal usage
* let result = max(2,4,6);
* // => 6;
*
* @param {number} args numbers given.
* @returns {number} largest number
*
* @function pure
*/
function max() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(1, arguments);
var sortedArray = immutableSort(args);
return sortedArray[sortedArray.length - 1];
}
/**
* @name min
* @summary Returns the smallest number.
*
* @description Returns the smallest number.
*
* @example
* // Normal usage
* let result = min(2,4,6);
* // => 2;
*
* @param {number} args numbers given.
* @returns {number} smallest number
*
* @function pure
*/
function min$1() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
leastArguments(1, arguments);
var sortedArray = immutableSort(args);
return sortedArray[0];
}
/**
* @name distance
* @summary Returns the distance between two points.
*
* @description Returns the distance between two points in a cartesian plane.
*
* @example
* // Normal usage
* let result = distance(2,4,6,8);
* // => 2.8284271247461903
*
* @param {number} x1
* @param {number} x2
* @param {number} y1
* * @param {number} y2
* @returns {number} the resulting distance.
*
* @function pure
*/
function distance(x1, x2, y1, y2) {
exactArguments(4, arguments);
return sqaureRoot(square(x1 - x2) + square(y1 - y2));
}
export { min as absolute, cube, difference, distance, factorial, max, mean, median, min$1 as min, mode, negate, power, product, quadratic, quotient, range, remainder, square, sqaureRoot as squareRoot, sum };
//# sourceMappingURL=calculate.esm.js.map