perf: use a single map to store pool workers and their related data
[poolifier.git] / src / pools / selection-strategies / round-robin-worker-choice-strategy.ts
1 import type { IPoolWorker } from '../pool-worker'
2 import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy'
3
4 /**
5 * Selects the next worker in a round robin fashion.
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 RoundRobinWorkerChoiceStrategy<
12 Worker extends IPoolWorker,
13 Data,
14 Response
15 > extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
16 /**
17 * Id of the next worker.
18 */
19 private nextWorkerId: number = 0
20
21 /** {@inheritDoc} */
22 public reset (): boolean {
23 this.nextWorkerId = 0
24 return true
25 }
26
27 /** {@inheritDoc} */
28 public choose (): Worker {
29 const chosenWorker = this.pool.workers.get(this.nextWorkerId)
30 ?.worker as Worker
31 this.nextWorkerId =
32 this.nextWorkerId === this.pool.workers.size - 1
33 ? 0
34 : this.nextWorkerId + 1
35 return chosenWorker
36 }
37 }