packages feed

Shpadoinkle-examples-0.0.0.1: TODOMVCAtomic/Update.hs

{-# LANGUAGE OverloadedStrings #-}


module TODOMVCAtomic.Update where


import           TODOMVCAtomic.Types


appendItem' :: Model -> Model
appendItem' m = if _current m /= "" then m
  { _tasks = Task (_current m) Incomplete ((+ 1)
          $ Prelude.maximum $ 0 : (_taskId <$> _tasks m)) : _tasks m
  , _current = "" }
  else m

toggleCompleted :: TaskId -> Model -> Model
toggleCompleted tid m = m { _tasks =
  (\t -> if _taskId t == tid then t { _completed = negC (_completed t) } else t) <$> _tasks m }
  where negC Complete   = Incomplete
        negC Incomplete = Complete


updateTaskDescription :: TaskId -> Description -> Model -> Model
updateTaskDescription tid desc m = m { _tasks = f <$> _tasks m}
  where f t = if _taskId t == tid then t { _description = desc } else t


toggleAll :: Model -> Model
toggleAll m = m { _tasks = (\t -> t { _completed = c }) <$> _tasks m}
  where c = if Prelude.all ((== Complete) . _completed) $ _tasks m then Incomplete else Complete


count :: Completed -> [Task] -> Int
count c = length . filter ((== c) . _completed)


clearComplete :: Model -> Model
clearComplete m = m { _tasks = filter ((== Incomplete) . _completed) (_tasks m) }


toVisible :: Visibility -> [Task] -> [Task]
toVisible v = case v of
  All       -> id
  Active    -> filter $ (== Incomplete) . _completed
  Completed -> filter $ (== Complete)   . _completed