circularr
Version:
Circular fixed size array
113 lines (86 loc) • 2.42 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
let _Symbol$iterator;
_Symbol$iterator = Symbol.iterator;
class Circularr {
static from(source) {
const arr = new Circularr(source.length);
for (let i = 0; i < source.length; i++) {
arr._data[i] = source[i];
}
return arr;
}
constructor(length) {
(0, _defineProperty2.default)(this, "_data", void 0);
(0, _defineProperty2.default)(this, "_index", void 0);
this._data = new Array(length);
this._index = 0;
}
*[_Symbol$iterator]() {
for (let i = 0; i < this._data.length; i++) {
yield this._data[(i + this._index) % this._data.length];
}
}
get length() {
return this._data.length;
}
fill(value) {
for (let i = 0; i < this._data.length; i++) {
this._data[i] = value;
}
this._index = 0;
return this;
}
clear() {
this._data = new Array(this._data.length);
this._index = 0;
return this;
}
shift(value) {
const returnValue = this._data[this._index];
this._data[this._index] = value;
this._index = (this._index + 1) % this._data.length;
return returnValue;
}
unshift(value) {
this._index = (this._index + this._data.length - 1) % this._data.length;
const returnValue = this._data[this._index];
this._data[this._index] = value;
return returnValue;
}
slice(startIndex, endIndex) {
return Circularr.from(Array.from(this).slice(startIndex, endIndex));
}
trim() {
const data = Array.from(this);
let startIndex = 0;
let endIndex = data.length;
for (let i = 0; i < data.length; i++) {
if (typeof data[i] !== 'undefined') {
break;
}
startIndex++;
}
for (let i = data.length - 1; i >= 0; --i) {
if (typeof data[i] !== 'undefined') {
break;
}
endIndex--;
}
return Circularr.from(data.slice(startIndex, endIndex));
}
at(index) {
if (index < 0 || index >= this._data.length) {
return;
}
return this._data[(index + this._index) % this._data.length];
}
wrapAt(index) {
return this._data[(index + this._index) % this._data.length];
}
}
exports.default = Circularr;