There is a nice thing about having multiline fields use a FieldState, just like single line ones do. Which is that switching between the two is really easy. These two problems lead me to think that providing the user with a single String and then making them preform 'lines' and 'unlines' manually is more reasonable, it is more compatible with single line fields and it provides more guarantees.
I propose that we change FieldState to
type FieldState = {string:String, selectionStart:CursorPosition, selectionEnd:CursorPosition}
data CursorPosition
= Absolute Int
| LineColumn {line:Int,column:Int}
{-| Return the absolute selection start position in the text. -}
absoluteStartPosition: FieldState -> Int
{-| Return the absolute selection end position in the text. -}
absoluteEndPosition: FieldState -> Int
{-| Return the line column selection start position in the text -}
lineColumnStartPosition: FieldState -> {line:Int,column:Int}
{-| Return the line column selection end position in the text -}
lineColumnEndPosition: FieldState -> {line:Int,column:Int}
Tim