export const lineSplitRE = /\r?\n/

export function positionToOffset(
  source: string,
  lineNumber: number,
  columnNumber: number,
): number {
  const lines = source.split(lineSplitRE)
  const nl = /\r\n/.test(source) ? 2 : 1
  let start = 0

  if (lineNumber > lines.length)
    return source.length

  for (let i = 0; i < lineNumber - 1; i++)
    start += lines[i].length + nl

  return start + columnNumber
}

export function offsetToLineNumber(
  source: string,
  offset: number,
): number {
  if (offset > source.length) {
    throw new Error(
      `offset is longer than source length! offset ${offset} > length ${source.length}`,
    )
  }
  const lines = source.split(lineSplitRE)
  const nl = /\r\n/.test(source) ? 2 : 1
  let counted = 0
  let line = 0
  for (; line < lines.length; line++) {
    const lineLength = lines[line].length + nl
    if (counted + lineLength >= offset)
      break

    counted += lineLength
  }
  return line + 1
}
