function Queue() { this.head = new Item('head', null); } module.exports = Queue; Queue.prototype.append = function append(kind, value) { var item = new Item(kind, value); this.head.prepend(item); return item; }; Queue.prototype.isEmpty = function isEmpty() { return this.head.prev === this.head; }; Queue.prototype.first = function first() { return this.head.next; }; function Item(kind, value) { this.prev = this; this.next = this; this.kind = kind; this.value = value; } Item.prototype.prepend = function prepend(other) { other.prev = this.prev; other.next = this; other.prev.next = other; other.next.prev = other; }; Item.prototype.dequeue = function dequeue() { var prev = this.prev; var next = this.next; prev.next = next; next.prev = prev; this.prev = this; this.next = this; return this.value; }; Item.prototype.isEmpty = function isEmpty() { return this.prev === this; };