refactor: use Array.from to build Array() from Map()
[poolifier.git] / src / pools / selection-strategies / worker-choice-strategies-context.ts
index 6b9d726d14b09c7947cc915039b83d712da79a8c..185fed71287e668179e201d7ee79848463fd1d76 100644 (file)
@@ -9,6 +9,8 @@ import type {
 } from './selection-strategies-types.js'
 import { WorkerChoiceStrategies } from './selection-strategies-types.js'
 import {
+  buildWorkerChoiceStrategiesPolicy,
+  buildWorkerChoiceStrategiesTaskStatisticsRequirements,
   getWorkerChoiceStrategiesRetries,
   getWorkerChoiceStrategy
 } from './selection-strategies-utils.js'
@@ -43,6 +45,16 @@ export class WorkerChoiceStrategiesContext<
   IWorkerChoiceStrategy
   >
 
+  /**
+   * The active worker choice strategies in the context policy.
+   */
+  private workerChoiceStrategiesPolicy: StrategyPolicy
+
+  /**
+   * The active worker choice strategies in the context task statistics requirements.
+   */
+  private workerChoiceStrategiesTaskStatisticsRequirements: TaskStatisticsRequirements
+
   /**
    * The maximum number of worker choice strategies execution retries.
    */
@@ -71,6 +83,13 @@ export class WorkerChoiceStrategiesContext<
     for (const workerChoiceStrategy of workerChoiceStrategies) {
       this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts)
     }
