import { _ as _createClass, a as _classCallCheck, b as _objectWithoutProperties } from '../../_rollupPluginBabelHelpers-b054ecd2.js'; import ChangeDetails from '../../core/change-details.js'; import { isString } from '../../core/utils.js'; import ContinuousTailDetails from '../../core/continuous-tail-details.js'; import IMask from '../../core/holder.js'; var _excluded = ["chunks"]; var ChunksTailDetails = /*#__PURE__*/function () { /** */ function ChunksTailDetails() { var chunks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; _classCallCheck(this, ChunksTailDetails); this.chunks = chunks; this.from = from; } _createClass(ChunksTailDetails, [{ key: "toString", value: function toString() { return this.chunks.map(String).join(''); } // $FlowFixMe no ideas }, { key: "extend", value: function extend(tailChunk) { if (!String(tailChunk)) return; if (isString(tailChunk)) tailChunk = new ContinuousTailDetails(String(tailChunk)); var lastChunk = this.chunks[this.chunks.length - 1]; var extendLast = lastChunk && ( // if stops are same or tail has no stop lastChunk.stop === tailChunk.stop || tailChunk.stop == null) && // if tail chunk goes just after last chunk tailChunk.from === lastChunk.from + lastChunk.toString().length; if (tailChunk instanceof ContinuousTailDetails) { // check the ability to extend previous chunk if (extendLast) { // extend previous chunk lastChunk.extend(tailChunk.toString()); } else { // append new chunk this.chunks.push(tailChunk); } } else if (tailChunk instanceof ChunksTailDetails) { if (tailChunk.stop == null) { // unwrap floating chunks to parent, keeping `from` pos var firstTailChunk; while (tailChunk.chunks.length && tailChunk.chunks[0].stop == null) { firstTailChunk = tailChunk.chunks.shift(); firstTailChunk.from += tailChunk.from; this.extend(firstTailChunk); } } // if tail chunk still has value if (tailChunk.toString()) { // if chunks contains stops, then popup stop to container tailChunk.stop = tailChunk.blockIndex; this.chunks.push(tailChunk); } } } }, { key: "appendTo", value: function appendTo(masked) { // $FlowFixMe if (!(masked instanceof IMask.MaskedPattern)) { var tail = new ContinuousTailDetails(this.toString()); return tail.appendTo(masked); } var details = new ChangeDetails(); for (var ci = 0; ci < this.chunks.length && !details.skip; ++ci) { var chunk = this.chunks[ci]; var lastBlockIter = masked._mapPosToBlock(masked.value.length); var stop = chunk.stop; var chunkBlock = void 0; if (stop != null && ( // if block not found or stop is behind lastBlock !lastBlockIter || lastBlockIter.index <= stop)) { if (chunk instanceof ChunksTailDetails || // for continuous block also check if stop is exist masked._stops.indexOf(stop) >= 0) { details.aggregate(masked._appendPlaceholder(stop)); } chunkBlock = chunk instanceof ChunksTailDetails && masked._blocks[stop]; } if (chunkBlock) { var tailDetails = chunkBlock.appendTail(chunk); tailDetails.skip = false; // always ignore skip, it will be set on last details.aggregate(tailDetails); masked._value += tailDetails.inserted; // get not inserted chars var remainChars = chunk.toString().slice(tailDetails.rawInserted.length); if (remainChars) details.aggregate(masked.append(remainChars, { tail: true })); } else { details.aggregate(masked.append(chunk.toString(), { tail: true })); } } return details; } }, { key: "state", get: function get() { return { chunks: this.chunks.map(function (c) { return c.state; }), from: this.from, stop: this.stop, blockIndex: this.blockIndex }; }, set: function set(state) { var chunks = state.chunks, props = _objectWithoutProperties(state, _excluded); Object.assign(this, props); this.chunks = chunks.map(function (cstate) { var chunk = "chunks" in cstate ? new ChunksTailDetails() : new ContinuousTailDetails(); // $FlowFixMe already checked above chunk.state = cstate; return chunk; }); } }, { key: "unshift", value: function unshift(beforePos) { if (!this.chunks.length || beforePos != null && this.from >= beforePos) return ''; var chunkShiftPos = beforePos != null ? beforePos - this.from : beforePos; var ci = 0; while (ci < this.chunks.length) { var chunk = this.chunks[ci]; var shiftChar = chunk.unshift(chunkShiftPos); if (chunk.toString()) { // chunk still contains value // but not shifted - means no more available chars to shift if (!shiftChar) break; ++ci; } else { // clean if chunk has no value this.chunks.splice(ci, 1); } if (shiftChar) return shiftChar; } return ''; } }, { key: "shift", value: function shift() { if (!this.chunks.length) return ''; var ci = this.chunks.length - 1; while (0 <= ci) { var chunk = this.chunks[ci]; var shiftChar = chunk.shift(); if (chunk.toString()) { // chunk still contains value // but not shifted - means no more available chars to shift if (!shiftChar) break; --ci; } else { // clean if chunk has no value this.chunks.splice(ci, 1); } if (shiftChar) return shiftChar; } return ''; } }]); return ChunksTailDetails; }(); export { ChunksTailDetails as default };