module EditorBetter where

import Data.Maybe(fromMaybe)

-- A very simple text editor, but more efficient
data Editor = Ed  { before :: [Char]  -- In reverse order
                  , cursor :: Maybe Char
                  , after  :: [Char] }

empty :: Editor
empty = Ed [] Nothing []

go_left :: Editor-> Editor
go_left e@(Ed [] _ _) = e
go_left (Ed (a:as) (Just c) bs) = Ed as (Just a) (c: bs)

go_right :: Editor-> Editor
go_right e@(Ed _ _ []) = e
go_right (Ed as (Just c) (b:bs)) = Ed (c:as) (Just b) bs

-- Insert a char to the right of the cursor, move cursor
insert :: Char-> Editor-> Editor
insert t (Ed as Nothing bs) = Ed as (Just t) bs
insert t (Ed as (Just c) bs) = Ed (c:as) (Just t) bs

-- Delete character under the cursor
delete :: Editor-> Editor
delete (Ed as _ (b:bs)) = Ed as (Just b) bs
delete (Ed (a:as) _ []) = Ed as (Just a) []
delete (Ed [] _ []) = Ed [] Nothing []

-- Remove character to the left of cursor
remove :: Editor-> Editor
remove = delete . go_left

-- Insert a string: successively insert characters
insert_str :: String-> Editor-> Editor
insert_str = flip $ foldl (flip insert)

instance Show Editor where
  show (Ed as c bs) =
    reverse as ++ fromMaybe '?' c:bs ++"\n" ++ replicate (length as) ' ' ++ "^"