export default class Deque<T> {
private count: number;
private lowestCount: number;
private items: Map<number, T>;
constructor() {
this.count = 0;
this.lowestCount = 0;
this.items = new Map();
}
public addFront(element: T): void {
this.lowestCount--;
this.items.set(this.lowestCount, element);
}
public addBack(element: T): void {
this.items.set(this.count, element);
this.count++;
}
public removeFront(): T {
if (this.isEmpty()) {
return undefined;
}
const result = this.items.get(this.lowestCount);
this.items.delete(this.lowestCount);
this.lowestCount++;
return result;
}
public removeBack(): T {
if (this.isEmpty()) {
return undefined;
}
this.count--;
const result = this.items.get(this.count);
this.items.delete(this.count);
return result;
}
public peekFront(): T {
if (this.isEmpty()) {
return undefined;
}
return this.items.get(this.lowestCount);
}
public peekBack(): T {
if (this.isEmpty()) {
return undefined;
}
return this.items.get(this.count - 1);
}
public isEmpty(): boolean {
return this.items.size === 0;
}
public clear(): void {
this.items = new Map();
this.count = 0;
this.lowestCount = 0;
}
public size(): number {
return this.items.size;
}
public toString(): string {
if (this.isEmpty()) {
return "";
}
let objString: string = `${this.items.get(this.lowestCount)}`;
for (let i = this.lowestCount + 1; i < this.count; i++) {
objString = `${objString},${this.items.get(i)}`;
}
return objString;
}
}