{-# 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 TR.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