, , .
,
data EventStream e = EventStream AggregateID [e]
streamName :: Event e => EventStream e -> String
streamName (EventStream aggregateID (e:events)) = (eventCategory e) ++ '-':(toString aggregateID)
. eventCategory , , . , , eventCategory . , eventCategory undefined.
- eventCategory:
data Proxy p = Proxy
class Event e where
eventCategory :: Proxy e -> String
, . , eventCategory , .
, #, : - , :
{-# LANGUAGE MultiParamTypeClasses #-}
import Data.ByteString
class Event e where
deserialize :: ByteString -> e
... other stuff
class Event e => EventStream t e where
category :: t e -> String
aggregateId :: t e -> Int
events :: t e -> [e]
name :: t e -> String
name s = category s ++ "-" ++ show (aggregateId s)
EventStream typeclass .
, name , , , . , , , .
:
data PlayerEvent = ...
instance Event PlayerEvent where ...
data GameEvent = ...
instance Event GameEvent where ...
:
data PlayerEventStream e = PES Int [e]
instance EventStream PlayerEventStream PlayerEvent where
category = const "Player"
aggregateId (PES n _) = n
events (PES _ e) = e
data GameEventStream e = GES Int [e]
instance EventStream GameEventStream GameEvent where
category = const "Game"
aggregateId (GES n _) = n
events (GES _ e) = e
, , . PlayerEvent GameEventStream (, , EventStream GameEventStream, PlayerEvent s). :
class Event e => EventStream t e | t -> e where
, , - :
instance EventStream PlayerEventStream PlayerEvent where
instance EventStream PlayerEventStream GameEvent where
:
saveEventStream :: EventStream t e => t e -> IO ()
saveEventStream s = do
createStream (name s)
addToCategory (name s) (category s)
saveEvents (name s) (events s)
, , , , , , #.