@zkochan/pnpm
Version:
Fast, disk space efficient package manager
75 lines (66 loc) • 1.57 kB
JavaScript
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
/**
* Doubly linked list
* @constructor
*/
export default function LinkedList () {
this.head = null
this.length = 0
}
/**
* Add a node to the end of the list
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to add
*/
LinkedList.prototype.add = function (x) {
if (this.head !== null) {
this.head.prev = x
x.next = this.head
}
this.head = x
++this.length
}
/**
* Remove the provided node from the list
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to remove
*/
LinkedList.prototype.remove = function (x) { // eslint-disable-line complexity
--this.length
if (x === this.head) {
this.head = this.head.next
}
if (x.next !== null) {
x.next.prev = x.prev
x.next = null
}
if (x.prev !== null) {
x.prev.next = x.next
x.prev = null
}
}
/**
* @returns {boolean} true iff there are no nodes in the list
*/
LinkedList.prototype.isEmpty = function () {
return this.length === 0
}
/**
* Dispose all nodes
* @returns {Promise} promise that fulfills when all nodes have been disposed,
* or rejects if an error occurs while disposing
*/
LinkedList.prototype.dispose = function () {
if (this.isEmpty()) {
return Promise.resolve()
}
var promises = []
var x = this.head
this.head = null
this.length = 0
while (x !== null) {
promises.push(x.dispose())
x = x.next
}
return Promise.all(promises)
}