text editor inspired vim and yi
import ViE.Types

namespace ViE

/-- Convert String to Line (Array Char) -/
def stringToLine (s : String) : Line :=
  s.toList.toArray

/-- Convert Line (Array Char) to String -/
def lineToString (line : Line) : String :=
  String.ofList line.toList

/-- Empty buffer with one empty line -/
def emptyTextBuffer : TextBuffer :=
  #[#[]]

/-- Helper to safely get a line as String. -/
def getLine (buffer : TextBuffer) (n : Row) : Option String :=
  if h : n.val < buffer.size then
    some (lineToString buffer[n.val])
  else
    none

/-- Helper to update a specific line in the buffer. -/
def modifyLine (buffer : TextBuffer) (row : Row) (f : String → String) : TextBuffer :=
  if h : row.val < buffer.size then
    let oldLine := buffer[row.val]
    let newLine := stringToLine (f (lineToString oldLine))
    buffer.set! row.val newLine
  else
    buffer

/-- Set a line directly (String version for compatibility) -/
def setLine (buffer : TextBuffer) (row : Row) (content : String) : TextBuffer :=
  buffer.set! row.val (stringToLine content)


/-- Take first n elements from Array -/
def arrayTake {α : Type _} (arr : Array α) (n : Nat) : Array α :=
  arr.extract 0 n

/-- Drop first n elements from Array -/
def arrayDrop {α : Type _} (arr : Array α) (n : Nat) : Array α :=
  arr.extract n arr.size

/-- Concatenate multiple arrays -/
def arrayConcat {α : Type _} (arrays : List (Array α)) : Array α :=
  arrays.foldl (· ++ ·) #[]

end ViE