Merge branch 'master' of github.com:poolifier/poolifier
[poolifier.git] / src / utils.ts
index efd1f124084776667bd60495f202cec32c7e04a9..77f889c9b417ad008b0352b8c2e1779788ceb6d9 100644 (file)
@@ -44,6 +44,7 @@ export const DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS: MeasurementStatisticsR
  * Always returns a value greater than zero.
  *
  * @returns The host OS optimized maximum pool size.
+ * @internal
  */
 export const availableParallelism = (): number => {
   let availableParallelism = 1
@@ -64,6 +65,7 @@ export const availableParallelism = (): number => {
 //  * @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,
@@ -79,6 +81,7 @@ export const availableParallelism = (): number => {
  *
  * @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) {
@@ -127,6 +130,7 @@ export const isPlainObject = (obj: unknown): boolean =>
  * @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,
@@ -154,6 +158,7 @@ export const isAsyncFunction = (
  * @param measurementRequirements - The measurement statistics requirements.
  * @param measurementValue - The measurement value.
  * @param numberOfMeasurements - The number of measurements.
+ * @internal
  */
 export const updateMeasurementStatistics = (
   measurementStatistics: MeasurementStatistics,
@@ -182,3 +187,27 @@ export const updateMeasurementStatistics = (
     }
   }
 }
+
+/**
+ * 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
+    }
+  }
+}