|
;(function() { |
|
|
|
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 |
|
|
|
})() |