text: /*---------------------------------------------------------------------------------------------
   *  Copyright (c) Microsoft Corporation. All rights reserved.
   *  Licensed under the MIT License. See License.txt in the project root for license information.
   *--------------------------------------------------------------------------------------------*/
  import { Position } from '../core/position.js';
  import { PrefixSumComputer } from '../viewModel/prefixSumComputer.js';
  var MirrorTextModel = /** @class */ (function () {
      function MirrorTextModel(uri, lines, eol, versionId) {
          this._uri = uri;
          this._lines = lines;
          this._eol = eol;
          this._versionId = versionId;
          this._lineStarts = null;
      }
      MirrorTextModel.prototype.dispose = function () {
          this._lines.length = 0;
      };
      MirrorTextModel.prototype.getText = function () {
          return this._lines.join(this._eol);
      };
      MirrorTextModel.prototype.onEvents = function (e) {
          if (e.eol && e.eol !== this._eol) {
              this._eol = e.eol;
              this._lineStarts = null;
          }
          // Update my lines
          var changes = e.changes;
          for (var _i = 0, changes_1 = changes; _i < changes_1.length; _i++) {
              var change = changes_1[_i];
              this._acceptDeleteRange(change.range);
              this._acceptInsertText(new Position(change.range.startLineNumber, change.range.startColumn), change.text);
          }
          this._versionId = e.versionId;
      };
      MirrorTextModel.prototype._ensureLineStarts = function () {
          if (!this._lineStarts) {
              var eolLength = this._eol.length;
              var linesLength = this._lines.length;
              var lineStartValues = new Uint32Array(linesLength);
              for (var i = 0; i < linesLength; i++) {
                  lineStartValues[i] = this._lines[i].length + eolLength;
              }
              this._lineStarts = new PrefixSumComputer(lineStartValues);
          }
      };
      /**
       * All changes to a line's text go through this method
       */
      MirrorTextModel.prototype._setLineText = function (lineIndex, newValue) {
          this._lines[lineIndex] = newValue;
          if (this._lineStarts) {
              // update prefix sum
              this._lineStarts.changeValue(lineIndex, this._lines[lineIndex].length + this._eol.length);
          }
      };
      MirrorTextModel.prototype._acceptDeleteRange = function (range) {
          if (range.startLineNumber === range.endLineNumber) {
              if (range.startColumn === range.endColumn) {
                  // Nothing to delete
                  return;
              }
              // Delete text on the affected line
              this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1)
                  + this._lines[range.startLineNumber - 1].substring(range.endColumn - 1));
              return;
          }
          // Take remaining text on last line and append it to remaining text on first line
          this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1)
              + this._lines[range.endLineNumber - 1].substring(range.endColumn - 1));
          // Delete middle lines
          this._lines.splice(range.startLineNumber, range.endLineNumber - range.startLineNumber);
          if (this._lineStarts) {
              // update prefix sum
              this._lineStarts.removeValues(range.startLineNumber, range.endLineNumber - range.startLineNumber);
          }
      };
      MirrorTextModel.prototype._acceptInsertText = function (position, insertText) {
          if (insertText.length === 0) {
              // Nothing to insert
              return;
          }
          var insertLines = insertText.split(/\r\n|\r|\n/);
          if (insertLines.length === 1) {
              // Inserting text on one line
              this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1)
                  + insertLines[0]
                  + this._lines[position.lineNumber - 1].substring(position.column - 1));
              return;
          }
          // Append overflowing text from first line to the end of text to insert
          insertLines[insertLines.length - 1] += this._lines[position.lineNumber - 1].substring(position.column - 1);
          // Delete overflowing text from first line and insert text on first line
          this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1)
              + insertLines[0]);
          // Insert new lines & store lengths
          var newLengths = new Uint32Array(insertLines.length - 1);
          for (var i = 1; i < insertLines.length; i++) {
              this._lines.splice(position.lineNumber + i - 1, 0, insertLines[i]);
              newLengths[i - 1] = insertLines[i].length + this._eol.length;
          }
          if (this._lineStarts) {
              // update prefix sum
              this._lineStarts.insertValues(position.lineNumber, newLengths);
          }
      };
      return MirrorTextModel;
  }());
  export { MirrorTextModel };
  