| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 | 
							- 'use strict'
 
- module.exports = Yallist
 
- Yallist.Node = Node
 
- Yallist.create = Yallist
 
- function Yallist (list) {
 
-   var self = this
 
-   if (!(self instanceof Yallist)) {
 
-     self = new Yallist()
 
-   }
 
-   self.tail = null
 
-   self.head = null
 
-   self.length = 0
 
-   if (list && typeof list.forEach === 'function') {
 
-     list.forEach(function (item) {
 
-       self.push(item)
 
-     })
 
-   } else if (arguments.length > 0) {
 
-     for (var i = 0, l = arguments.length; i < l; i++) {
 
-       self.push(arguments[i])
 
-     }
 
-   }
 
-   return self
 
- }
 
- Yallist.prototype.removeNode = function (node) {
 
-   if (node.list !== this) {
 
-     throw new Error('removing node which does not belong to this list')
 
-   }
 
-   var next = node.next
 
-   var prev = node.prev
 
-   if (next) {
 
-     next.prev = prev
 
-   }
 
-   if (prev) {
 
-     prev.next = next
 
-   }
 
-   if (node === this.head) {
 
-     this.head = next
 
-   }
 
-   if (node === this.tail) {
 
-     this.tail = prev
 
-   }
 
-   node.list.length--
 
-   node.next = null
 
-   node.prev = null
 
-   node.list = null
 
- }
 
- Yallist.prototype.unshiftNode = function (node) {
 
-   if (node === this.head) {
 
-     return
 
-   }
 
-   if (node.list) {
 
-     node.list.removeNode(node)
 
-   }
 
-   var head = this.head
 
-   node.list = this
 
-   node.next = head
 
-   if (head) {
 
-     head.prev = node
 
-   }
 
-   this.head = node
 
-   if (!this.tail) {
 
-     this.tail = node
 
-   }
 
-   this.length++
 
- }
 
- Yallist.prototype.pushNode = function (node) {
 
-   if (node === this.tail) {
 
-     return
 
-   }
 
-   if (node.list) {
 
-     node.list.removeNode(node)
 
-   }
 
-   var tail = this.tail
 
-   node.list = this
 
-   node.prev = tail
 
-   if (tail) {
 
-     tail.next = node
 
-   }
 
-   this.tail = node
 
-   if (!this.head) {
 
-     this.head = node
 
-   }
 
-   this.length++
 
- }
 
- Yallist.prototype.push = function () {
 
-   for (var i = 0, l = arguments.length; i < l; i++) {
 
-     push(this, arguments[i])
 
-   }
 
-   return this.length
 
- }
 
- Yallist.prototype.unshift = function () {
 
-   for (var i = 0, l = arguments.length; i < l; i++) {
 
-     unshift(this, arguments[i])
 
-   }
 
-   return this.length
 
- }
 
- Yallist.prototype.pop = function () {
 
-   if (!this.tail) {
 
-     return undefined
 
-   }
 
-   var res = this.tail.value
 
-   this.tail = this.tail.prev
 
-   if (this.tail) {
 
-     this.tail.next = null
 
-   } else {
 
-     this.head = null
 
-   }
 
-   this.length--
 
-   return res
 
- }
 
- Yallist.prototype.shift = function () {
 
-   if (!this.head) {
 
-     return undefined
 
-   }
 
-   var res = this.head.value
 
-   this.head = this.head.next
 
-   if (this.head) {
 
-     this.head.prev = null
 
-   } else {
 
-     this.tail = null
 
-   }
 
-   this.length--
 
-   return res
 
- }
 
- Yallist.prototype.forEach = function (fn, thisp) {
 
-   thisp = thisp || this
 
-   for (var walker = this.head, i = 0; walker !== null; i++) {
 
-     fn.call(thisp, walker.value, i, this)
 
-     walker = walker.next
 
-   }
 
- }
 
- Yallist.prototype.forEachReverse = function (fn, thisp) {
 
-   thisp = thisp || this
 
-   for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {
 
-     fn.call(thisp, walker.value, i, this)
 
-     walker = walker.prev
 
-   }
 
- }
 
- Yallist.prototype.get = function (n) {
 
-   for (var i = 0, walker = this.head; walker !== null && i < n; i++) {
 
-     // abort out of the list early if we hit a cycle
 
-     walker = walker.next
 
-   }
 
-   if (i === n && walker !== null) {
 
-     return walker.value
 
-   }
 
- }
 
- Yallist.prototype.getReverse = function (n) {
 
-   for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {
 
-     // abort out of the list early if we hit a cycle
 
-     walker = walker.prev
 
-   }
 
-   if (i === n && walker !== null) {
 
-     return walker.value
 
-   }
 
- }
 
- Yallist.prototype.map = function (fn, thisp) {
 
-   thisp = thisp || this
 
-   var res = new Yallist()
 
-   for (var walker = this.head; walker !== null;) {
 
-     res.push(fn.call(thisp, walker.value, this))
 
-     walker = walker.next
 
-   }
 
-   return res
 
- }
 
