81 lines
1.7 KiB
JavaScript
81 lines
1.7 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.default = LinkedList;
|
||
|
/** @license MIT License (c) copyright 2010-2016 original author or authors */
|
||
|
/** @author Brian Cavalier */
|
||
|
/** @author John Hann */
|
||
|
|
||
|
/**
|
||
|
* Doubly linked list
|
||
|
* @constructor
|
||
|
*/
|
||
|
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);
|
||
|
};
|