perf: optimize tasks queuing implementation
[poolifier.git] / src / utility-types.ts
index f13cce6a70d9f60ed7417b9d2a45675c5179fb72..e40d7b52d04c36a5ef657dd366adecf68b38495c 100644 (file)
@@ -206,4 +206,93 @@ export interface PromiseResponseWrapper<Response = unknown> {
   readonly asyncResource?: AsyncResource
 }
 
+/**
+ * Remove readonly modifier from all properties of T.
+ * @typeParam T - Type to remove readonly modifier.
+ * @internal
+ */
 export type Writable<T> = { -readonly [P in keyof T]: T[P] }
+
+/**
+ * Default queue size.
+ * @internal
+ */
+export const defaultQueueSize = 2048
+
+/**
+ * Fixed queue node.
+ * @typeParam T - Type of fixed queue node data.
+ * @internal
+ */
+export interface FixedQueueNode<T> {
+  data: T
+  priority: number
+}
+
+/**
+ * Fixed queue.
+ * @typeParam T - Type of fixed queue data.
+ * @internal
+ */
+export interface IFixedQueue<T> {
+  /** The fixed queue capacity. */
+  readonly capacity: number
+  /** The fixed queue size. */
+  readonly size: number
+  /** The fixed queue node array. */
+  nodeArray: FixedQueueNode<T>[]
+  /**
+   * Checks if the fixed queue is empty.
+   * @returns `true` if the fixed queue is empty, `false` otherwise.
+   */
+  empty(): boolean
+  /**
+   * Checks if the fixed queue is full.
+   * @returns `true` if the fixed queue is full, `false` otherwise.
+   */
+  full(): boolean
+  /**
+   * Enqueue data into the fixed queue.
+   * @param data - Data to enqueue.
+   * @param priority - Priority of the data. Lower values have higher priority.
+   * @returns The new size of the fixed queue.
+   * @throws If the fixed queue is full.
+   */
+  enqueue (data: T, priority?: number): number
+  /**
+   * Gets data from the fixed queue.
+   * @param index - The index of the data to get.
+   * @returns The data at the index or `undefined` if the fixed queue is empty or the index is out of bounds.
+   */
+  get (index: number): T | undefined
+  /**
+   * Dequeue data from the fixed queue.
+   * @returns The dequeued data or `undefined` if the fixed queue is empty.
+   */
+  dequeue (): T | undefined
+  /**
+   * Clears the fixed queue.
+   */
+  clear (): void
+  /**
+   * Returns an iterator for the fixed queue.
+   * @returns An iterator for the fixed queue.
+   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
+   */
+  [Symbol.iterator] (): Iterator<T>
+}
+
+/**
+ * Default bucket size.
+ * @internal
+ */
+export const defaultBucketSize = 2048
+
+/**
+ * Priority queue node.
+ * @typeParam T - Type of priority queue node data.
+ * @internal
+ */
+export interface PriorityQueueNode<T> extends IFixedQueue<T> {
+  next?: IFixedQueue<T>
+}