packages feed

cqrs-example-0.5.0: src/Events.hs

module Events
       ( Event(..)
       ) where

import Aggregates
import Control.Monad (liftM)
import Data.Serialize (Serialize(..))
import Data.Text (Text)
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
import Data.Typeable (Typeable)
import Data.Word (Word8)

data Event = ProjectCreated Text
           | ProjectRenamed Text
           | TaskAdded ProjectId Text
           deriving (Typeable, Show)

instance Serialize Event where
  put (ProjectCreated name) = do
    put (0 :: Word8)
    put $ encodeUtf8 name
  put (ProjectRenamed name) = do
    put (1 :: Word8)
    put $ encodeUtf8 name
  put (TaskAdded pid tsd) = do
    put (2 :: Word8)
    put $ pid
    put $ encodeUtf8 tsd
  get = do
    i :: Word8 <- get
    case i of
      0 -> do
        n <- liftM decodeUtf8 get
        return $ ProjectCreated n
      1 -> do
        n <- liftM decodeUtf8 get
        return $ ProjectRenamed n
      2 -> do
        pid <- get
        tsd <- liftM decodeUtf8 get
        return $ TaskAdded pid tsd
      _ -> do
        fail $ "Unrecognized event type " ++ show i