packages feed

taskell-1.9.3.0: src/Taskell/Events/State/Modal/Due.hs

module Taskell.Events.State.Modal.Due
    ( showDue
    , clearDate
    , previous
    , next
    , goto
    ) where

import ClassyPrelude

import Control.Lens  ((&), (.~), (^.))
import Data.Sequence ((!?))

import qualified Taskell.Data.Lists              as L (clearDue, due)
import           Taskell.Data.Seq                (bound)
import           Taskell.Data.Task               (Task)
import           Taskell.Events.State.Types      (Stateful, current, lists, mode)
import           Taskell.Events.State.Types.Mode (ModalType (Due), Mode (..))
import           Taskell.Types                   (Pointer)

type DueStateful = Seq (Pointer, Task) -> Int -> Stateful

λfilter :: DueStateful -> Stateful
λfilter fn state =
    case state ^. mode of
        Modal (Due due cur) -> fn due cur state
        _                   -> pure state

λsetMode :: DueStateful
λsetMode due pos state = pure $ state & mode .~ Modal (Due due pos)

λprevious :: DueStateful
λprevious due cur = λsetMode due (bound due (cur - 1))

λnext :: DueStateful
λnext due cur = λsetMode due (bound due (cur + 1))

λgoto :: DueStateful
λgoto due cur state =
    case due !? cur of
        Just (pointer, _) -> pure $ state & current .~ pointer
        Nothing           -> Nothing

λclearDate :: DueStateful
λclearDate due cur state =
    case due !? cur of
        Just (pointer, _) -> do
            let new = L.clearDue pointer (state ^. lists)
            let dues = L.due new
            λsetMode dues (bound dues cur) (state & lists .~ new)
        Nothing -> Nothing

showDue :: Stateful
showDue state = λsetMode (L.due (state ^. lists)) 0 state

previous :: Stateful
previous = λfilter λprevious

next :: Stateful
next = λfilter λnext

goto :: Stateful
goto = λfilter λgoto

clearDate :: Stateful
clearDate = λfilter λclearDate