StringEdit

module StringEdit(
       moveCursorHome,moveCursorEnd,extendCursorHome,extendCursorEnd,
       moveCursorRight, moveCursorLeft, extendCursorLeft,extendCursorRight,
       deleteItemRight, deleteItemLeft, deleteToEnd, deleteToHome,
       insertItem, insertItemsSelected, showField, getField,
       createField2, createField, Field) where

data Field a = F [a] [a] [a]  deriving (Eq, Ord)

createField s = F [] s []

createField2 (before, after) = F (reverse before) [] after

getField (F l c r) = reverse l ++ c ++ r

showField show' show_cursor (F l c r) =
    show' r . show_cursor c . show' (reverse l)

insertItem (F l c r) i = F (i : l) [] r
insertItemsSelected (F l c r) i = F l i r

deleteItemLeft f@(F [] [] _) = f
deleteItemLeft (F (i : l) [] r) = F l [] r
deleteItemLeft (F l c r) = F l [] r

deleteItemRight f@(F _ [] []) = f
deleteItemRight (F l [] (i : r)) = F l [] r
deleteItemRight (F l c r) = F l [] r

deleteToEnd (F l c r) = F l [] []
deleteToHome (F l c r) = F [] [] r

extendCursorRight (F l c (i : r)) = F l (c ++ [i]) r
extendCursorRight f@(F _ _ []) = f

extendCursorLeft (F (i : l) c r) = F l (i : c) r
extendCursorLeft f@(F [] _ _) = f

moveCursorLeft f@(F [] [] _) = f
moveCursorLeft (F (i : l) [] r) = F l [] (i : r)
moveCursorLeft (F l c r) = F l [] (c ++ r)

moveCursorRight f@(F _ [] []) = f
moveCursorRight (F l [] (i : r)) = F (i : l) [] r
moveCursorRight (F l c r) = F (reverse c ++ l) [] r

moveCursorHome f = F [] [] (getField f)
moveCursorEnd  f = F (reverse (getField f)) [] []

extendCursorHome (F l c r) = F [] (reverse l++c) r
extendCursorEnd (F l c r) = F l (c++r) []