refactor: remove unneeded intermediate variable
[poolifier.git] / src / pools / selection-strategies / less-recently-used-worker-choice-strategy.ts
1 import type { IPoolWorker } from '../pool-worker'
2 import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy'
3
4 /**
5 * Selects the less recently used worker.
6 *
7 * @typeParam Worker - Type of worker which manages the strategy.
8 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
9 * @typeParam Response - Type of response of execution. This can only be serializable data.
10 */
11 export class LessRecentlyUsedWorkerChoiceStrategy<
12 Worker extends IPoolWorker,
13 Data,
14 Response
15 > extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
16 /** {@inheritDoc} */
17 public reset (): boolean {
18 return true
19 }
20
21 /** {@inheritDoc} */
22 public choose (): Worker {
23 let minNumberOfTasks = Infinity
24 // A worker is always found because it picks the one with fewer tasks
25 let lessRecentlyUsedWorker!: Worker
26 for (const value of this.pool.workers.values()) {
27 const worker = value.worker
28 const tasksUsage = this.pool.getWorkerTasksUsage(worker)
29 const workerTasks =
30 (tasksUsage?.run as number) + (tasksUsage?.running as number)
31 if (!this.isDynamicPool && workerTasks === 0) {
32 return worker
33 } else if (workerTasks < minNumberOfTasks) {
34 minNumberOfTasks = workerTasks
35 lessRecentlyUsedWorker = worker
36 }
37 }
38 return lessRecentlyUsedWorker
39 }
40 }