{-# LANGUAGE OverloadedStrings #-} module TODOMVC.Update where import TODOMVC.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 updateDescription :: Model -> Description -> Model updateDescription m d = m { current = d } toggleCompleted :: Model -> TaskId -> Model toggleCompleted m tid = m { tasks = (\t -> if taskId t == tid then t { completed = negC (completed t) } else t) <$> tasks m } where negC Complete = Incomplete negC Incomplete = Complete toggleEditing :: Model -> Maybe TaskId -> Model toggleEditing m t = m { editing = t } updateTaskDescription :: Model -> TaskId -> Description -> Model updateTaskDescription m tid desc = m { tasks = f <$> tasks m} where f t = if taskId t == tid then t { description = desc } else t removeTask :: Model -> TaskId -> Model removeTask m tid = m { tasks = filter ((/= tid) . taskId) $ tasks m} 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