X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Futils.ts;h=b36eba273510160016c6308e71aa11cc4b818af3;hb=3b594fe1b0f89d6665da2eb2ebdc14eb7628fe70;hp=88562ca3531f9acbb446414075366a4b50ba1ce4;hpb=b3543488a1e708d0f39122ea01434ef620044a41;p=poolifier.git diff --git a/src/utils.ts b/src/utils.ts index 88562ca3..b36eba27 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,8 @@ import { getRandomValues } from 'node:crypto' import * as os from 'node:os' +import type { TaskFunctionProperties } from './utility-types.js' +import type { TaskFunctionObject } from './worker/task-functions.js' import type { KillBehavior } from './worker/worker-options.js' /** @@ -18,7 +20,6 @@ export const EMPTY_FUNCTION: () => void = Object.freeze(() => { /** * Returns safe host OS optimized estimate of the default amount of parallelism a pool should use. * Always returns a value greater than zero. - * * @returns The host OS optimized maximum pool size. */ export const availableParallelism = (): number => { @@ -36,7 +37,6 @@ export const availableParallelism = (): number => { /** * Sleeps for the given amount of milliseconds. - * * @param ms - The amount of milliseconds to sleep. * @returns A promise that resolves after the given amount of milliseconds. * @internal @@ -49,7 +49,6 @@ export const sleep = async (ms: number): Promise => { /** * Computes the retry delay in milliseconds using an exponential back off algorithm. - * * @param retryNumber - The number of retries that have already been attempted * @param delayFactor - The base delay factor in milliseconds * @returns Delay in milliseconds @@ -66,7 +65,6 @@ export const exponentialDelay = ( /** * Computes the average of the given data set. - * * @param dataSet - Data set. * @returns The average of the given data set. * @internal @@ -85,7 +83,6 @@ export const average = (dataSet: number[]): number => { /** * Computes the median of the given data set. - * * @param dataSet - Data set. * @returns The median of the given data set. * @internal @@ -107,7 +104,6 @@ export const median = (dataSet: number[]): number => { /** * Rounds the given number to the given scale. * The rounding is done using the "round half away from zero" method. - * * @param num - The number to round. * @param scale - The scale to round to. * @returns The rounded number. @@ -120,7 +116,6 @@ export const round = (num: number, scale = 2): number => { /** * Is the given value a plain object? - * * @param value - The value to check. * @returns `true` if the given value is a plain object, `false` otherwise. * @internal @@ -133,7 +128,6 @@ export const isPlainObject = (value: unknown): value is object => /** * Detects whether the given value is a kill behavior or not. - * * @typeParam KB - Which specific KillBehavior type to test against. * @param killBehavior - Which kind of kill behavior to detect. * @param value - Unknown value. @@ -149,7 +143,6 @@ export const isKillBehavior = ( /** * Detects whether the given value is an asynchronous function or not. - * * @param fn - Unknown value. * @returns `true` if `fn` was an asynchronous function, otherwise `false`. * @internal @@ -162,7 +155,6 @@ export const isAsyncFunction = ( /** * Generates a cryptographically secure random number in the [0,1[ range - * * @returns A number in the [0,1[ range * @internal */ @@ -172,47 +164,68 @@ export const secureRandom = (): number => { /** * Returns the minimum of the given numbers. - * If no numbers are given, `Infinity` is returned. - * + * If no numbers are given, `Number.POSITIVE_INFINITY` is returned. * @param args - The numbers to get the minimum of. * @returns The minimum of the given numbers. * @internal */ export const min = (...args: number[]): number => - args.reduce((minimum, num) => (minimum < num ? minimum : num), Infinity) + args.reduce( + (minimum, num) => (minimum < num ? minimum : num), + Number.POSITIVE_INFINITY + ) /** * Returns the maximum of the given numbers. - * If no numbers are given, `-Infinity` is returned. - * + * If no numbers are given, `Number.NEGATIVE_INFINITY` is returned. * @param args - The numbers to get the maximum of. * @returns The maximum of the given numbers. * @internal */ export const max = (...args: number[]): number => - args.reduce((maximum, num) => (maximum > num ? maximum : num), -Infinity) + args.reduce( + (maximum, num) => (maximum > num ? maximum : num), + Number.NEGATIVE_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. + * @typeParam A - The function's arguments. + * @typeParam R - The function's return value. + * @typeParam C - The function's context. * @internal */ // eslint-disable-next-line @typescript-eslint/no-explicit-any -export const once = ( +export const once = >( fn: (...args: A) => R, - context: T + context: C ): ((...args: A) => R) => { let result: R return (...args: A) => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (fn != null) { - result = fn.apply(context, args) + result = fn.apply(context, args) ;(fn as unknown as undefined) = (context as unknown as undefined) = undefined } return result } } + +export const buildTaskFunctionProperties = ( + name: string, + taskFunctionObject: TaskFunctionObject | undefined +): TaskFunctionProperties => { + return { + name, + ...(taskFunctionObject?.priority != null && { + priority: taskFunctionObject.priority, + }), + ...(taskFunctionObject?.strategy != null && { + strategy: taskFunctionObject.strategy, + }), + } +}