diff --git a/plan.txt b/plan.txt new file mode 100644 index 0000000..fd7b02d --- /dev/null +++ b/plan.txt @@ -0,0 +1,24 @@ +normal task + - | x(completion date) + (priority) + (due date) + (creation date) + description + +delayed task + (start date) + (priority) + (due date) + (creation date) + description + + on update: + if after start date: + turn into normal task + +formula task + (when formula) + (priority) + (due date) + +"update": diff --git a/src/TaskMachine/History.hs b/src/TaskMachine/History.hs new file mode 100644 index 0000000..b27da08 --- /dev/null +++ b/src/TaskMachine/History.hs @@ -0,0 +1,72 @@ +-- | An undo-redo history that keeps a copy of every state. + +module TaskMachine.History + ( History + , history + , step + , current + , modify + , undo + , maybeUndo + , redo + , maybeRedo + ) where + +data Step a b = Step a b + +-- | Represents the history (only one branch) of some type @a@. +-- +-- Contains backwards (ctrl+z) as well as forwards (ctrl+y or ctrl+shift+z) history, +-- as well as the current state. +data History a b = History [Step a b] a [Step a b] + +-- | Create a new 'History' from a single state. +history :: a -> History a b +history a = History [] a [] + +-- | Add a new step to the history. +-- +-- Any forwards history will be overwritten, as this action starts a new +-- branch in the history tree. +step :: a -> b -> History a b -> History a b +step a (History xs y _) = History (Step y b : xs) a [] + +-- | Read the current state of the history. +current :: History a -> b -> a +current (History _ a _) = a + +{- +-- | Modify the current state, adding a step in the process. +-- +-- @'modify' f h = 'step' (f $ 'current' h) h@ +modify :: (a -> a) -> History a -> History a -- not a functor! +modify f h = step (f $ current h) h +-} + +-- | Jump to the previous state, remembering the future for later redos. +-- +-- If there is no previous state, do nothing. +undo :: History a b -> Maybe (History a b, b) +undo (History (Step x b : xs) y zs) = Just (History xs x (Step y b : zs), b) +undo _ = Nothing + +{- +-- | Like 'undo', but returns 'Nothing' if there was no previous state. +maybeUndo :: History a -> Maybe (History a) +maybeUndo (History (x:xs) y zs) = Just $ History xs x (y:zs) +maybeUndo _ = Nothing +-} + +-- | Jump to the next state, remembering the past for later undos. +-- +-- If there is no next state, do nothing. +redo :: History a b -> Maybe (History a b, b) +redo (History xs y (Step z b : zs)) = Just (History (Step y b : xs) z zs, b) +redo _ = Nothing + +{- +-- | Like 'redo', but returns 'Nothing' if there was no next state. +maybeRedo :: History a -> Maybe (History a) +maybeRedo (History xs y (z:zs)) = Just $ History (y:xs) z zs +maybeRedo _ = Nothing +-} diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..3e67d29 --- /dev/null +++ b/test.txt @@ -0,0 +1,7 @@ +- A simple task +x A simple completed task + +- c2018-12-13 A simple task with creation date + +s2018-12-20 d2018-12-24 A task with start date +-2018-12-20 d2018-12-24 A task with alternate start date