UNPKG

circularr

Version:
113 lines (86 loc) 2.42 kB
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;