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 }