1 module.exports = Yallist
4 Yallist.create = Yallist
6 function Yallist (list) {
8 if (!(self instanceof Yallist)) {
16 if (list && typeof list.forEach === 'function') {
17 list.forEach(function (item) {
20 } else if (arguments.length > 0) {
21 for (var i = 0, l = arguments.length; i < l; i++) {
22 self.push(arguments[i])
29 Yallist.prototype.removeNode = function (node) {
30 if (node.list !== this) {
31 throw new Error('removing node which does not belong to this list')
45 if (node === this.head) {
48 if (node === this.tail) {
58 Yallist.prototype.unshiftNode = function (node) {
59 if (node === this.head) {
64 node.list.removeNode(node)
81 Yallist.prototype.pushNode = function (node) {
82 if (node === this.tail) {
87 node.list.removeNode(node)
104 Yallist.prototype.push = function () {
105 for (var i = 0, l = arguments.length; i < l; i++) {
106 push(this, arguments[i])
111 Yallist.prototype.unshift = function () {
112 for (var i = 0, l = arguments.length; i < l; i++) {
113 unshift(this, arguments[i])
118 Yallist.prototype.pop = function () {
122 var res = this.tail.value
123 this.tail = this.tail.prev
124 this.tail.next = null
129 Yallist.prototype.shift = function () {
133 var res = this.head.value
134 this.head = this.head.next
135 this.head.prev = null
140 Yallist.prototype.forEach = function (fn, thisp) {
141 thisp = thisp || this
142 for (var walker = this.head, i = 0; walker !== null; i++) {
143 fn.call(thisp, walker.value, i, this)
148 Yallist.prototype.forEachReverse = function (fn, thisp) {
149 thisp = thisp || this
150 for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {
151 fn.call(thisp, walker.value, i, this)
156 Yallist.prototype.get = function (n) {
157 for (var i = 0, walker = this.head; walker !== null && i < n; i++) {
158 // abort out of the list early if we hit a cycle
161 if (i === n && walker !== null) {
166 Yallist.prototype.getReverse = function (n) {
167 for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {
168 // abort out of the list early if we hit a cycle
171 if (i === n && walker !== null) {
176 Yallist.prototype.map = function (fn, thisp) {
177 thisp = thisp || this
178 var res = new Yallist()
179 for (var walker = this.head; walker !== null; ) {
180 res.push(fn.call(thisp, walker.value, this))
186 Yallist.prototype.mapReverse = function (fn, thisp) {
187 thisp = thisp || this
188 var res = new Yallist()
189 for (var walker = this.tail; walker !== null;) {
190 res.push(fn.call(thisp, walker.value, this))
196 Yallist.prototype.reduce = function (fn, initial) {
198 var walker = this.head
199 if (arguments.length > 1) {
201 } else if (this.head) {
202 walker = this.head.next
203 acc = this.head.value
205 throw new TypeError('Reduce of empty list with no initial value')
208 for (var i = 0; walker !== null; i++) {
209 acc = fn(acc, walker.value, i)
216 Yallist.prototype.reduceReverse = function (fn, initial) {
218 var walker = this.tail
219 if (arguments.length > 1) {
221 } else if (this.tail) {
222 walker = this.tail.prev
223 acc = this.tail.value
225 throw new TypeError('Reduce of empty list with no initial value')
228 for (var i = this.length - 1; walker !== null; i--) {
229 acc = fn(acc, walker.value, i)
236 Yallist.prototype.toArray = function () {
237 var arr = new Array(this.length)
238 for (var i = 0, walker = this.head; walker !== null; i++) {
239 arr[i] = walker.value
245 Yallist.prototype.toArrayReverse = function () {
246 var arr = new Array(this.length)
247 for (var i = 0, walker = this.tail; walker !== null; i++) {
248 arr[i] = walker.value
254 Yallist.prototype.slice = function (from, to) {
255 to = to || this.length
263 var ret = new Yallist()
264 if (to < from || to < 0) {
270 if (to > this.length) {
273 for (var i = 0, walker = this.head; walker !== null && i < from; i++) {
276 for (; walker !== null && i < to; i++, walker = walker.next) {
277 ret.push(walker.value)
282 Yallist.prototype.sliceReverse = function (from, to) {
283 to = to || this.length
291 var ret = new Yallist()
292 if (to < from || to < 0) {
298 if (to > this.length) {
301 for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {
304 for (; walker !== null && i > from; i--, walker = walker.prev) {
305 ret.push(walker.value)
310 Yallist.prototype.reverse = function () {
313 for (var walker = head; walker !== null; walker = walker.prev) {
315 walker.prev = walker.next
323 function push (self, item) {
324 self.tail = new Node(item, self.tail, null, self)
326 self.head = self.tail
331 function unshift (self, item) {
332 self.head = new Node(item, null, self.head, self)
334 self.tail = self.head
339 function Node (value, prev, next, list) {
340 if (!(this instanceof Node)) {
341 return new Node(value, prev, next, list)