- Yallist.prototype.mapReverse = function (fn, thisp) {
 
-   thisp = thisp || this
 
-   var res = new Yallist()
 
-   for (var walker = this.tail; walker !== null;) {
 
-     res.push(fn.call(thisp, walker.value, this))
 
-     walker = walker.prev
 
-   }
 
-   return res
 
- }
 
- Yallist.prototype.reduce = function (fn, initial) {
 
-   var acc
 
-   var walker = this.head
 
-   if (arguments.length > 1) {
 
-     acc = initial
 
-   } else if (this.head) {
 
-     walker = this.head.next
 
-     acc = this.head.value
 
-   } else {
 
-     throw new TypeError('Reduce of empty list with no initial value')
 
-   }
 
-   for (var i = 0; walker !== null; i++) {
 
-     acc = fn(acc, walker.value, i)
 
-     walker = walker.next
 
-   }
 
-   return acc
 
- }
 
- Yallist.prototype.reduceReverse = function (fn, initial) {
 
-   var acc
 
-   var walker = this.tail
 
-   if (arguments.length > 1) {
 
-     acc = initial
 
-   } else if (this.tail) {
 
-     walker = this.tail.prev
 
-     acc = this.tail.value
 
-   } else {
 
-     throw new TypeError('Reduce of empty list with no initial value')
 
-   }
 
-   for (var i = this.length - 1; walker !== null; i--) {
 
-     acc = fn(acc, walker.value, i)
 
-     walker = walker.prev
 
-   }
 
-   return acc
 
- }
 
- Yallist.prototype.toArray = function () {
 
-   var arr = new Array(this.length)
 
-   for (var i = 0, walker = this.head; walker !== null; i++) {
 
-     arr[i] = walker.value
 
-     walker = walker.next
 
-   }
 
-   return arr
 
- }
 
- Yallist.prototype.toArrayReverse = function () {
 
-   var arr = new Array(this.length)
 
-   for (var i = 0, walker = this.tail; walker !== null; i++) {
 
-     arr[i] = walker.value
 
-     walker = walker.prev
 
-   }
 
-   return arr
 
- }
 
- Yallist.prototype.slice = function (from, to) {
 
-   to = to || this.length
 
-   if (to < 0) {
 
-     to += this.length
 
-   }
 
-   from = from || 0
 
-   if (from < 0) {
 
-     from += this.length
 
-   }
 
-   var ret = new Yallist()
 
-   if (to < from || to < 0) {
 
-     return ret
 
-   }
 
-   if (from < 0) {
 
-     from = 0
 
-   }
 
-   if (to > this.length) {
 
-     to = this.length
 
-   }
 
-   for (var i = 0, walker = this.head; walker !== null && i < from; i++) {
 
-     walker = walker.next
 
-   }
 
-   for (; walker !== null && i < to; i++, walker = walker.next) {
 
-     ret.push(walker.value)
 
-   }
 
-   return ret
 
- }
 
- Yallist.prototype.sliceReverse = function (from, to) {
 
-   to = to || this.length
 
-   if (to < 0) {
 
-     to += this.length
 
-   }
 
-   from = from || 0
 
-   if (from < 0) {
 
-     from += this.length
 
-   }
 
-   var ret = new Yallist()
 
-   if (to < from || to < 0) {
 
-     return ret
 
-   }
 
-   if (from < 0) {
 
-     from = 0
 
-   }
 
-   if (to > this.length) {
 
-     to = this.length
 
-   }
 
-   for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {
 
-     walker = walker.prev
 
-   }
 
-   for (; walker !== null && i > from; i--, walker = walker.prev) {
 
-     ret.push(walker.value)
 
-   }
 
-   return ret
 
- }
 
- Yallist.prototype.reverse = function () {
 
-   var head = this.head
 
-   var tail = this.tail
 
-   for (var walker = head; walker !== null; walker = walker.prev) {
 
-     var p = walker.prev
 
-     walker.prev = walker.next
 
-     walker.next = p
 
-   }
 
-   this.head = tail
 
-   this.tail = head
 
-   return this
 
- }
 
- function push (self, item) {
 
-   self.tail = new Node(item, self.tail, null, self)
 
-   if (!self.head) {
 
-     self.head = self.tail
 
-   }
 
-   self.length++
 
- }
 
- function unshift (self, item) {
 
-   self.head = new Node(item, null, self.head, self)
 
-   if (!self.tail) {
 
-     self.tail = self.head
 
-   }
 
-   self.length++
 
- }
 
- function Node (value, prev, next, list) {
 
-   if (!(this instanceof Node)) {
 
-     return new Node(value, prev, next, list)
 
-   }
 
-   this.list = list
 
-   this.value = value
 
-   if (prev) {
 
-     prev.next = this
 
-     this.prev = prev
 
-   } else {
 
-     this.prev = null
 
-   }
 
-   if (next) {
 
-     next.prev = this
 
-     this.next = next
 
-   } else {
 
-     this.next = null
 
-   }
 
- }
 
- try {
 
-   // add if support for Symbol.iterator is present
 
-   require('./iterator.js')(Yallist)
 
- } catch (er) {}
 
 
  |