node/deps/npm/node_modules/fast-list/fast-list.js

91 lines
2.1 KiB
JavaScript

;(function() { // closure for web browsers
function Item (data, prev, next) {
this.next = next
if (next) next.prev = this
this.prev = prev
if (prev) prev.next = this
this.data = data
}
function FastList () {
if (!(this instanceof FastList)) return new FastList
this._head = null
this._tail = null
this.length = 0
}
FastList.prototype =
{ push: function (data) {
this._tail = new Item(data, this._tail, null)
if (!this._head) this._head = this._tail
this.length ++
}
, pop: function () {
if (this.length === 0) return undefined
var t = this._tail
this._tail = t.prev
if (t.prev) {
t.prev = this._tail.next = null
}
this.length --
if (this.length === 1) this._head = this._tail
else if (this.length === 0) this._head = this._tail = null
return t.data
}
, unshift: function (data) {
this._head = new Item(data, null, this._head)
if (!this._tail) this._tail = this._head
this.length ++
}
, shift: function () {
if (this.length === 0) return undefined
var h = this._head
this._head = h.next
if (h.next) {
h.next = this._head.prev = null
}
this.length --
if (this.length === 1) this._tail = this._head
else if (this.length === 0) this._head = this._tail = null
return h.data
}
, item: function (n) {
if (n < 0) n = this.length + n
var h = this._head
while (n-- > 0 && h) h = h.next
return h ? h.data : undefined
}
, slice: function (n, m) {
if (!n) n = 0
if (!m) m = this.length
if (m < 0) m = this.length + m
if (n < 0) n = this.length + n
if (m <= n) {
throw new Error("invalid offset: "+n+","+m)
}
var len = m - n
, ret = new Array(len)
, i = 0
, h = this._head
while (n-- > 0 && h) h = h.next
while (i < len && h) {
ret[i++] = h.data
h = h.next
}
return ret
}
, drop: function () {
FastList.call(this)
}
}
if ("undefined" !== typeof(exports)) module.exports = FastList
else if ("function" === typeof(define) && define.amd) {
define("FastList", function() { return FastList })
} else (function () { return this })().FastList = FastList
})()