task-machine/src/TaskMachine/LTask.hs
2018-09-17 16:21:26 +00:00

39 lines
1.1 KiB
Haskell

-- | A way to store the 'Task's that preserves the original task order.
module TaskMachine.LTask
( LTask(..)
, fromTasks
, loadLTasks
, saveLTasks
) where
import Data.Function
import Data.List
import qualified Data.Vector as V
import TaskMachine.Todotxt
-- | A "ListTask" for use in the task list
data LTask = LTask
{ ltaskNumber :: Integer
-- ^ Sort by this number to get the original order of the tasks
, ltaskTask :: Task
-- ^ The 'Task' itself
} deriving (Show)
fromTasks :: [Task] -> [LTask]
fromTasks = zipWith LTask [1..]
loadLTasks :: FilePath -> IO (Either String (V.Vector LTask))
loadLTasks file = do
content <- readFile file
case parseTasks file content of
Right taskList -> pure $ Right $ V.fromList $ fromTasks taskList
Left parseError -> pure $ Left $ show parseError
saveLTasks :: V.Vector LTask -> FilePath -> IO ()
saveLTasks ltasks file = do
let taskList = map ltaskTask $ sortBy (compare `on` ltaskNumber) $ V.toList ltasks
text = unlines $ map formatTask taskList
writeFile file text