X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fdeque.ts;h=9be270ffa8d6f2e95f1d045b07459d595576d30a;hb=7d1fc6d3a88ab9820a2e703c33b94de82f532c25;hp=d02fd96ffca2fd889e31edab6dce4ffc7db66a32;hpb=574b351dcb46b90a6a8d0ffb15b5016392e5a63f;p=poolifier.git diff --git a/src/deque.ts b/src/deque.ts index d02fd96f..9be270ff 100644 --- a/src/deque.ts +++ b/src/deque.ts @@ -1,6 +1,9 @@ // Copyright Jerome Benoit. 2023. All Rights Reserved. -class Node { +/** + * @internal + */ +export class Node { public value: T public next?: Node public prev?: Node @@ -15,6 +18,7 @@ class Node { * Implemented with a doubly linked list. * * @typeParam T - Type of deque values. + * @internal */ export class Deque { private head?: Node @@ -64,6 +68,8 @@ export class Deque { /** * 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 { /** * 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 { /** * 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 { } } + /** + * 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 { + return { + [Symbol.iterator]: (): Iterator => { + 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 + return ret + } + } + } + } + } + private incrementSize (): number { ++this.size if (this.size > this.maxSize) {