+    this.workerChoiceStrategiesPolicy = buildWorkerChoiceStrategiesPolicy(
+      this.workerChoiceStrategies
+    )
+    this.workerChoiceStrategiesTaskStatisticsRequirements =
+      buildWorkerChoiceStrategiesTaskStatisticsRequirements(
+        this.workerChoiceStrategies
+      )
     this.retriesCount = 0
     this.retries = getWorkerChoiceStrategiesRetries<Worker, Data, Response>(
       this.pool,
@@ -79,50 +98,21 @@ export class WorkerChoiceStrategiesContext<
   }
 
   /**
-   * Gets the active worker choice strategies policy in the context.
+   * Gets the active worker choice strategies in the context policy.
    *
    * @returns The strategies policy.
    */
   public getPolicy (): StrategyPolicy {
-    const policies: StrategyPolicy[] = []
-    for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) {
-      policies.push(workerChoiceStrategy.strategyPolicy)
-    }
-    return {
-      dynamicWorkerUsage: policies.some(p => p.dynamicWorkerUsage),
-      dynamicWorkerReady: policies.some(p => p.dynamicWorkerReady)
-    }
+    return this.workerChoiceStrategiesPolicy
   }
 
   /**
    * Gets the active worker choice strategies in the context task statistics requirements.
    *
-   * @returns The task statistics requirements.
+   * @returns The strategies task statistics requirements.
    */
   public getTaskStatisticsRequirements (): TaskStatisticsRequirements {
-    const taskStatisticsRequirements: TaskStatisticsRequirements[] = []
-    for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) {
-      taskStatisticsRequirements.push(
-        workerChoiceStrategy.taskStatisticsRequirements
-      )
-    }
-    return {
-      runTime: {
-        aggregate: taskStatisticsRequirements.some(r => r.runTime.aggregate),
-        average: taskStatisticsRequirements.some(r => r.runTime.average),
-        median: taskStatisticsRequirements.some(r => r.runTime.median)
-      },
-      waitTime: {
-        aggregate: taskStatisticsRequirements.some(r => r.waitTime.aggregate),
-        average: taskStatisticsRequirements.some(r => r.waitTime.average),
-        median: taskStatisticsRequirements.some(r => r.waitTime.median)
-      },
-      elu: {
-        aggregate: taskStatisticsRequirements.some(r => r.elu.aggregate),
-        average: taskStatisticsRequirements.some(r => r.elu.average),
-        median: taskStatisticsRequirements.some(r => r.elu.median)
-      }
-    }
+    return this.workerChoiceStrategiesTaskStatisticsRequirements
   }
 
   /**
@@ -135,8 +125,10 @@ export class WorkerChoiceStrategiesContext<
     workerChoiceStrategy: WorkerChoiceStrategy,
     opts?: WorkerChoiceStrategyOptions
   ): void {
-    this.defaultWorkerChoiceStrategy = workerChoiceStrategy
-    this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts)
+    if (workerChoiceStrategy !== this.defaultWorkerChoiceStrategy) {
+      this.defaultWorkerChoiceStrategy = workerChoiceStrategy
+      this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts)
+    }
   }
 
   /**
@@ -145,15 +137,14 @@ export class WorkerChoiceStrategiesContext<
    * @returns `true` if the update is successful, `false` otherwise.
    */
   public update (workerNodeKey: number): boolean {
-    const res: boolean[] = []
-    for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) {
-      res.push(workerChoiceStrategy.update(workerNodeKey))
-    }
-    return res.every(r => r)
+    return Array.from(
+      this.workerChoiceStrategies,
+      ([_, workerChoiceStrategy]) => workerChoiceStrategy.update(workerNodeKey)
+    ).every(r => r)
   }
 
   /**
-   * Executes the worker choice strategy in the context algorithm.
+   * Executes the given worker choice strategy in the context algorithm.
    *
    * @param workerChoiceStrategy - The worker choice strategy algorithm to execute. @defaultValue this.defaultWorkerChoiceStrategy
    * @returns The key of the worker node.
@@ -203,11 +194,10 @@ export class WorkerChoiceStrategiesContext<
    * @returns `true` if the removal is successful, `false` otherwise.
    */
   public remove (workerNodeKey: number): boolean {
-    const res: boolean[] = []
-    for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) {
-      res.push(workerChoiceStrategy.remove(workerNodeKey))
-    }
-    return res.every(r => r)
+    return Array.from(
+      this.workerChoiceStrategies,
+      ([_, workerChoiceStrategy]) => workerChoiceStrategy.remove(workerNodeKey)
+    ).every(r => r)
   }
 
   /**
@@ -221,6 +211,42 @@ export class WorkerChoiceStrategiesContext<
     }
   }
 
+  /**
+   * Synchronizes the active worker choice strategies in the context with the given worker choice strategies.
+   *
+   * @param workerChoiceStrategies - The worker choice strategies to synchronize.
+   * @param opts - The worker choice strategy options.
+   */
+  public syncWorkerChoiceStrategies (
+    workerChoiceStrategies: Set<WorkerChoiceStrategy>,
+    opts?: WorkerChoiceStrategyOptions
+  ): void {
+    for (const workerChoiceStrategy of this.workerChoiceStrategies.keys()) {
+      if (!workerChoiceStrategies.has(workerChoiceStrategy)) {
+        this.removeWorkerChoiceStrategy(workerChoiceStrategy)
+      }
+    }
+    for (const workerChoiceStrategy of workerChoiceStrategies) {
+      if (!this.workerChoiceStrategies.has(workerChoiceStrategy)) {
+        this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts)
+      }
+    }
+    this.workerChoiceStrategiesPolicy = buildWorkerChoiceStrategiesPolicy(
+      this.workerChoiceStrategies
+    )
+    this.workerChoiceStrategiesTaskStatisticsRequirements =
+      buildWorkerChoiceStrategiesTaskStatisticsRequirements(
+        this.workerChoiceStrategies
+      )
+  }
+
+  /**
+   * Adds a worker choice strategy to the context.
+   *
+   * @param workerChoiceStrategy - The worker choice strategy to add.
+   * @param opts - The worker choice strategy options.
+   * @returns The worker choice strategies.
+   */
   private addWorkerChoiceStrategy (
     workerChoiceStrategy: WorkerChoiceStrategy,
     pool: IPool<Worker, Data, Response>,
@@ -240,9 +266,15 @@ export class WorkerChoiceStrategiesContext<
     return this.workerChoiceStrategies
   }
 
-  // private removeWorkerChoiceStrategy (
-  //   workerChoiceStrategy: WorkerChoiceStrategy
-  // ): boolean {
-  //   return this.workerChoiceStrategies.delete(workerChoiceStrategy)
-  // }
+  /**
+   * Removes a worker choice strategy from the context.
+   *
+   * @param workerChoiceStrategy - The worker choice strategy to remove.
+   * @returns `true` if the worker choice strategy is removed, `false` otherwise.
+   */
+  private removeWorkerChoiceStrategy (
+    workerChoiceStrategy: WorkerChoiceStrategy
+  ): boolean {
+    return this.workerChoiceStrategies.delete(workerChoiceStrategy)
+  }
 }