build: cleanup TS configuration
[poolifier.git] / src / deque.ts
index d02fd96ffca2fd889e31edab6dce4ffc7db66a32..9be270ffa8d6f2e95f1d045b07459d595576d30a 100644 (file)
@@ -1,6 +1,9 @@
 // Copyright Jerome Benoit. 2023. All Rights Reserved.
 
-class Node<T> {
+/**
+ * @internal
+ */
+export class Node<T> {
   public value: T
   public next?: Node<T>
   public prev?: Node<T>
@@ -15,6 +18,7 @@ class Node<T> {
  * Implemented with a doubly linked list.
  *
  * @typeParam T - Type of deque values.
+ * @internal
  */
 export class Deque<T> {
   private head?: Node<T>
@@ -64,6 +68,8 @@ export class Deque<T> {
 
   /**
    * Pops a value from the deque.
+   *
+   * @returns The popped value or `undefined` if the deque is empty.
    */
   public pop (): T | undefined {
     if (this.head == null) {
@@ -102,7 +108,7 @@ export class Deque<T> {
 
   /**
    * Peeks at the first value.
-   * @returns The first value or `undefined` if the queue is empty.
+   * @returns The first value or `undefined` if the deque is empty.
    */
   public peekFirst (): T | undefined {
     return this.head?.value
@@ -110,7 +116,7 @@ export class Deque<T> {
 
   /**
    * Peeks at the last value.
-   * @returns The last value or `undefined` if the queue is empty.
+   * @returns The last value or `undefined` if the deque is empty.
    */
   public peekLast (): T | undefined {
     return this.tail?.value
@@ -152,6 +158,36 @@ export class Deque<T> {
     }
   }
 
+  /**
+   * Returns an backward iterator for the deque.
+   *
+   * @returns An backward iterator for the deque.
+   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
+   */
+  backward (): Iterable<T> {
+    return {
+      [Symbol.iterator]: (): Iterator<T> => {
+        let node = this.tail
+        return {
+          next: () => {
+            if (node == null) {
+              return {
+                value: undefined,
+                done: true
+              }
+            }
+            const ret = {
+              value: node.value,
+              done: false
+            }
+            node = node.prev as Node<T>
+            return ret
+          }
+        }
+      }
+    }
+  }
+
   private incrementSize (): number {
     ++this.size
     if (this.size > this.maxSize) {