{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Data.Taskell.Lists.Internal where
import ClassyPrelude hiding (empty)
import Data.Sequence as S (deleteAt, update, (!?), (|>))
import Data.Taskell.List as L (List, append, count, empty, extract, searchFor)
import qualified Data.Taskell.Seq as S
import Data.Taskell.Task (Task)
type Lists = Seq List
type Update = Lists -> Lists
initial :: Lists
initial = fromList [empty "To Do", empty "Done"]
updateLists :: Int -> List -> Update
updateLists = S.update
count :: Int -> Lists -> Int
count idx tasks = maybe 0 L.count (tasks !? idx)
get :: Lists -> Int -> Maybe List
get = (!?)
changeList :: (Int, Int) -> Lists -> Int -> Maybe Lists
changeList (list, idx) tasks dir = do
let next = list + dir
(from, task) <- extract idx =<< tasks !? list
to <- append task <$> tasks !? next
pure . updateLists next to $ updateLists list from tasks
newList :: Text -> Update
newList title = (|> empty title)
delete :: Int -> Update
delete = deleteAt
exists :: Int -> Lists -> Bool
exists idx tasks = isJust $ tasks !? idx
shiftBy :: Int -> Int -> Lists -> Maybe Lists
shiftBy = S.shiftBy
search :: Text -> Update
search text = (searchFor text <$>)
appendToLast :: Task -> Update
appendToLast task lists =
fromMaybe lists $ do
let idx = length lists - 1
list <- append task <$> lists !? idx
pure $ updateLists idx list lists
analyse :: Text -> Lists -> Text
analyse filepath lists =
concat
[ filepath
, "\n"
, "Lists: "
, tshow $ length lists
, "\n"
, "Tasks: "
, tshow $ foldl' (+) 0 (L.count <$> lists)
]