"use strict";
|
|
Object.defineProperty(exports, "t", {
|
value: true
|
});
|
|
exports.default = void 0;
|
|
var _Base = _interopRequireDefault(require("./Base"));
|
|
var _ContainerBase = require("../ContainerBase");
|
|
var _throwError = require("../../utils/throwError");
|
|
function _interopRequireDefault(t) {
|
return t && t.t ? t : {
|
default: t
|
};
|
}
|
|
class LinkListIterator extends _ContainerBase.ContainerIterator {
|
constructor(t, i, s, r) {
|
super(r);
|
this.o = t;
|
this.h = i;
|
this.container = s;
|
if (this.iteratorType === 0) {
|
this.pre = function() {
|
if (this.o.L === this.h) {
|
(0, _throwError.throwIteratorAccessError)();
|
}
|
this.o = this.o.L;
|
return this;
|
};
|
this.next = function() {
|
if (this.o === this.h) {
|
(0, _throwError.throwIteratorAccessError)();
|
}
|
this.o = this.o.B;
|
return this;
|
};
|
} else {
|
this.pre = function() {
|
if (this.o.B === this.h) {
|
(0, _throwError.throwIteratorAccessError)();
|
}
|
this.o = this.o.B;
|
return this;
|
};
|
this.next = function() {
|
if (this.o === this.h) {
|
(0, _throwError.throwIteratorAccessError)();
|
}
|
this.o = this.o.L;
|
return this;
|
};
|
}
|
}
|
get pointer() {
|
if (this.o === this.h) {
|
(0, _throwError.throwIteratorAccessError)();
|
}
|
return this.o.l;
|
}
|
set pointer(t) {
|
if (this.o === this.h) {
|
(0, _throwError.throwIteratorAccessError)();
|
}
|
this.o.l = t;
|
}
|
copy() {
|
return new LinkListIterator(this.o, this.h, this.container, this.iteratorType);
|
}
|
}
|
|
class LinkList extends _Base.default {
|
constructor(t = []) {
|
super();
|
this.h = {};
|
this.p = this._ = this.h.L = this.h.B = this.h;
|
const i = this;
|
t.forEach((function(t) {
|
i.pushBack(t);
|
}));
|
}
|
V(t) {
|
const {L: i, B: s} = t;
|
i.B = s;
|
s.L = i;
|
if (t === this.p) {
|
this.p = s;
|
}
|
if (t === this._) {
|
this._ = i;
|
}
|
this.i -= 1;
|
}
|
G(t, i) {
|
const s = i.B;
|
const r = {
|
l: t,
|
L: i,
|
B: s
|
};
|
i.B = r;
|
s.L = r;
|
if (i === this.h) {
|
this.p = r;
|
}
|
if (s === this.h) {
|
this._ = r;
|
}
|
this.i += 1;
|
}
|
clear() {
|
this.i = 0;
|
this.p = this._ = this.h.L = this.h.B = this.h;
|
}
|
begin() {
|
return new LinkListIterator(this.p, this.h, this);
|
}
|
end() {
|
return new LinkListIterator(this.h, this.h, this);
|
}
|
rBegin() {
|
return new LinkListIterator(this._, this.h, this, 1);
|
}
|
rEnd() {
|
return new LinkListIterator(this.h, this.h, this, 1);
|
}
|
front() {
|
return this.p.l;
|
}
|
back() {
|
return this._.l;
|
}
|
getElementByPos(t) {
|
if (t < 0 || t > this.i - 1) {
|
throw new RangeError;
|
}
|
let i = this.p;
|
while (t--) {
|
i = i.B;
|
}
|
return i.l;
|
}
|
eraseElementByPos(t) {
|
if (t < 0 || t > this.i - 1) {
|
throw new RangeError;
|
}
|
let i = this.p;
|
while (t--) {
|
i = i.B;
|
}
|
this.V(i);
|
return this.i;
|
}
|
eraseElementByValue(t) {
|
let i = this.p;
|
while (i !== this.h) {
|
if (i.l === t) {
|
this.V(i);
|
}
|
i = i.B;
|
}
|
return this.i;
|
}
|
eraseElementByIterator(t) {
|
const i = t.o;
|
if (i === this.h) {
|
(0, _throwError.throwIteratorAccessError)();
|
}
|
t = t.next();
|
this.V(i);
|
return t;
|
}
|
pushBack(t) {
|
this.G(t, this._);
|
return this.i;
|
}
|
popBack() {
|
if (this.i === 0) return;
|
const t = this._.l;
|
this.V(this._);
|
return t;
|
}
|
pushFront(t) {
|
this.G(t, this.h);
|
return this.i;
|
}
|
popFront() {
|
if (this.i === 0) return;
|
const t = this.p.l;
|
this.V(this.p);
|
return t;
|
}
|
setElementByPos(t, i) {
|
if (t < 0 || t > this.i - 1) {
|
throw new RangeError;
|
}
|
let s = this.p;
|
while (t--) {
|
s = s.B;
|
}
|
s.l = i;
|
}
|
insert(t, i, s = 1) {
|
if (t < 0 || t > this.i) {
|
throw new RangeError;
|
}
|
if (s <= 0) return this.i;
|
if (t === 0) {
|
while (s--) this.pushFront(i);
|
} else if (t === this.i) {
|
while (s--) this.pushBack(i);
|
} else {
|
let r = this.p;
|
for (let i = 1; i < t; ++i) {
|
r = r.B;
|
}
|
const e = r.B;
|
this.i += s;
|
while (s--) {
|
r.B = {
|
l: i,
|
L: r
|
};
|
r.B.L = r;
|
r = r.B;
|
}
|
r.B = e;
|
e.L = r;
|
}
|
return this.i;
|
}
|
find(t) {
|
let i = this.p;
|
while (i !== this.h) {
|
if (i.l === t) {
|
return new LinkListIterator(i, this.h, this);
|
}
|
i = i.B;
|
}
|
return this.end();
|
}
|
reverse() {
|
if (this.i <= 1) return;
|
let t = this.p;
|
let i = this._;
|
let s = 0;
|
while (s << 1 < this.i) {
|
const r = t.l;
|
t.l = i.l;
|
i.l = r;
|
t = t.B;
|
i = i.L;
|
s += 1;
|
}
|
}
|
unique() {
|
if (this.i <= 1) {
|
return this.i;
|
}
|
let t = this.p;
|
while (t !== this.h) {
|
let i = t;
|
while (i.B !== this.h && i.l === i.B.l) {
|
i = i.B;
|
this.i -= 1;
|
}
|
t.B = i.B;
|
t.B.L = t;
|
t = t.B;
|
}
|
return this.i;
|
}
|
sort(t) {
|
if (this.i <= 1) return;
|
const i = [];
|
this.forEach((function(t) {
|
i.push(t);
|
}));
|
i.sort(t);
|
let s = this.p;
|
i.forEach((function(t) {
|
s.l = t;
|
s = s.B;
|
}));
|
}
|
merge(t) {
|
const i = this;
|
if (this.i === 0) {
|
t.forEach((function(t) {
|
i.pushBack(t);
|
}));
|
} else {
|
let s = this.p;
|
t.forEach((function(t) {
|
while (s !== i.h && s.l <= t) {
|
s = s.B;
|
}
|
i.G(t, s.L);
|
}));
|
}
|
return this.i;
|
}
|
forEach(t) {
|
let i = this.p;
|
let s = 0;
|
while (i !== this.h) {
|
t(i.l, s++, this);
|
i = i.B;
|
}
|
}
|
[Symbol.iterator]() {
|
return function*() {
|
if (this.i === 0) return;
|
let t = this.p;
|
while (t !== this.h) {
|
yield t.l;
|
t = t.B;
|
}
|
}.bind(this)();
|
}
|
}
|
|
var _default = LinkList;
|
|
exports.default = _default;
|
//# sourceMappingURL=LinkList.js.map
|