import System.Environment import System.Directory import System.IO import Data.List import Control.Exception import Control.Monad(when) fileName = "todo.txt" dispatch :: String -> String -> IO () dispatch file "add" = add file dispatch file "view" = view file dispatch file "rm" = remove file dispatch file _ = do putStrLn "Operations supported:\nadd - Append Item\nview - Inspect Item\nrm - Remove Item" view file = do contents <- readFile file let todoTasks = lines contents putStr $ unlines $ number todoTasks add file = do todoItem <- getLine when (not $ null todoItem) (do appendFile file todoItem) remove file = do contents <- readFile file numberString <- getLine let todoTasks = lines contents number = read numberString newTodoList = unlines $ delete (todoTasks !! number) todoTasks bracketOnError (openTempFile "." "temp") (\(tempName,tempHandle) -> do hClose tempHandle removeFile tempName) (\(tempName,tempHandle) -> do hPutStr tempHandle newTodoList hClose tempHandle removeFile file renameFile tempName file) number task = zipWith (\n line -> show n ++ " - " ++ line) [0..] task main = do line <- getLine if null line then return () else (do dispatch fileName line main)