All files / src/ISafeNumber ISafeNumberMath.ts

100% Statements 27/27
100% Branches 7/7
100% Functions 6/6
100% Lines 22/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46  6x   6x 4019x   6x 6x 1x   5x   5x     6x       6x   6x 1x     5x   5x     6x 12x 2x     46x   10x   10x 4x   6x      
import { ISafeNumber, NumberArg } from "./ISafeNumber";
import { SafeZero, createSafeNumber } from "./ISafeNumberFactory";
 
export const calculateSum = (numbers: NumberArg[]) =>
  numbers.reduce<ISafeNumber>((prev, curr) => prev.add(curr), SafeZero);
 
export const calculateAverageValue = (numbers: NumberArg[]): ISafeNumber => {
  if (numbers.length === 0) {
    throw new Error("Can not calculate an average value for an empty array");
  }
  const result = calculateSum(numbers).div(numbers.length);
 
  return result;
};
 
export const calculateDeviationPercent = (args: {
  baseValue: ISafeNumber;
  deviatedValue: ISafeNumber;
}) => {
  const { baseValue, deviatedValue } = args;
 
  if (baseValue.eq(0)) {
    return createSafeNumber(Number.MAX_SAFE_INTEGER);
  }
 
  const result = deviatedValue.sub(baseValue).div(baseValue).abs().mul(100);
 
  return result;
};
 
export function getMedian(numbers: ISafeNumber[]): ISafeNumber {
  if (numbers.length === 0) {
    throw new Error("Cannot get median value of an empty array");
  }
 
  numbers = numbers.sort((a, b) => (a.lt(b) ? -1 : 1));
 
  const middle = Math.floor(numbers.length / 2);
 
  if (numbers.length % 2 === 0) {
    return numbers[middle].add(numbers[middle - 1]).div(2);
  } else {
    return numbers[middle];
  }
}