Breadbot/node_modules/js-sdsl/dist/cjs/container/SequentialContainer/Deque.js

324 lines
8.9 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "t", {
value: true
});
exports.default = exports.DequeIterator = void 0;
var _Base = _interopRequireDefault(require("./Base"));
var _RandomIterator = require("./Base/RandomIterator");
function _interopRequireDefault(t) {
return t && t.t ? t : {
default: t
};
}
class DequeIterator extends _RandomIterator.RandomIterator {
copy() {
return new DequeIterator(this.I, this.D, this.g, this.m, this.iteratorType);
}
}
exports.DequeIterator = DequeIterator;
class Deque extends _Base.default {
constructor(t = [], i = 1 << 12) {
super();
this.R = 0;
this.k = 0;
this.N = 0;
this.M = 0;
this.u = 0;
this.P = [];
let s;
if ("size" in t) {
if (typeof t.size === "number") {
s = t.size;
} else {
s = t.size();
}
} else if ("length" in t) {
s = t.length;
} else {
throw new RangeError("Can't get container's size!");
}
this.A = i;
this.u = Math.max(Math.ceil(s / this.A), 1);
for (let t = 0; t < this.u; ++t) {
this.P.push(new Array(this.A));
}
const h = Math.ceil(s / this.A);
this.R = this.N = (this.u >> 1) - (h >> 1);
this.k = this.M = this.A - s % this.A >> 1;
t.forEach((t => this.pushBack(t)));
this.size = this.size.bind(this);
this.getElementByPos = this.getElementByPos.bind(this);
this.setElementByPos = this.setElementByPos.bind(this);
}
h() {
const t = [];
const i = Math.max(this.u >> 1, 1);
for (let s = 0; s < i; ++s) {
t[s] = new Array(this.A);
}
for (let i = this.R; i < this.u; ++i) {
t[t.length] = this.P[i];
}
for (let i = 0; i < this.N; ++i) {
t[t.length] = this.P[i];
}
t[t.length] = [ ...this.P[this.N] ];
this.R = i;
this.N = t.length - 1;
for (let s = 0; s < i; ++s) {
t[t.length] = new Array(this.A);
}
this.P = t;
this.u = t.length;
}
F(t) {
const i = this.k + t + 1;
const s = i % this.A;
let h = s - 1;
let e = this.R + (i - s) / this.A;
if (s === 0) e -= 1;
e %= this.u;
if (h < 0) h += this.A;
return {
curNodeBucketIndex: e,
curNodePointerIndex: h
};
}
clear() {
this.P = [ [] ];
this.u = 1;
this.R = this.N = this.o = 0;
this.k = this.M = this.A >> 1;
}
front() {
return this.P[this.R][this.k];
}
back() {
return this.P[this.N][this.M];
}
begin() {
return new DequeIterator(0, this.size, this.getElementByPos, this.setElementByPos);
}
end() {
return new DequeIterator(this.o, this.size, this.getElementByPos, this.setElementByPos);
}
rBegin() {
return new DequeIterator(this.o - 1, this.size, this.getElementByPos, this.setElementByPos, 1);
}
rEnd() {
return new DequeIterator(-1, this.size, this.getElementByPos, this.setElementByPos, 1);
}
pushBack(t) {
if (this.o) {
if (this.M < this.A - 1) {
this.M += 1;
} else if (this.N < this.u - 1) {
this.N += 1;
this.M = 0;
} else {
this.N = 0;
this.M = 0;
}
if (this.N === this.R && this.M === this.k) this.h();
}
this.o += 1;
this.P[this.N][this.M] = t;
}
popBack() {
if (!this.o) return;
this.P[this.N][this.M] = undefined;
if (this.o !== 1) {
if (this.M > 0) {
this.M -= 1;
} else if (this.N > 0) {
this.N -= 1;
this.M = this.A - 1;
} else {
this.N = this.u - 1;
this.M = this.A - 1;
}
}
this.o -= 1;
}
pushFront(t) {
if (this.o) {
if (this.k > 0) {
this.k -= 1;
} else if (this.R > 0) {
this.R -= 1;
this.k = this.A - 1;
} else {
this.R = this.u - 1;
this.k = this.A - 1;
}
if (this.R === this.N && this.k === this.M) this.h();
}
this.o += 1;
this.P[this.R][this.k] = t;
}
popFront() {
if (!this.o) return;
this.P[this.R][this.k] = undefined;
if (this.o !== 1) {
if (this.k < this.A - 1) {
this.k += 1;
} else if (this.R < this.u - 1) {
this.R += 1;
this.k = 0;
} else {
this.R = 0;
this.k = 0;
}
}
this.o -= 1;
}
forEach(t) {
for (let i = 0; i < this.o; ++i) {
t(this.getElementByPos(i), i);
}
}
getElementByPos(t) {
if (t < 0 || t > this.o - 1) {
throw new RangeError;
}
const {curNodeBucketIndex: i, curNodePointerIndex: s} = this.F(t);
return this.P[i][s];
}
setElementByPos(t, i) {
if (t < 0 || t > this.o - 1) {
throw new RangeError;
}
const {curNodeBucketIndex: s, curNodePointerIndex: h} = this.F(t);
this.P[s][h] = i;
}
insert(t, i, s = 1) {
if (t < 0 || t > this.o) {
throw new RangeError;
}
if (t === 0) {
while (s--) this.pushFront(i);
} else if (t === this.o) {
while (s--) this.pushBack(i);
} else {
const h = [];
for (let i = t; i < this.o; ++i) {
h.push(this.getElementByPos(i));
}
this.cut(t - 1);
for (let t = 0; t < s; ++t) this.pushBack(i);
for (let t = 0; t < h.length; ++t) this.pushBack(h[t]);
}
}
cut(t) {
if (t < 0) {
this.clear();
return;
}
const {curNodeBucketIndex: i, curNodePointerIndex: s} = this.F(t);
this.N = i;
this.M = s;
this.o = t + 1;
}
eraseElementByPos(t) {
if (t < 0 || t > this.o - 1) {
throw new RangeError;
}
if (t === 0) this.popFront(); else if (t === this.o - 1) this.popBack(); else {
const i = [];
for (let s = t + 1; s < this.o; ++s) {
i.push(this.getElementByPos(s));
}
this.cut(t);
this.popBack();
i.forEach((t => this.pushBack(t)));
}
}
eraseElementByValue(t) {
if (!this.o) return;
const i = [];
for (let s = 0; s < this.o; ++s) {
const h = this.getElementByPos(s);
if (h !== t) i.push(h);
}
const s = i.length;
for (let t = 0; t < s; ++t) this.setElementByPos(t, i[t]);
this.cut(s - 1);
}
eraseElementByIterator(t) {
const i = t.I;
this.eraseElementByPos(i);
t = t.next();
return t;
}
find(t) {
for (let i = 0; i < this.o; ++i) {
if (this.getElementByPos(i) === t) {
return new DequeIterator(i, this.size, this.getElementByPos, this.setElementByPos);
}
}
return this.end();
}
reverse() {
let t = 0;
let i = this.o - 1;
while (t < i) {
const s = this.getElementByPos(t);
this.setElementByPos(t, this.getElementByPos(i));
this.setElementByPos(i, s);
t += 1;
i -= 1;
}
}
unique() {
if (this.o <= 1) return;
let t = 1;
let i = this.getElementByPos(0);
for (let s = 1; s < this.o; ++s) {
const h = this.getElementByPos(s);
if (h !== i) {
i = h;
this.setElementByPos(t++, h);
}
}
while (this.o > t) this.popBack();
}
sort(t) {
const i = [];
for (let t = 0; t < this.o; ++t) {
i.push(this.getElementByPos(t));
}
i.sort(t);
for (let t = 0; t < this.o; ++t) this.setElementByPos(t, i[t]);
}
shrinkToFit() {
if (!this.o) return;
const t = [];
this.forEach((i => t.push(i)));
this.u = Math.max(Math.ceil(this.o / this.A), 1);
this.o = this.R = this.N = this.k = this.M = 0;
this.P = [];
for (let t = 0; t < this.u; ++t) {
this.P.push(new Array(this.A));
}
for (let i = 0; i < t.length; ++i) this.pushBack(t[i]);
}
[Symbol.iterator]() {
return function*() {
for (let t = 0; t < this.o; ++t) {
yield this.getElementByPos(t);
}
}.bind(this)();
}
}
var _default = Deque;
exports.default = _default;