46 lines
1.6 KiB
Haskell
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
|