todo/app/FileActions.hs
2025-05-19 15:42:48 +02:00

46 lines
1.6 KiB
Haskell

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module FileActions where
import Data.Text qualified as T
import Data.Text.IO qualified as TIO
import System.Directory
import Text.Read qualified as TR
import TodoListItem
tempFile = "tempFile"
readF folder file = do
content <- readFile (folder <> file)
let itemsAsStrings = lines content
-- TODO: check if can simplify this step by making read work on list of items (i suppose it doesnt yet)
let itemsAsObjects = map read itemsAsStrings :: [TodoListItem]
return itemsAsObjects
writeF folder file content = do
let result = show content
writeFile (folder <> tempFile) result
renameFile (folder <> tempFile) (folder <> file)
appendF folder file item = do
content <- readF folder file
let result = content <> item -- TODO: check if more elegant solution exist (without needing a list for 1 item)
writeF folder file result
delete :: FilePath -> FilePath -> TodoListItem -> IO ()
delete folder file item = do
content <- readF folder file
let result = filter (/= item) content
writeF folder file result
check :: FilePath -> FilePath -> TodoListItem -> IO ()
check folder file name = do
content <- readF folder file
let result = map (swapIfMatch name) content
writeF folder file result
where
swapIfMatch name item = do
if item == name
then TodoListItem{name = TodoListItem.name item, done = not (TodoListItem.done item)}
else item