// 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>
* Implemented with a doubly linked list.
*
* @typeParam T - Type of deque values.
+ * @internal
*/
export class Deque<T> {
private head?: Node<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) {
/**
* 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
/**
* 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
}
}
+ /**
+ * 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) {