module ListRequest where

default (Int)

data ListRequest a
  = ReplaceItems Int Int [a] -- from, how many, new lines
  | HighlightItems [Int]     -- replaces list of highlighted lines
  | PickItem Int            -- as if user clicked on a line
listEnd :: Int
listEnd = -Int
1

replaceAll :: [a] -> ListRequest a
replaceAll          = Int -> Int -> [a] -> ListRequest a
forall a. Int -> Int -> [a] -> ListRequest a
ReplaceItems Int
0    Int
listEnd           -- replace all text
replaceAllFrom :: Int -> [a] -> ListRequest a
replaceAllFrom Int
from = Int -> Int -> [a] -> ListRequest a
forall a. Int -> Int -> [a] -> ListRequest a
ReplaceItems Int
from Int
listEnd
deleteItems :: Int -> Int -> ListRequest a
deleteItems Int
from Int
cnt = Int -> Int -> [a] -> ListRequest a
forall a. Int -> Int -> [a] -> ListRequest a
ReplaceItems Int
from Int
cnt     []
insertItems :: Int -> [a] -> ListRequest a
insertItems Int
from     = Int -> Int -> [a] -> ListRequest a
forall a. Int -> Int -> [a] -> ListRequest a
ReplaceItems Int
from Int
0
appendItems :: [a] -> ListRequest a
appendItems          = Int -> Int -> [a] -> ListRequest a
forall a. Int -> Int -> [a] -> ListRequest a
ReplaceItems Int
listEnd Int
listEnd
changeItems :: Int -> [a] -> ListRequest a
changeItems Int
from [a]
txt = Int -> Int -> [a] -> ListRequest a
forall a. Int -> Int -> [a] -> ListRequest a
ReplaceItems Int
from ([a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
txt) [a]
txt

replaceItems :: Int -> Int -> [a] -> ListRequest a
replaceItems = Int -> Int -> [a] -> ListRequest a
forall a. Int -> Int -> [a] -> ListRequest a
ReplaceItems
highlightItems :: [Int] -> ListRequest a
highlightItems = [Int] -> ListRequest a
forall a. [Int] -> ListRequest a
HighlightItems
pickItem :: Int -> ListRequest a
pickItem = Int -> ListRequest a
forall a. Int -> ListRequest a
PickItem

--applyListRequest (ReplaceItems 0 cnt newtxt) oldtxt | cnt==listEnd = newtxt
applyListRequest :: ListRequest a -> [a] -> [a]
applyListRequest (ReplaceItems Int
from Int
cnt [a]
newtxt) [a]
oldtxt =
  let before :: [a]
before = if Int
fromInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
listEnd
               then [a]
oldtxt
	       else Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
from [a]
oldtxt
      after :: [a]
after  = if Int
fromInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
listEnd Bool -> Bool -> Bool
|| Int
cntInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
listEnd
               then []
	       else Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop (Int
fromInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
cnt) [a]
oldtxt
  in [a]
before[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
newtxt[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
after
applyListRequest ListRequest a
_ [a]
oldtxt = [a]
oldtxt