docs: add changelog entry
[poolifier.git] / src / utils.ts
index f77d84a97e6694d2c22cbdc0dd0a5bb97ab69f89..f38221692c8e76b06a57605f8a9129e198796cec 100644 (file)
@@ -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'
 
 /**
@@ -172,25 +174,31 @@ 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.
@@ -198,21 +206,40 @@ export const max = (...args: number[]): number =>
  * @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 = <T, A extends any[], R>(
+export const once = <A extends any[], R, C extends ThisType<any>>(
   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<T, A, R>(context, args)
+      result = fn.apply<C, A, R>(context, args)
       ;(fn as unknown as undefined) = (context as unknown as undefined) =
         undefined
     }
     return result
   }
 }
+
+export const buildTaskFunctionProperties = <Data, Response>(
+  name: string,
+  taskFunctionObject: TaskFunctionObject<Data, Response> | undefined
+): TaskFunctionProperties => {
+  return {
+    name,
+    ...(taskFunctionObject?.priority != null && {
+      priority: taskFunctionObject.priority
+    }),
+    ...(taskFunctionObject?.strategy != null && {
+      strategy: taskFunctionObject.strategy
+    })
+  }
+}