circularr
Version:
Circular fixed size array
160 lines (136 loc) • 4.03 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _Symbol$iterator;
_Symbol$iterator = Symbol.iterator;
var Circularr = function () {
(0, _createClass2.default)(Circularr, null, [{
key: "from",
value: function from(source) {
var arr = new Circularr(source.length);
for (var i = 0; i < source.length; i++) {
arr._data[i] = source[i];
}
return arr;
}
}]);
function Circularr(length) {
(0, _classCallCheck2.default)(this, Circularr);
(0, _defineProperty2.default)(this, "_data", void 0);
(0, _defineProperty2.default)(this, "_index", void 0);
this._data = new Array(length);
this._index = 0;
}
(0, _createClass2.default)(Circularr, [{
key: _Symbol$iterator,
value: _regenerator.default.mark(function value() {
var i;
return _regenerator.default.wrap(function value$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
i = 0;
case 1:
if (!(i < this._data.length)) {
_context.next = 7;
break;
}
_context.next = 4;
return this._data[(i + this._index) % this._data.length];
case 4:
i++;
_context.next = 1;
break;
case 7:
case "end":
return _context.stop();
}
}
}, value, this);
})
}, {
key: "fill",
value: function fill(value) {
for (var i = 0; i < this._data.length; i++) {
this._data[i] = value;
}
this._index = 0;
return this;
}
}, {
key: "clear",
value: function clear() {
this._data = new Array(this._data.length);
this._index = 0;
return this;
}
}, {
key: "shift",
value: function shift(value) {
var returnValue = this._data[this._index];
this._data[this._index] = value;
this._index = (this._index + 1) % this._data.length;
return returnValue;
}
}, {
key: "unshift",
value: function unshift(value) {
this._index = (this._index + this._data.length - 1) % this._data.length;
var returnValue = this._data[this._index];
this._data[this._index] = value;
return returnValue;
}
}, {
key: "slice",
value: function slice(startIndex, endIndex) {
return Circularr.from(Array.from(this).slice(startIndex, endIndex));
}
}, {
key: "trim",
value: function trim() {
var data = Array.from(this);
var startIndex = 0;
var endIndex = data.length;
for (var i = 0; i < data.length; i++) {
if (typeof data[i] !== 'undefined') {
break;
}
startIndex++;
}
for (var _i = data.length - 1; _i >= 0; --_i) {
if (typeof data[_i] !== 'undefined') {
break;
}
endIndex--;
}
return Circularr.from(data.slice(startIndex, endIndex));
}
}, {
key: "at",
value: function at(index) {
if (index < 0 || index >= this._data.length) {
return;
}
return this._data[(index + this._index) % this._data.length];
}
}, {
key: "wrapAt",
value: function wrapAt(index) {
return this._data[(index + this._index) % this._data.length];
}
}, {
key: "length",
get: function get() {
return this._data.length;
}
}]);
return Circularr;
}();
exports.default = Circularr;
//# sourceMappingURL=index.js.map