You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					205 lines
				
				4.6 KiB
			
		
		
			
		
	
	
					205 lines
				
				4.6 KiB
			| 
											3 years ago
										 | # yallist
 | ||
|  | 
 | ||
|  | Yet Another Linked List | ||
|  | 
 | ||
|  | There are many doubly-linked list implementations like it, but this | ||
|  | one is mine. | ||
|  | 
 | ||
|  | For when an array would be too big, and a Map can't be iterated in | ||
|  | reverse order. | ||
|  | 
 | ||
|  | 
 | ||
|  | [](https://travis-ci.org/isaacs/yallist) [](https://coveralls.io/github/isaacs/yallist) | ||
|  | 
 | ||
|  | ## basic usage
 | ||
|  | 
 | ||
|  | ```javascript | ||
|  | var yallist = require('yallist') | ||
|  | var myList = yallist.create([1, 2, 3]) | ||
|  | myList.push('foo') | ||
|  | myList.unshift('bar') | ||
|  | // of course pop() and shift() are there, too | ||
|  | console.log(myList.toArray()) // ['bar', 1, 2, 3, 'foo'] | ||
|  | myList.forEach(function (k) { | ||
|  |   // walk the list head to tail | ||
|  | }) | ||
|  | myList.forEachReverse(function (k, index, list) { | ||
|  |   // walk the list tail to head | ||
|  | }) | ||
|  | var myDoubledList = myList.map(function (k) { | ||
|  |   return k + k | ||
|  | }) | ||
|  | // now myDoubledList contains ['barbar', 2, 4, 6, 'foofoo'] | ||
|  | // mapReverse is also a thing | ||
|  | var myDoubledListReverse = myList.mapReverse(function (k) { | ||
|  |   return k + k | ||
|  | }) // ['foofoo', 6, 4, 2, 'barbar'] | ||
|  | 
 | ||
|  | var reduced = myList.reduce(function (set, entry) { | ||
|  |   set += entry | ||
|  |   return set | ||
|  | }, 'start') | ||
|  | console.log(reduced) // 'startfoo123bar' | ||
|  | ``` | ||
|  | 
 | ||
|  | ## api
 | ||
|  | 
 | ||
|  | The whole API is considered "public". | ||
|  | 
 | ||
|  | Functions with the same name as an Array method work more or less the | ||
|  | same way. | ||
|  | 
 | ||
|  | There's reverse versions of most things because that's the point. | ||
|  | 
 | ||
|  | ### Yallist
 | ||
|  | 
 | ||
|  | Default export, the class that holds and manages a list. | ||
|  | 
 | ||
|  | Call it with either a forEach-able (like an array) or a set of | ||
|  | arguments, to initialize the list. | ||
|  | 
 | ||
|  | The Array-ish methods all act like you'd expect.  No magic length, | ||
|  | though, so if you change that it won't automatically prune or add | ||
|  | empty spots. | ||
|  | 
 | ||
|  | ### Yallist.create(..)
 | ||
|  | 
 | ||
|  | Alias for Yallist function.  Some people like factories. | ||
|  | 
 | ||
|  | #### yallist.head
 | ||
|  | 
 | ||
|  | The first node in the list | ||
|  | 
 | ||
|  | #### yallist.tail
 | ||
|  | 
 | ||
|  | The last node in the list | ||
|  | 
 | ||
|  | #### yallist.length
 | ||
|  | 
 | ||
|  | The number of nodes in the list.  (Change this at your peril.  It is | ||
|  | not magic like Array length.) | ||
|  | 
 | ||
|  | #### yallist.toArray()
 | ||
|  | 
 | ||
|  | Convert the list to an array. | ||
|  | 
 | ||
|  | #### yallist.forEach(fn, [thisp])
 | ||
|  | 
 | ||
|  | Call a function on each item in the list. | ||
|  | 
 | ||
|  | #### yallist.forEachReverse(fn, [thisp])
 | ||
|  | 
 | ||
|  | Call a function on each item in the list, in reverse order. | ||
|  | 
 | ||
|  | #### yallist.get(n)
 | ||
|  | 
 | ||
|  | Get the data at position `n` in the list.  If you use this a lot, | ||
|  | probably better off just using an Array. | ||
|  | 
 | ||
|  | #### yallist.getReverse(n)
 | ||
|  | 
 | ||
|  | Get the data at position `n`, counting from the tail. | ||
|  | 
 | ||
|  | #### yallist.map(fn, thisp)
 | ||
|  | 
 | ||
|  | Create a new Yallist with the result of calling the function on each | ||
|  | item. | ||
|  | 
 | ||
|  | #### yallist.mapReverse(fn, thisp)
 | ||
|  | 
 | ||
|  | Same as `map`, but in reverse. | ||
|  | 
 | ||
|  | #### yallist.pop()
 | ||
|  | 
 | ||
|  | Get the data from the list tail, and remove the tail from the list. | ||
|  | 
 | ||
|  | #### yallist.push(item, ...)
 | ||
|  | 
 | ||
|  | Insert one or more items to the tail of the list. | ||
|  | 
 | ||
|  | #### yallist.reduce(fn, initialValue)
 | ||
|  | 
 | ||
|  | Like Array.reduce. | ||
|  | 
 | ||
|  | #### yallist.reduceReverse
 | ||
|  | 
 | ||
|  | Like Array.reduce, but in reverse. | ||
|  | 
 | ||
|  | #### yallist.reverse
 | ||
|  | 
 | ||
|  | Reverse the list in place. | ||
|  | 
 | ||
|  | #### yallist.shift()
 | ||
|  | 
 | ||
|  | Get the data from the list head, and remove the head from the list. | ||
|  | 
 | ||
|  | #### yallist.slice([from], [to])
 | ||
|  | 
 | ||
|  | Just like Array.slice, but returns a new Yallist. | ||
|  | 
 | ||
|  | #### yallist.sliceReverse([from], [to])
 | ||
|  | 
 | ||
|  | Just like yallist.slice, but the result is returned in reverse. | ||
|  | 
 | ||
|  | #### yallist.toArray()
 | ||
|  | 
 | ||
|  | Create an array representation of the list. | ||
|  | 
 | ||
|  | #### yallist.toArrayReverse()
 | ||
|  | 
 | ||
|  | Create a reversed array representation of the list. | ||
|  | 
 | ||
|  | #### yallist.unshift(item, ...)
 | ||
|  | 
 | ||
|  | Insert one or more items to the head of the list. | ||
|  | 
 | ||
|  | #### yallist.unshiftNode(node)
 | ||
|  | 
 | ||
|  | Move a Node object to the front of the list.  (That is, pull it out of | ||
|  | wherever it lives, and make it the new head.) | ||
|  | 
 | ||
|  | If the node belongs to a different list, then that list will remove it | ||
|  | first. | ||
|  | 
 | ||
|  | #### yallist.pushNode(node)
 | ||
|  | 
 | ||
|  | Move a Node object to the end of the list.  (That is, pull it out of | ||
|  | wherever it lives, and make it the new tail.) | ||
|  | 
 | ||
|  | If the node belongs to a list already, then that list will remove it | ||
|  | first. | ||
|  | 
 | ||
|  | #### yallist.removeNode(node)
 | ||
|  | 
 | ||
|  | Remove a node from the list, preserving referential integrity of head | ||
|  | and tail and other nodes. | ||
|  | 
 | ||
|  | Will throw an error if you try to have a list remove a node that | ||
|  | doesn't belong to it. | ||
|  | 
 | ||
|  | ### Yallist.Node
 | ||
|  | 
 | ||
|  | The class that holds the data and is actually the list. | ||
|  | 
 | ||
|  | Call with `var n = new Node(value, previousNode, nextNode)` | ||
|  | 
 | ||
|  | Note that if you do direct operations on Nodes themselves, it's very | ||
|  | easy to get into weird states where the list is broken.  Be careful :) | ||
|  | 
 | ||
|  | #### node.next
 | ||
|  | 
 | ||
|  | The next node in the list. | ||
|  | 
 | ||
|  | #### node.prev
 | ||
|  | 
 | ||
|  | The previous node in the list. | ||
|  | 
 | ||
|  | #### node.value
 | ||
|  | 
 | ||
|  | The data the node contains. | ||
|  | 
 | ||
|  | #### node.list
 | ||
|  | 
 | ||
|  | The list to which this node belongs.  (Null if it does not belong to | ||
|  | any list.) |