UNPKG

@aureooms/js-dll

Version:

Doubly linked list code bricks for JavaScript

198 lines (167 loc) 19.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DoublyLinkedList = DoublyLinkedList; exports.Node = Node; exports.Iterator = Iterator; exports.ReverseIterator = ReverseIterator; /** * Doubly linked list implementation * making use of dummy nodes for the * sake of simplicity. */ function DoublyLinkedList() { this.front = new Node(null, null, null); this.back = new Node(this.front, null, null); this.front.next = this.back; this.length = 0; } function Node(prev, next, value) { this.prev = prev; this.next = next; this.value = value; } function Iterator(front, back, current) { this.front = front; this.back = back; this.current = current; } function ReverseIterator(front, back, current) { this.front = front; this.back = back; this.current = current; } DoublyLinkedList.prototype.insertAfter = function (iterator, value) { var node, prev; prev = iterator.current; node = new Node(prev, prev.next, value); prev.next.prev = node; prev.next = node; ++this.length; return this.iterator(node); }; DoublyLinkedList.prototype.insertBefore = function (iterator, value) { var node, next; next = iterator.current; node = new Node(next.prev, next, value); next.prev.next = node; next.prev = node; ++this.length; return this.iterator(node); }; DoublyLinkedList.prototype.unshift = function (value) { return this.insertAfter(this.begin(), value); }; DoublyLinkedList.prototype.push = function (value) { return this.insertBefore(this.end(), value); }; DoublyLinkedList.prototype.erase = function (iterator) { var node = iterator.current; node.prev.next = node.next; node.next.prev = node.prev; --this.length; return this.iterator(node.next); }; DoublyLinkedList.prototype.rerase = function (iterator) { var node = iterator.current; node.next.prev = node.prev; node.prev.next = node.next; --this.length; return this.iterator(node.prev); }; DoublyLinkedList.prototype.eraserange = function (first, last) { var firstnode, lastnode, it; firstnode = first.current; lastnode = last.current; lastnode.prev = firstnode.prev; firstnode.prev.next = lastnode; it = first.copy(); while (it.current !== lastnode) { --this.length; it.next(); } return last.copy(); }; DoublyLinkedList.prototype.reraserange = function (first, last) { var firstnode, lastnode, it; firstnode = first.current; lastnode = last.current; lastnode.next = firstnode.next; firstnode.next.prev = lastnode; it = first.copy(); while (it.current !== lastnode) { --this.length; it.next(); } return last.copy(); }; DoublyLinkedList.prototype.shift = function () { if (this.length === 0) return null; var node = this.front.next; this.front.next = node.next; node.next.prev = this.front; --this.length; return node.value; }; DoublyLinkedList.prototype.pop = function () { if (this.length === 0) return null; var node = this.back.prev; this.back.prev = node.prev; node.prev.next = this.back; --this.length; return node.value; }; DoublyLinkedList.prototype.clear = function () { this.front.next = this.back; this.back.prev = this.front; this.length = 0; return this; }; DoublyLinkedList.prototype.iterator = function (node) { return new Iterator(this.front, this.back, node); }; DoublyLinkedList.prototype.riterator = function (node) { return new ReverseIterator(this.front, this.back, node); }; DoublyLinkedList.prototype.begin = function () { return this.iterator(this.front); }; DoublyLinkedList.prototype.end = function () { return this.iterator(this.back); }; DoublyLinkedList.prototype.rbegin = function () { return this.riterator(this.back); }; DoublyLinkedList.prototype.rend = function () { return this.riterator(this.front); }; Iterator.prototype.copy = function () { return new Iterator(this.front, this.back, this.current); }; ReverseIterator.prototype.copy = function () { return new ReverseIterator(this.front, this.back, this.current); }; Iterator.prototype.next = ReverseIterator.prototype.prev = function () { var c = this.current = this.current.next; return c === this.back ? { done: true } : { value: c.value, done: false }; }; Iterator.prototype.prev = ReverseIterator.prototype.next = function () { var c = this.current = this.current.prev; return c === this.front ? { done: true } : { value: c.value, done: false }; }; DoublyLinkedList.prototype[Symbol.iterator] = DoublyLinkedList.prototype.begin; DoublyLinkedList.Node = Node; DoublyLinkedList.Iterator = Iterator; DoublyLinkedList.ReverseIterator = ReverseIterator; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Eb3VibHlMaW5rZWRMaXN0LmpzIl0sIm5hbWVzIjpbIkRvdWJseUxpbmtlZExpc3QiLCJmcm9udCIsIk5vZGUiLCJiYWNrIiwibmV4dCIsImxlbmd0aCIsInByZXYiLCJ2YWx1ZSIsIkl0ZXJhdG9yIiwiY3VycmVudCIsIlJldmVyc2VJdGVyYXRvciIsInByb3RvdHlwZSIsImluc2VydEFmdGVyIiwiaXRlcmF0b3IiLCJub2RlIiwiaW5zZXJ0QmVmb3JlIiwidW5zaGlmdCIsImJlZ2luIiwicHVzaCIsImVuZCIsImVyYXNlIiwicmVyYXNlIiwiZXJhc2VyYW5nZSIsImZpcnN0IiwibGFzdCIsImZpcnN0bm9kZSIsImxhc3Rub2RlIiwiaXQiLCJjb3B5IiwicmVyYXNlcmFuZ2UiLCJzaGlmdCIsInBvcCIsImNsZWFyIiwicml0ZXJhdG9yIiwicmJlZ2luIiwicmVuZCIsImMiLCJkb25lIiwiU3ltYm9sIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7O0FBTU8sU0FBU0EsZ0JBQVQsR0FBMkI7QUFDakMsT0FBS0MsS0FBTCxHQUFhLElBQUlDLElBQUosQ0FBUyxJQUFULEVBQWUsSUFBZixFQUFxQixJQUFyQixDQUFiO0FBQ0EsT0FBS0MsSUFBTCxHQUFZLElBQUlELElBQUosQ0FBUyxLQUFLRCxLQUFkLEVBQXFCLElBQXJCLEVBQTJCLElBQTNCLENBQVo7QUFDQSxPQUFLQSxLQUFMLENBQVdHLElBQVgsR0FBa0IsS0FBS0QsSUFBdkI7QUFDQSxPQUFLRSxNQUFMLEdBQWMsQ0FBZDtBQUNBOztBQUVNLFNBQVNILElBQVQsQ0FBY0ksSUFBZCxFQUFvQkYsSUFBcEIsRUFBMEJHLEtBQTFCLEVBQWdDO0FBQ3RDLE9BQUtELElBQUwsR0FBWUEsSUFBWjtBQUNBLE9BQUtGLElBQUwsR0FBWUEsSUFBWjtBQUNBLE9BQUtHLEtBQUwsR0FBYUEsS0FBYjtBQUNBOztBQUVNLFNBQVNDLFFBQVQsQ0FBa0JQLEtBQWxCLEVBQXlCRSxJQUF6QixFQUEr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QU0sQ0FBQ3pCLFFBQWxDLElBQThDYixnQkFBZ0IsQ0FBQ1csU0FBakIsQ0FBMkJNLEtBQXpFO0FBQ0FqQixnQkFBZ0IsQ0FBQ0UsSUFBakIsR0FBd0JBLElBQXhCO0FBQ0FGLGdCQUFnQixDQUFDUSxRQUFqQixHQUE0QkEsUUFBNUI7QUFDQVIsZ0JBQWdCLENBQUNVLGVBQWpCLEdBQW1DQSxlQUFuQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uXG4gKiBtYWtpbmcgdXNlIG9mIGR1bW15IG5vZGVzIGZvciB0aGVcbiAqIHNha2Ugb2Ygc2ltcGxpY2l0eS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gRG91Ymx5TGlua2VkTGlzdCgpe1xuXHR0aGlzLmZyb250ID0gbmV3IE5vZGUobnVsbCwgbnVsbCwgbnVsbCk7XG5cdHRoaXMuYmFjayA9IG5ldyBOb2RlKHRoaXMuZnJvbnQsIG51bGwsIG51bGwpO1xuXHR0aGlzLmZyb250Lm5leHQgPSB0aGlzLmJhY2s7XG5cdHRoaXMubGVuZ3RoID0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5vZGUocHJldiwgbmV4dCwgdmFsdWUpe1xuXHR0aGlzLnByZXYgPSBwcmV2O1xuXHR0aGlzLm5leHQgPSBuZXh0O1xuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJdGVyYXRvcihmcm9udCwgYmFjaywgY3VycmVudCl7XG5cdHRoaXMuZnJvbnQgPSBmcm9udDtcblx0dGhpcy5iYWNrID0gYmFjaztcblx0dGhpcy5jdXJyZW50ID0gY3VycmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJldmVyc2VJdGVyYXRvcihmcm9udCwgYmFjaywgY3VycmVudCl7XG5cdHRoaXMuZnJvbnQgPSBmcm9udDtcblx0dGhpcy5iYWNrID0gYmFjaztcblx0dGhpcy5jdXJyZW50ID0gY3VycmVudDtcbn1cblxuRG91Ymx5TGlua2VkTGlzdC5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbihpdGVyYXRvciwgdmFsdWUpe1xuXHR2YXIgbm9kZSwgcHJldjtcblxuXHRwcmV2ID0gaXRlcmF0b3IuY3VycmVudDtcblxuXHRub2RlID0gbmV3IE5vZGUocHJldiwgcHJldi5uZXh0LCB2YWx1ZSk7XG5cdHByZXYubmV4dC5wcmV2ID0gbm9kZTtcblx0cHJldi5uZXh0ID0gbm9kZTtcblxuXHQrK3RoaXMubGVuZ3RoO1xuXHRyZXR1cm4gdGhpcy5pdGVyYXRvcihub2RlKTtcbn1cblxuRG91Ymx5TGlua2VkTGlzdC5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24oaXRlcmF0b3IsIHZhbHVlKXtcblx0dmFyIG5vZGUsIG5leHQ7XG5cblx0bmV4dCA9IGl0ZXJhdG9yLmN1cnJlbnQ7XG5cblx0bm9kZSA9IG5ldyBOb2RlKG5leHQucHJldiwgbmV4dCwgdmFsdWUpO1xuXHRuZXh0LnByZXYubmV4dCA9IG5vZGU7XG5cdG5leHQucHJldiA9IG5vZGU7XG5cblx0Kyt0aGlzLmxlbmd0aDtcblx0cmV0dXJuIHRoaXMuaXRlcmF0b3Iobm9kZSk7XG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbih2YWx1ZSl7XG5cdHJldHVybiB0aGlzLmluc2VydEFmdGVyKHRoaXMuYmVnaW4oKSwgdmFsdWUpO1xufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24odmFsdWUpe1xuXHRyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUodGhpcy5lbmQoKSwgdmFsdWUpO1xufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZS5lcmFzZSA9IGZ1bmN0aW9uKGl0ZXJhdG9yKXtcblx0dmFyIG5vZGUgPSBpdGVyYXRvci5jdXJyZW50O1xuXG5cdG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuXHRub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtcblxuXHQtLXRoaXMubGVuZ3RoO1xuXHRyZXR1cm4gdGhpcy5pdGVyYXRvcihub2RlLm5leHQpO1xufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZS5yZXJhc2UgPSBmdW5jdGlvbihpdGVyYXRvcil7XG5cdHZhciBub2RlID0gaXRlcmF0b3IuY3VycmVudDtcblxuXHRub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtcblx0bm9kZS5wcmV2Lm5leHQgPSBub2RlLm5leHQ7XG5cblx0LS10aGlzLmxlbmd0aDtcblx0cmV0dXJuIHRoaXMuaXRlcmF0b3Iobm9kZS5wcmV2KTtcbn1cblxuRG91Ymx5TGlua2VkTGlzdC5wcm90b3R5cGUuZXJhc2VyYW5nZSA9IGZ1bmN0aW9uKGZpcnN0LCBsYXN0KXtcblx0dmFyIGZpcnN0bm9kZSwgbGFzdG5vZGUsIGl0O1xuXHRmaXJzdG5vZGUgPSBmaXJzdC5jdXJyZW50O1xuXHRsYXN0bm9kZSA9IGxhc3QuY3VycmVudDtcblxuXHRsYXN0bm9kZS5wcmV2ID0gZmlyc3Rub2RlLnByZXY7XG5cdGZpcnN0bm9kZS5wcmV2Lm5leHQgPSBsYXN0bm9kZTtcblxuXHRpdCA9IGZpcnN0LmNvcHkoKTtcblxuXHR3aGlsZSAoaXQuY3VycmVudCAhPT0gbGFzdG5vZGUpIHtcblx0XHQtLXRoaXMubGVuZ3RoO1xuXHRcdGl0Lm5leHQoKTtcblx0fVxuXHRyZXR1cm4gbGFzdC5jb3B5KCk7XG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLnJlcmFzZXJhbmdlID0gZnVuY3Rpb24oZmlyc3QsIGxhc3Qpe1xuXHR2YXIgZmlyc3Rub2RlLCBsYXN0bm9kZSwgaXQ7XG5cdGZpcnN0bm9kZSA9IGZpcnN0LmN1cnJlbnQ7XG5cdGxhc3Rub2RlID0gbGFzdC5jdXJyZW50O1xuXG5cdGxhc3Rub2RlLm5leHQgPSBmaXJzdG5vZGUubmV4dDtcblx0Zmlyc3Rub2RlLm5leHQucHJldiA9IGxhc3Rub2RlO1xuXG5cdGl0ID0gZmlyc3QuY29weSgpO1xuXG5cdHdoaWxlIChpdC5jdXJyZW50ICE9PSBsYXN0bm9kZSkge1xuXHRcdC0tdGhpcy5sZW5ndGg7XG5cdFx0aXQubmV4dCgpO1xuXHR9XG5cdHJldHVybiBsYXN0LmNvcHkoKTtcbn1cblxuRG91Ymx5TGlua2VkTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiAoICkge1xuXG5cdGlmICggdGhpcy5sZW5ndGggPT09IDAgKSByZXR1cm4gbnVsbCA7XG5cblx0Y29uc3Qgbm9kZSA9IHRoaXMuZnJvbnQubmV4dCA7XG5cblx0dGhpcy5mcm9udC5uZXh0ID0gbm9kZS5uZXh0IDtcblx0bm9kZS5uZXh0LnByZXYgPSB0aGlzLmZyb250IDtcblxuXHQtLXRoaXMubGVuZ3RoIDtcblxuXHRyZXR1cm4gbm9kZS52YWx1ZSA7XG5cbn1cblxuRG91Ymx5TGlua2VkTGlzdC5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCApIHtcblxuXHRpZiAoIHRoaXMubGVuZ3RoID09PSAwICkgcmV0dXJuIG51bGwgO1xuXG5cdGNvbnN0IG5vZGUgPSB0aGlzLmJhY2sucHJldiA7XG5cblx0dGhpcy5iYWNrLnByZXYgPSBub2RlLnByZXYgO1xuXHRub2RlLnByZXYubmV4dCA9IHRoaXMuYmFjayA7XG5cblx0LS10aGlzLmxlbmd0aCA7XG5cblx0cmV0dXJuIG5vZGUudmFsdWUgO1xuXG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKXtcblx0dGhpcy5mcm9udC5uZXh0ID0gdGhpcy5iYWNrO1xuXHR0aGlzLmJhY2sucHJldiA9IHRoaXMuZnJvbnQ7XG5cdHRoaXMubGVuZ3RoID0gMDtcblx0cmV0dXJuIHRoaXM7XG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLml0ZXJhdG9yID0gZnVuY3Rpb24obm9kZSl7XG5cdHJldHVybiBuZXcgSXRlcmF0b3IodGhpcy5mcm9udCwgdGhpcy5iYWNrLCBub2RlKTtcbn1cblxuRG91Ymx5TGlua2VkTGlzdC5wcm90b3R5cGUucml0ZXJhdG9yID0gZnVuY3Rpb24obm9kZSl7XG5cdHJldHVybiBuZXcgUmV2ZXJzZUl0ZXJhdG9yKHRoaXMuZnJvbnQsIHRoaXMuYmFjaywgbm9kZSk7XG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLmJlZ2luID0gZnVuY3Rpb24oKXtcblx0cmV0dXJuIHRoaXMuaXRlcmF0b3IodGhpcy5mcm9udCk7XG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCl7XG5cdHJldHVybiB0aGlzLml0ZXJhdG9yKHRoaXMuYmFjayk7XG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLnJiZWdpbiA9IGZ1bmN0aW9uKCl7XG5cdHJldHVybiB0aGlzLnJpdGVyYXRvcih0aGlzLmJhY2spO1xufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZS5yZW5kID0gZnVuY3Rpb24oKXtcblx0cmV0dXJuIHRoaXMucml0ZXJhdG9yKHRoaXMuZnJvbnQpO1xufVxuXG5JdGVyYXRvci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMuZnJvbnQsIHRoaXMuYmFjaywgdGhpcy5jdXJyZW50KTtcbn1cblxuUmV2ZXJzZUl0ZXJhdG9yLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBuZXcgUmV2ZXJzZUl0ZXJhdG9yKHRoaXMuZnJvbnQsIHRoaXMuYmFjaywgdGhpcy5jdXJyZW50KTtcbn1cblxuSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPVxuUmV2ZXJzZUl0ZXJhdG9yLnByb3RvdHlwZS5wcmV2ID0gZnVuY3Rpb24gKCApIHtcblxuXHRjb25zdCBjID0gdGhpcy5jdXJyZW50ID0gdGhpcy5jdXJyZW50Lm5leHQgO1xuXG5cdHJldHVybiBjID09PSB0aGlzLmJhY2sgPyB7IGRvbmUgOiB0cnVlIH0gOiB7IHZhbHVlIDogYy52YWx1ZSAsIGRvbmUgOiBmYWxzZSB9IDtcblxufVxuXG5JdGVyYXRvci5wcm90b3R5cGUucHJldiA9XG5SZXZlcnNlSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoICkge1xuXG5cdGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQgPSB0aGlzLmN1cnJlbnQucHJldiA7XG5cblx0cmV0dXJuIGMgPT09IHRoaXMuZnJvbnQgPyB7IGRvbmUgOiB0cnVlIH0gOiB7IHZhbHVlIDogYy52YWx1ZSAsIGRvbmUgOiBmYWxzZSB9IDtcblxufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gRG91Ymx5TGlua2VkTGlzdC5wcm90b3R5cGUuYmVnaW4gO1xuRG91Ymx5TGlua2VkTGlzdC5Ob2RlID0gTm9kZTtcbkRvdWJseUxpbmtlZExpc3QuSXRlcmF0b3IgPSBJdGVyYXRvcjtcbkRvdWJseUxpbmtlZExpc3QuUmV2ZXJzZUl0ZXJhdG9yID0gUmV2ZXJzZUl0ZXJhdG9yO1xuXG5cbiJdfQ==