packages feed

cqrs-example-0.10.0: src/CQRSExample/Json.hs

{-# LANGUAGE OverloadedStrings #-}
module CQRSExample.Json
       ( qTaskListJson
       ) where

import           Control.Concurrent.STM.TVar (TVar)
import           Control.Monad (liftM)
import           Data.Aeson (ToJSON, Value)
import           Data.Aeson.Types (object, Value(..))
import           Data.Text.Encoding (decodeUtf8)
import           Data.UUID.Types (toASCIIBytes)

import           CQRSExample.Query

-- Generate a list of JSONable values by mapping a function on a query.
qListToJson :: ToJSON b => (QueryM [a]) -> (a -> b) -> TVar QueryState -> IO [b]
qListToJson q f p = liftM (map f) $ runQuery p q

-- Query the task list, producing JSON.
qTaskListJson :: TVar QueryState -> IO [Value]
qTaskListJson qs = qListToJson qTaskList f qs
    where
      f (tid, title, state) =
          object [ ("id", String $ decodeUtf8 $ toASCIIBytes tid)
                 , ("title", String title)
                 , ("done", Bool $ isDone state) ]
      isDone QTaskOpen = False
      isDone QTaskCompleted = True
      isDone QTaskArchived = True