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) []