* Always returns a value greater than zero.
*
* @returns The host OS optimized maximum pool size.
+ * @internal
*/
export const availableParallelism = (): number => {
let availableParallelism = 1
return availableParallelism
}
+// /**
+// * Computes the retry delay in milliseconds using an exponential back off algorithm.
+// *
+// * @param retryNumber - The number of retries that have already been attempted
+// * @param maxDelayRatio - The maximum ratio of the delay that can be randomized
+// * @returns Delay in milliseconds
+// * @internal
+// */
+// export const exponentialDelay = (
+// retryNumber = 0,
+// maxDelayRatio = 0.2
+// ): number => {
+// const delay = Math.pow(2, retryNumber) * 100
+// const randomSum = delay * maxDelayRatio * Math.random() // 0-(maxDelayRatio*100)% of the delay
+// return delay + randomSum
+// }
+
/**
- * Computes the retry delay in milliseconds using an exponential back off algorithm.
+ * Computes the average of the given data set.
*
- * @param retryNumber - The number of retries that have already been attempted
- * @param maxDelayRatio - The maximum ratio of the delay that can be randomized
- * @returns Delay in milliseconds
+ * @param dataSet - Data set.
+ * @returns The average of the given data set.
+ * @internal
*/
-export const exponentialDelay = (
- retryNumber = 0,
- maxDelayRatio = 0.2
-): number => {
- const delay = Math.pow(2, retryNumber) * 100
- const randomSum = delay * maxDelayRatio * Math.random() // 0-(maxDelayRatio*100)% of the delay
- return delay + randomSum
+export const average = (dataSet: number[]): number => {
+ if (Array.isArray(dataSet) && dataSet.length === 0) {
+ return 0
+ }
+ if (Array.isArray(dataSet) && dataSet.length === 1) {
+ return dataSet[0]
+ }
+ return (
+ dataSet.reduce((accumulator, number) => accumulator + number, 0) /
+ dataSet.length
+ )
}
/**
*
* @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) {
* @param killBehavior - Which kind of kill behavior to detect.
* @param value - Any value.
* @returns `true` if `value` was strictly equals to `killBehavior`, otherwise `false`.
+ * @internal
*/
export const isKillBehavior = <KB extends KillBehavior>(
killBehavior: KB,
* @param measurementRequirements - The measurement statistics requirements.
* @param measurementValue - The measurement value.
* @param numberOfMeasurements - The number of measurements.
+ * @internal
*/
export const updateMeasurementStatistics = (
measurementStatistics: MeasurementStatistics,
measurementRequirements: MeasurementStatisticsRequirements,
- measurementValue: number,
- numberOfMeasurements: number
+ measurementValue: number
): void => {
if (measurementRequirements.aggregate) {
measurementStatistics.aggregate =
measurementValue,
measurementStatistics.maximum ?? -Infinity
)
- if (measurementRequirements.average && numberOfMeasurements !== 0) {
- measurementStatistics.average =
- measurementStatistics.aggregate / numberOfMeasurements
- }
- if (measurementRequirements.median && measurementValue != null) {
+ if (
+ (measurementRequirements.average || measurementRequirements.median) &&
+ measurementValue != null
+ ) {
measurementStatistics.history.push(measurementValue)
- measurementStatistics.median = median(measurementStatistics.history)
+ if (measurementRequirements.average) {
+ measurementStatistics.average = average(measurementStatistics.history)
+ }
+ if (measurementRequirements.median) {
+ measurementStatistics.median = median(measurementStatistics.history)
+ }
+ }
+ }
+}
+
+/**
+ * Executes a function once at a time.
+ *
+ * @param fn - The function to execute.
+ * @param context - The context to bind the function to.
+ * @returns The function to execute.
+ */
+export const once = (
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ fn: (...args: any[]) => void,
+ context: unknown
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+): ((...args: any[]) => void) => {
+ let called = false
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ return function (...args: any[]): void {
+ if (!called) {
+ called = true
+ fn.apply(context, args)
+ called = false
}
}
}