packages feed

cqrs-example-0.9.0: src/CQRSExample/Events.hs

module CQRSExample.Events
       ( Event(..)
       , TaskEvent(..)
       ) where

import           Control.DeepSeq (NFData(..))
import           Data.CQRS.Serializable (Serializable(..))
import           Data.DeriveTH (derive, makeNFData)
import           Data.Serialize (Serialize(..), putWord8, getWord8, encode, decode)
import           Data.Text (Text)
import qualified Data.Text as T
import           Data.Typeable (Typeable)

data Event = TaskEvent TaskEvent
           deriving (Typeable, Show)

data TaskEvent = TaskAdded Text
               | TaskCompleted
               | TaskReopened
               | TaskArchived
               deriving (Typeable, Show)

-- NFData instances.
$(derive makeNFData ''TaskEvent)
$(derive makeNFData ''Event)

-- Serialize instances. We use manual serialization here
-- since it is extremely important that events remain
-- forward-compatible for (essentially) all time.
instance Serialize TaskEvent where
    put (TaskAdded t) = do
      putWord8 1
      put $ T.unpack t
    put TaskCompleted = do
      putWord8 2
    put TaskReopened = do
      putWord8 3
    put TaskArchived = do
      putWord8 4
    get = do
      i <- getWord8
      case i of
        1 -> fmap (TaskAdded . T.pack) get
        2 -> return TaskCompleted
        3 -> return TaskReopened
        4 -> return TaskArchived
        _ -> fail $ "Unrecognized TaskEvent tag value" ++ show i

instance Serialize Event where
    put (TaskEvent taskEvent) = do
      putWord8 1 -- Marker for future expansion
      put $ taskEvent
    get = do
      i <- getWord8
      case i of
        1 -> fmap TaskEvent get
        _ -> fail $ "Unrecognized TaskEvent tag value: " ++ show i

-- Serializable instance for event.
instance Serializable Event where
    serialize = encode
    deserialize = either (const Nothing) Just . decode