{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.Taskell.List.Internal where
import ClassyPrelude
import Control.Lens (ix, makeLenses, (%%~), (%~), (&), (.~), (^.), (^?))
import Data.Sequence as S (adjust', deleteAt, insertAt, update, (|>))
import qualified Data.Taskell.Seq as S
import qualified Data.Taskell.Task as T (Task, Update, blank, contains)
data List = List
{ _title :: Text
, _tasks :: Seq T.Task
} deriving (Show, Eq)
type Update = List -> List
$(makeLenses ''List)
create :: Text -> Seq T.Task -> List
create = List
empty :: Text -> List
empty text = List text ClassyPrelude.empty
new :: Update
new = append T.blank
count :: List -> Int
count = length . (^. tasks)
newAt :: Int -> Update
newAt idx = tasks %~ insertAt idx T.blank
append :: T.Task -> Update
append task = tasks %~ (|> task)
extract :: Int -> List -> Maybe (List, T.Task)
extract idx list = do
(xs, x) <- S.extract idx (list ^. tasks)
pure (list & tasks .~ xs, x)
updateFn :: Int -> T.Update -> Update
updateFn idx fn = tasks %~ adjust' fn idx
update :: Int -> T.Task -> Update
update idx task = tasks %~ S.update idx task
move :: Int -> Int -> List -> Maybe List
move from dir = tasks %%~ S.shiftBy from dir
deleteTask :: Int -> Update
deleteTask idx = tasks %~ deleteAt idx
getTask :: Int -> List -> Maybe T.Task
getTask idx = (^? tasks . ix idx)
searchFor :: Text -> Update
searchFor text = tasks %~ filter (T.contains text)