X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Futils.ts;h=a0a9e530131cbe78df7401dff80452eef16e8634;hb=d91689fda0fa7a85014ac25276cf2cf0a9d81ce2;hp=400a92b14a7f42e8518878af1744623c8f6c2290;hpb=041dc05b2a95b36db72525072ba54c4c58ffcf0e;p=poolifier.git diff --git a/src/utils.ts b/src/utils.ts index 400a92b1..a0a9e530 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -7,12 +7,7 @@ import type { WorkerChoiceStrategyOptions } from './pools/selection-strategies/selection-strategies-types' import type { KillBehavior } from './worker/worker-options' -import { - type IWorker, - type MeasurementStatistics, - type WorkerType, - WorkerTypes -} from './pools/worker' +import { type IWorker, type WorkerType, WorkerTypes } from './pools/worker' /** * Default task name. @@ -224,50 +219,6 @@ export const isAsyncFunction = ( return typeof fn === 'function' && fn.constructor.name === 'AsyncFunction' } -/** - * Updates the given measurement statistics. - * - * @param measurementStatistics - The measurement statistics to update. - * @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 -): void => { - if (measurementRequirements.aggregate) { - measurementStatistics.aggregate = - (measurementStatistics.aggregate ?? 0) + measurementValue - measurementStatistics.minimum = min( - measurementValue, - measurementStatistics.minimum ?? Infinity - ) - measurementStatistics.maximum = max( - measurementValue, - measurementStatistics.maximum ?? -Infinity - ) - if ( - (measurementRequirements.average || measurementRequirements.median) && - measurementValue != null - ) { - measurementStatistics.history.push(measurementValue) - if (measurementRequirements.average) { - measurementStatistics.average = average(measurementStatistics.history) - } else if (measurementStatistics.average != null) { - delete measurementStatistics.average - } - if (measurementRequirements.median) { - measurementStatistics.median = median(measurementStatistics.history) - } else if (measurementStatistics.median != null) { - delete measurementStatistics.median - } - } - } -} - /** * Generates a cryptographically secure random number in the [0,1[ range * @@ -299,3 +250,27 @@ export const min = (...args: number[]): number => */ export const max = (...args: number[]): number => args.reduce((maximum, num) => (maximum > num ? maximum : num), -Infinity) + +/** + * Wraps a function so that it can only be called once. + * + * @param fn - The function to wrap. + * @param context - The context to bind the function to. + * @returns The wrapped function. + * @internal + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const once = ( + fn: (...args: A) => R, + context: T +): ((...args: A) => R) => { + let result: R + return (...args: A) => { + if (fn != null) { + result = fn.apply(context, args) + ;(fn as unknown as undefined) = (context as unknown as undefined) = + undefined + } + return result + } +}