| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 | 'use strict'module.exports = YallistYallist.Node = NodeYallist.create = Yallistfunction 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  return next}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.splice = function (start, deleteCount /*, ...nodes */) {  if (start > this.length) {    start = this.length - 1  }  if (start < 0) {    start = this.length + start;  }  for (var i = 0, walker = this.head; walker !== null && i < start; i++) {    walker = walker.next  }  var ret = []  for (var i = 0; walker && i < deleteCount; i++) {    ret.push(walker.value)    walker = this.removeNode(walker)  }  if (walker === null) {    walker = this.tail  }  if (walker !== this.head && walker !== this.tail) {    walker = walker.prev  }  for (var i = 2; i < arguments.length; i++) {    walker = insert(this, walker, arguments[i])  }  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 insert (self, node, value) {  var inserted = node === self.head ?    new Node(value, null, node, self) :    new Node(value, node, node.next, self)  if (inserted.next === null) {    self.tail = inserted  }  if (inserted.prev === null) {    self.head = inserted  }  self.length++  return inserted}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) {}
 |