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 (Field a -> Field a -> Bool
(Field a -> Field a -> Bool)
-> (Field a -> Field a -> Bool) -> Eq (Field a)
forall a. Eq a => Field a -> Field a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Field a -> Field a -> Bool
$c/= :: forall a. Eq a => Field a -> Field a -> Bool
== :: Field a -> Field a -> Bool
$c== :: forall a. Eq a => Field a -> Field a -> Bool
Eq, Eq (Field a)
Eq (Field a)
-> (Field a -> Field a -> Ordering)
-> (Field a -> Field a -> Bool)
-> (Field a -> Field a -> Bool)
-> (Field a -> Field a -> Bool)
-> (Field a -> Field a -> Bool)
-> (Field a -> Field a -> Field a)
-> (Field a -> Field a -> Field a)
-> Ord (Field a)
Field a -> Field a -> Bool
Field a -> Field a -> Ordering
Field a -> Field a -> Field a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Field a)
forall a. Ord a => Field a -> Field a -> Bool
forall a. Ord a => Field a -> Field a -> Ordering
forall a. Ord a => Field a -> Field a -> Field a
min :: Field a -> Field a -> Field a
$cmin :: forall a. Ord a => Field a -> Field a -> Field a
max :: Field a -> Field a -> Field a
$cmax :: forall a. Ord a => Field a -> Field a -> Field a
>= :: Field a -> Field a -> Bool
$c>= :: forall a. Ord a => Field a -> Field a -> Bool
> :: Field a -> Field a -> Bool
$c> :: forall a. Ord a => Field a -> Field a -> Bool
<= :: Field a -> Field a -> Bool
$c<= :: forall a. Ord a => Field a -> Field a -> Bool
< :: Field a -> Field a -> Bool
$c< :: forall a. Ord a => Field a -> Field a -> Bool
compare :: Field a -> Field a -> Ordering
$ccompare :: forall a. Ord a => Field a -> Field a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (Field a)
Ord)

createField :: [a] -> Field a
createField [a]
s = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [] [a]
s []

createField2 :: ([a], [a]) -> Field a
createField2 ([a]
before, [a]
after) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
before) [] [a]
after

getField :: Field a -> [a]
getField (F [a]
l [a]
c [a]
r) = [a] -> [a]
forall a. [a] -> [a]
reverse [a]
l [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
c [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
r

showField :: ([a] -> b -> b) -> ([a] -> b -> b) -> Field a -> b -> b
showField [a] -> b -> b
show' [a] -> b -> b
show_cursor (F [a]
l [a]
c [a]
r) =
    [a] -> b -> b
show' [a]
r (b -> b) -> (b -> b) -> b -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> b -> b
show_cursor [a]
c (b -> b) -> (b -> b) -> b -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> b -> b
show' ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
l)

insertItem :: Field a -> a -> Field a
insertItem (F [a]
l [a]
c [a]
r) a
i = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F (a
i a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
l) [] [a]
r
insertItemsSelected :: Field a -> [a] -> Field a
insertItemsSelected (F [a]
l [a]
c [a]
r) [a]
i = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l [a]
i [a]
r

deleteItemLeft :: Field a -> Field a
deleteItemLeft f :: Field a
f@(F [] [] [a]
_) = Field a
f
deleteItemLeft (F (a
i : [a]
l) [] [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l [] [a]
r
deleteItemLeft (F [a]
l [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l [] [a]
r

deleteItemRight :: Field a -> Field a
deleteItemRight f :: Field a
f@(F [a]
_ [] []) = Field a
f
deleteItemRight (F [a]
l [] (a
i : [a]
r)) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l [] [a]
r
deleteItemRight (F [a]
l [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l [] [a]
r

deleteToEnd :: Field a -> Field a
deleteToEnd (F [a]
l [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l [] []
deleteToHome :: Field a -> Field a
deleteToHome (F [a]
l [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [] [] [a]
r

extendCursorRight :: Field a -> Field a
extendCursorRight (F [a]
l [a]
c (a
i : [a]
r)) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l ([a]
c [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
i]) [a]
r
extendCursorRight f :: Field a
f@(F [a]
_ [a]
_ []) = Field a
f

extendCursorLeft :: Field a -> Field a
extendCursorLeft (F (a
i : [a]
l) [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l (a
i a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
c) [a]
r
extendCursorLeft f :: Field a
f@(F [] [a]
_ [a]
_) = Field a
f

moveCursorLeft :: Field a -> Field a
moveCursorLeft f :: Field a
f@(F [] [] [a]
_) = Field a
f
moveCursorLeft (F (a
i : [a]
l) [] [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l [] (a
i a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
r)
moveCursorLeft (F [a]
l [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l [] ([a]
c [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
r)

moveCursorRight :: Field a -> Field a
moveCursorRight f :: Field a
f@(F [a]
_ [] []) = Field a
f
moveCursorRight (F [a]
l [] (a
i : [a]
r)) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F (a
i a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
l) [] [a]
r
moveCursorRight (F [a]
l [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
c [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
l) [] [a]
r

moveCursorHome :: Field a -> Field a
moveCursorHome Field a
f = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [] [] (Field a -> [a]
forall a. Field a -> [a]
getField Field a
f)
moveCursorEnd :: Field a -> Field a
moveCursorEnd  Field a
f = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F ([a] -> [a]
forall a. [a] -> [a]
reverse (Field a -> [a]
forall a. Field a -> [a]
getField Field a
f)) [] []

extendCursorHome :: Field a -> Field a
extendCursorHome (F [a]
l [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [] ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
l[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
c) [a]
r
extendCursorEnd :: Field a -> Field a
extendCursorEnd (F [a]
l [a]
c [a]
r) = [a] -> [a] -> [a] -> Field a
forall a. [a] -> [a] -> [a] -> Field a
F [a]
l ([a]
c[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
r) []