Compare commits
3 Commits
75c0b88d29
...
770c751d14
Author | SHA1 | Date | |
---|---|---|---|
770c751d14 | |||
5c766c5e89 | |||
6bbe5f60f5 |
175
app/Main.hs
175
app/Main.hs
@ -1,4 +1,4 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
module Main(main, parseTask, serializeTask, getPriority, comparePriority, TaskMap) where
|
module Main(main, parseTask, serializeTask, getPriority, comparePriority, TaskMap) where
|
||||||
|
|
||||||
@ -26,20 +26,27 @@ main = do
|
|||||||
putStrLn "Welcome to the Haskell Todo App"
|
putStrLn "Welcome to the Haskell Todo App"
|
||||||
putStrLn "1. Display tasks"
|
putStrLn "1. Display tasks"
|
||||||
putStrLn "2. Add task"
|
putStrLn "2. Add task"
|
||||||
putStrLn "3. Filter tasks by tag"
|
putStrLn "3. Add task (Manual)"
|
||||||
putStrLn "4. Sort tasks by priority"
|
putStrLn "4. Edit task"
|
||||||
putStrLn "5. Exit"
|
putStrLn "5. Filter tasks by tag"
|
||||||
|
putStrLn "6. Sort tasks by priority"
|
||||||
|
putStrLn "7. Remove task"
|
||||||
|
putStrLn "8. Exit"
|
||||||
putStr "Choose an option: "
|
putStr "Choose an option: "
|
||||||
hFlush stdout
|
hFlush stdout
|
||||||
option <- getLine
|
option <- getLine
|
||||||
case option of
|
case option of
|
||||||
"1" -> displayTasks
|
"1" -> displayTasks
|
||||||
"2" -> addTask
|
"2" -> addTask
|
||||||
"3" -> filterTasksByTag
|
"3" -> addTaskWithManual
|
||||||
"4" -> sortTasksByPriority
|
"4" -> editTask
|
||||||
"5" -> putStrLn "Goodbye!"
|
"5" -> filterTasksByTag
|
||||||
|
"6" -> sortTasksByPriority
|
||||||
|
"7" -> removeTask
|
||||||
|
"8" -> putStrLn "Goodbye!"
|
||||||
_ -> putStrLn "Invalid option" >> main
|
_ -> putStrLn "Invalid option" >> main
|
||||||
|
|
||||||
|
|
||||||
displayTasks :: IO ()
|
displayTasks :: IO ()
|
||||||
displayTasks = do
|
displayTasks = do
|
||||||
exists <- doesFileExist todoFile
|
exists <- doesFileExist todoFile
|
||||||
@ -50,12 +57,16 @@ displayTasks = do
|
|||||||
putStrLn "Tasks:"
|
putStrLn "Tasks:"
|
||||||
mapM_ (putStrLn . showTask) (Map.toList taskMap)
|
mapM_ (putStrLn . showTask) (Map.toList taskMap)
|
||||||
else putStrLn "No tasks found."
|
else putStrLn "No tasks found."
|
||||||
main
|
putStrLn " -------------- "
|
||||||
where
|
putStrLn "Press Enter"
|
||||||
handleReadError :: IOException -> IO Text
|
option <- getLine
|
||||||
handleReadError e = do
|
case option of
|
||||||
putStrLn $ "Error reading file: " ++ show e
|
_ -> main
|
||||||
return ""
|
where
|
||||||
|
handleReadError :: IOException -> IO Text
|
||||||
|
handleReadError e = do
|
||||||
|
putStrLn $ "Error reading file: " ++ show e
|
||||||
|
return ""
|
||||||
|
|
||||||
addTask :: IO ()
|
addTask :: IO ()
|
||||||
addTask = do
|
addTask = do
|
||||||
@ -72,7 +83,11 @@ addTask = do
|
|||||||
catch (TIO.writeFile todoFile (serializeTask newTaskMap)) handleWriteError
|
catch (TIO.writeFile todoFile (serializeTask newTaskMap)) handleWriteError
|
||||||
else catch (TIO.writeFile todoFile (pack task <> "\n")) handleWriteError
|
else catch (TIO.writeFile todoFile (pack task <> "\n")) handleWriteError
|
||||||
putStrLn "Task added."
|
putStrLn "Task added."
|
||||||
main
|
putStrLn " -------------- "
|
||||||
|
putStrLn "Press Enter"
|
||||||
|
option <- getLine
|
||||||
|
case option of
|
||||||
|
_ -> main
|
||||||
where
|
where
|
||||||
handleReadError :: IOException -> IO Text
|
handleReadError :: IOException -> IO Text
|
||||||
handleReadError e = do
|
handleReadError e = do
|
||||||
@ -82,6 +97,70 @@ addTask = do
|
|||||||
handleWriteError :: IOException -> IO ()
|
handleWriteError :: IOException -> IO ()
|
||||||
handleWriteError e = putStrLn $ "Error writing file: " ++ show e
|
handleWriteError e = putStrLn $ "Error writing file: " ++ show e
|
||||||
|
|
||||||
|
addTaskWithManual :: IO ()
|
||||||
|
addTaskWithManual = do
|
||||||
|
putStrLn "First, optionally you can add priority to the task you want to add. To do so, put letter inside '()'"
|
||||||
|
putStrLn "Tasks without priority will be displayed first."
|
||||||
|
putStrLn "Second, write your task."
|
||||||
|
putStrLn "Third, optionally you can add tags to your task. To do so, put '+'and write your tag."
|
||||||
|
putStrLn "Tasks can have more than one tag."
|
||||||
|
putStrLn "Example: (C) go shopping +shop +sunday"
|
||||||
|
putStrLn " -------------- "
|
||||||
|
putStrLn "Press Enter to add your task or x to go back to menu"
|
||||||
|
option <- getLine
|
||||||
|
case option of
|
||||||
|
"x" -> main
|
||||||
|
_ -> addTask
|
||||||
|
|
||||||
|
|
||||||
|
editTask :: IO ()
|
||||||
|
editTask = do
|
||||||
|
exists <- doesFileExist todoFile
|
||||||
|
if exists
|
||||||
|
then do
|
||||||
|
contents <- catch (TIO.readFile todoFile) handleReadError
|
||||||
|
let taskMap = parseTask contents
|
||||||
|
putStrLn "Existing tasks: "
|
||||||
|
mapM_ (putStrLn . showTaskId) (Map.toList taskMap)
|
||||||
|
|
||||||
|
putStr "Enter the ID of the task you wish to edit: "
|
||||||
|
hFlush stdout
|
||||||
|
taskIdStr <- getLine
|
||||||
|
let taskId = read taskIdStr :: Int
|
||||||
|
|
||||||
|
putStrLn ""
|
||||||
|
|
||||||
|
if Map.member taskId taskMap
|
||||||
|
then do
|
||||||
|
putStrLn "Enter the new task description: "
|
||||||
|
newTask <- getLine
|
||||||
|
let newTaskMap = Map.insert taskId (pack newTask) taskMap
|
||||||
|
catch (TIO.writeFile todoFile (serializeTask newTaskMap)) handleWriteError
|
||||||
|
putStrLn "Task edited."
|
||||||
|
else do
|
||||||
|
putStrLn "Task of this ID doesn't exist"
|
||||||
|
putStrLn "Do you wish to try again? Press Enter if yes or x to go back to menu"
|
||||||
|
option <- getLine
|
||||||
|
case option of
|
||||||
|
"x" -> main
|
||||||
|
_ -> editTask
|
||||||
|
|
||||||
|
else putStrLn "No tasks found."
|
||||||
|
putStrLn " -------------- "
|
||||||
|
putStrLn "Press Enter"
|
||||||
|
option <- getLine
|
||||||
|
case option of
|
||||||
|
_ -> main
|
||||||
|
where
|
||||||
|
handleReadError :: IOException -> IO Text
|
||||||
|
handleReadError e = do
|
||||||
|
putStrLn $ "Error reading file: " ++ show e
|
||||||
|
return ""
|
||||||
|
|
||||||
|
handleWriteError :: IOException -> IO ()
|
||||||
|
handleWriteError e = putStrLn $ "Error writing file: " ++ show e
|
||||||
|
|
||||||
|
|
||||||
filterTasksByTag :: IO ()
|
filterTasksByTag :: IO ()
|
||||||
filterTasksByTag = do
|
filterTasksByTag = do
|
||||||
putStr "Enter the tag to filter by (e.g., +GarageSale): "
|
putStr "Enter the tag to filter by (e.g., +GarageSale): "
|
||||||
@ -96,13 +175,20 @@ filterTasksByTag = do
|
|||||||
putStrLn "Filtered tasks:"
|
putStrLn "Filtered tasks:"
|
||||||
mapM_ (putStrLn . showTask) (Map.toList filteredTasks)
|
mapM_ (putStrLn . showTask) (Map.toList filteredTasks)
|
||||||
else putStrLn "No tasks found."
|
else putStrLn "No tasks found."
|
||||||
main
|
putStrLn " -------------- "
|
||||||
|
putStrLn "Press Enter"
|
||||||
|
option <- getLine
|
||||||
|
case option of
|
||||||
|
_ -> main
|
||||||
where
|
where
|
||||||
handleReadError :: IOException -> IO Text
|
handleReadError :: IOException -> IO Text
|
||||||
handleReadError e = do
|
handleReadError e = do
|
||||||
putStrLn $ "Error reading file: " ++ show e
|
putStrLn $ "Error reading file: " ++ show e
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
handleWriteError :: IOException -> IO ()
|
||||||
|
handleWriteError e = putStrLn $ "Error writing file: " ++ show e
|
||||||
|
|
||||||
sortTasksByPriority :: IO ()
|
sortTasksByPriority :: IO ()
|
||||||
sortTasksByPriority = do
|
sortTasksByPriority = do
|
||||||
exists <- doesFileExist todoFile
|
exists <- doesFileExist todoFile
|
||||||
@ -114,13 +200,65 @@ sortTasksByPriority = do
|
|||||||
putStrLn "Sorted tasks by priority:"
|
putStrLn "Sorted tasks by priority:"
|
||||||
mapM_ (putStrLn . showTask) sortedTasks
|
mapM_ (putStrLn . showTask) sortedTasks
|
||||||
else putStrLn "No tasks found."
|
else putStrLn "No tasks found."
|
||||||
main
|
putStrLn " -------------- "
|
||||||
|
putStrLn "Press Enter"
|
||||||
|
option <- getLine
|
||||||
|
case option of
|
||||||
|
_ -> main
|
||||||
where
|
where
|
||||||
handleReadError :: IOException -> IO Text
|
handleReadError :: IOException -> IO Text
|
||||||
handleReadError e = do
|
handleReadError e = do
|
||||||
putStrLn $ "Error reading file: " ++ show e
|
putStrLn $ "Error reading file: " ++ show e
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
removeTask :: IO ()
|
||||||
|
removeTask = do
|
||||||
|
|
||||||
|
exists <- doesFileExist todoFile
|
||||||
|
if exists
|
||||||
|
then do
|
||||||
|
contents <- catch (TIO.readFile todoFile) handleReadError
|
||||||
|
let taskMap = parseTask contents
|
||||||
|
putStrLn "Existing tasks: "
|
||||||
|
mapM_ (putStrLn . showTaskId) (Map.toList taskMap)
|
||||||
|
|
||||||
|
putStr "Enter the ID of the task you wish to remove: "
|
||||||
|
hFlush stdout
|
||||||
|
taskIdStr <- getLine
|
||||||
|
let taskId = read taskIdStr :: Int
|
||||||
|
|
||||||
|
putStrLn ""
|
||||||
|
|
||||||
|
if Map.member taskId taskMap
|
||||||
|
then do
|
||||||
|
let newTaskMap = Map.delete taskId taskMap
|
||||||
|
catch (TIO.writeFile todoFile (serializeTask newTaskMap)) handleWriteError
|
||||||
|
putStrLn "Task removed."
|
||||||
|
else do
|
||||||
|
putStrLn "Task of this ID doesn't exist"
|
||||||
|
putStrLn "Do you wish to try again? Press Enter if yes or x to go back to menu"
|
||||||
|
option <- getLine
|
||||||
|
case option of
|
||||||
|
"x" -> main
|
||||||
|
_ -> removeTask
|
||||||
|
|
||||||
|
else putStrLn "No tasks found."
|
||||||
|
putStrLn " -------------- "
|
||||||
|
putStrLn "Press Enter"
|
||||||
|
option <- getLine
|
||||||
|
case option of
|
||||||
|
_ -> main
|
||||||
|
where
|
||||||
|
handleReadError :: IOException -> IO Text
|
||||||
|
handleReadError e = do
|
||||||
|
putStrLn $ "Error reading file: " ++ show e
|
||||||
|
return ""
|
||||||
|
|
||||||
|
handleWriteError :: IOException -> IO ()
|
||||||
|
handleWriteError e = putStrLn $ "Error writing file: " ++ show e
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
comparePriority :: Text -> Text -> Ordering
|
comparePriority :: Text -> Text -> Ordering
|
||||||
comparePriority t1 t2 = comparing getPriority t1 t2
|
comparePriority t1 t2 = comparing getPriority t1 t2
|
||||||
|
|
||||||
@ -136,4 +274,7 @@ serializeTask :: TaskMap -> Text
|
|||||||
serializeTask = Data.Text.unlines . map snd . Map.toList
|
serializeTask = Data.Text.unlines . map snd . Map.toList
|
||||||
|
|
||||||
showTask :: (Int, Text) -> String
|
showTask :: (Int, Text) -> String
|
||||||
showTask (_, task) = unpack task
|
showTask (_, task) = unpack task
|
||||||
|
|
||||||
|
showTaskId :: (Int, Text) -> String
|
||||||
|
showTaskId (taskId, task) = show taskId ++ ": " ++ unpack task
|
Loading…
Reference in New Issue
Block a user