/* eslint-disable
    max-len,
    no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
let EditorShareJsCodec

export default EditorShareJsCodec = {
  rangeToShareJs(range, lines) {
    let offset = 0
    for (let i = 0; i < lines.length; i++) {
      const line = lines[i]
      offset += i < range.row ? line.length : range.column
    }
    offset += range.row // Include newlines
    return offset
  },

  changeToShareJs(delta, lines) {
    const offset = EditorShareJsCodec.rangeToShareJs(delta.start, lines)

    const text = delta.lines.join('\n')
    switch (delta.action) {
      case 'insert':
        return { i: text, p: offset }
      case 'remove':
        return { d: text, p: offset }
      default:
        throw new Error(`unknown action: ${delta.action}`)
    }
  },

  shareJsOffsetToRowColumn(offset, lines) {
    let row = 0
    for (row = 0; row < lines.length; row++) {
      const line = lines[row]
      if (offset <= line.length) {
        break
      }
      offset -= lines[row].length + 1
    } // + 1 for newline char
    return { row, column: offset }
  },
}
