refactor: use more ramdba helpers
authorJérôme Benoit <jerome.benoit@sap.com>
Wed, 13 Mar 2024 16:35:16 +0000 (17:35 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Wed, 13 Mar 2024 16:35:16 +0000 (17:35 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/performance/PerformanceStatistics.ts
src/utils/StatisticUtils.ts
src/utils/Utils.ts
src/utils/index.ts
tests/utils/StatisticUtils.test.ts
tests/utils/Utils.test.ts

index 59d697d1ec76559d36c175f68256da4ebe5d9d18..6363be1c6b2196842b49dc1140ca9887d5b4b385 100644 (file)
@@ -5,6 +5,7 @@ import type { URL } from 'node:url'
 import { parentPort } from 'node:worker_threads'
 
 import { secondsToMilliseconds } from 'date-fns'
+import { mean, median } from 'rambda'
 
 import { BaseError } from '../exception/index.js'
 import {
@@ -20,7 +21,6 @@ import {
   type TimestampedData
 } from '../types/index.js'
 import {
-  average,
   buildPerformanceStatisticsMessage,
   CircularArray,
   Configuration,
@@ -32,7 +32,6 @@ import {
   logger,
   logPrefix,
   max,
-  median,
   min,
   nthPercentile,
   stdDeviation
@@ -293,8 +292,7 @@ export class PerformanceStatistics {
       this.statistics.statisticsData.get(entry.name)!.measurementTimeSeries!
     )
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    this.statistics.statisticsData.get(entry.name)!.avgTimeMeasurement =
-      average(timeMeasurementValues)
+    this.statistics.statisticsData.get(entry.name)!.avgTimeMeasurement = mean(timeMeasurementValues)
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
     this.statistics.statisticsData.get(entry.name)!.medTimeMeasurement =
       median(timeMeasurementValues)
index 9ca4398ca76590250de3b1c5a935f42ca373cd6f..4125ab06a9598dd7d6dd7812dbb0539ecc20ba69 100644 (file)
@@ -1,37 +1,10 @@
-/**
- * Computes the average of the given data set.
- *
- * @param dataSet - Data set.
- * @returns The average of the given data set.
- * @internal
- */
-export const average = (dataSet: number[]): number => {
-  if (Array.isArray(dataSet) && dataSet.length === 0) {
-    return 0
-  } else if (Array.isArray(dataSet) && dataSet.length === 1) {
-    return dataSet[0]
-  }
-  return dataSet.reduce((accumulator, nb) => accumulator + nb, 0) / dataSet.length
-}
+import { mean } from 'rambda'
 
-/**
- * Computes the median of the given data set.
- *
- * @param dataSet - Data set.
- * @returns The median of the given data set.
- * @internal
- */
-export const median = (dataSet: number[]): number => {
-  if (Array.isArray(dataSet) && dataSet.length === 0) {
-    return 0
-  } else if (Array.isArray(dataSet) && dataSet.length === 1) {
-    return dataSet[0]
-  }
-  const sortedDataSet = dataSet.slice().sort((a, b) => a - b)
-  return (
-    (sortedDataSet[(sortedDataSet.length - 1) >> 1] + sortedDataSet[sortedDataSet.length >> 1]) / 2
-  )
-}
+export const min = (...args: number[]): number =>
+  args.reduce((minimum, num) => (minimum < num ? minimum : num), Infinity)
+
+export const max = (...args: number[]): number =>
+  args.reduce((maximum, num) => (maximum > num ? maximum : num), -Infinity)
 
 // TODO: use order statistics tree https://en.wikipedia.org/wiki/Order_statistic_tree
 export const nthPercentile = (dataSet: number[], percentile: number): number => {
@@ -70,10 +43,7 @@ export const nthPercentile = (dataSet: number[], percentile: number): number =>
  * @see https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation
  * @internal
  */
-export const stdDeviation = (
-  dataSet: number[],
-  dataSetAverage: number = average(dataSet)
-): number => {
+export const stdDeviation = (dataSet: number[], dataSetAverage: number = mean(dataSet)): number => {
   if (Array.isArray(dataSet) && (dataSet.length === 0 || dataSet.length === 1)) {
     return 0
   }
index fc3cf9a9cb55fba343d3739d14fbd2766c456604..51ea3a7e332786f369ea0e37391c14c24d537b93 100644 (file)
@@ -346,12 +346,6 @@ export const isArraySorted = <T>(array: T[], compareFn: (a: T, b: T) => number):
   return true
 }
 
-export const min = (...args: number[]): number =>
-  args.reduce((minimum, num) => (minimum < num ? minimum : num), Infinity)
-
-export const max = (...args: number[]): number =>
-  args.reduce((maximum, num) => (maximum > num ? maximum : num), -Infinity)
-
 export const throwErrorInNextTick = (error: Error): void => {
   nextTick(() => {
     throw error
index 726a69db5985bf8577f9cc79527333008f9ce159..549b83470e47073f845f821f28b7812daadd90fa 100644 (file)
@@ -27,7 +27,7 @@ export {
   buildStoppedMessage,
   buildUpdatedMessage
 } from './MessageChannelUtils.js'
-export { average, median, nthPercentile, stdDeviation } from './StatisticUtils.js'
+export { max, min, nthPercentile, stdDeviation } from './StatisticUtils.js'
 export {
   clone,
   convertToBoolean,
@@ -50,8 +50,6 @@ export {
   isValidDate,
   JSONStringify,
   logPrefix,
-  max,
-  min,
   roundTo,
   secureRandom,
   sleep,
index 78af993ce08cc0b78f92903fe7080acfa551d504..b54cdee86a3d64325117dc59a4e3c6066a3f9c0c 100644 (file)
@@ -2,21 +2,23 @@ import { describe, it } from 'node:test'
 
 import { expect } from 'expect'
 
-import { average, median, nthPercentile, stdDeviation } from '../../src/utils/StatisticUtils.js'
+import { max, min, nthPercentile, stdDeviation } from '../../src/utils/StatisticUtils.js'
 
 await describe('StatisticUtils test suite', async () => {
-  await it('Verify average()', () => {
-    expect(average([])).toBe(0)
-    expect(average([0.08])).toBe(0.08)
-    expect(average([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(3.1642857142857146)
-    expect(average([0.25, 4.75, 3.05, 6.04, 1.01, 2.02])).toBe(2.8533333333333335)
+  await it('Verify min()', () => {
+    expect(min()).toBe(Infinity)
+    expect(min(0, 1)).toBe(0)
+    expect(min(1, 0)).toBe(0)
+    expect(min(0, -1)).toBe(-1)
+    expect(min(-1, 0)).toBe(-1)
   })
 
-  await it('Verify median()', () => {
-    expect(median([])).toBe(0)
-    expect(median([0.08])).toBe(0.08)
-    expect(median([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(3.05)
-    expect(median([0.25, 4.75, 3.05, 6.04, 1.01, 2.02])).toBe(2.535)
+  await it('Verify max()', () => {
+    expect(max()).toBe(-Infinity)
+    expect(max(0, 1)).toBe(1)
+    expect(max(1, 0)).toBe(1)
+    expect(max(0, -1)).toBe(0)
+    expect(max(-1, 0)).toBe(0)
   })
 
   await it('Verify nthPercentile()', () => {
index 630831a8d3e29d52d88cedf204d22789aa61a06b..a86765293d72e64371b9da02cbf8308ee2c5bad1 100644 (file)
@@ -25,8 +25,6 @@ import {
   isNotEmptyString,
   isObject,
   isValidDate,
-  max,
-  min,
   roundTo,
   secureRandom,
   sleep,
@@ -420,20 +418,4 @@ await describe('Utils test suite', async () => {
     expect(isArraySorted<number>([1, 2, 3, 5, 4], (a, b) => a - b)).toBe(false)
     expect(isArraySorted<number>([2, 1, 3, 4, 5], (a, b) => a - b)).toBe(false)
   })
-
-  await it('Verify min()', () => {
-    expect(min()).toBe(Infinity)
-    expect(min(0, 1)).toBe(0)
-    expect(min(1, 0)).toBe(0)
-    expect(min(0, -1)).toBe(-1)
-    expect(min(-1, 0)).toBe(-1)
-  })
-
-  await it('Verify max()', () => {
-    expect(max()).toBe(-Infinity)
-    expect(max(0, 1)).toBe(1)
-    expect(max(1, 0)).toBe(1)
-    expect(max(0, -1)).toBe(0)
-    expect(max(-1, 0)).toBe(0)
-  })
 })