module Eventful.EventBus
( synchronousEventBusWrapper
, storeAndPublishEvents
) where
import Eventful.Store.Class
import Eventful.UUID
synchronousEventBusWrapper
:: (Monad m)
=> EventStore serialized m
-> [EventStore serialized m -> UUID -> serialized -> m ()]
-> EventStore serialized m
synchronousEventBusWrapper store handlers =
let
handlers' = map ($ wrappedStore) handlers
wrappedStore =
EventStore
{ getLatestVersion = getLatestVersion store
, getEvents = getEvents store
, storeEvents = storeAndPublishEvents store handlers'
}
in wrappedStore
storeAndPublishEvents
:: (Monad m)
=> EventStore serialized m
-> [UUID -> serialized -> m ()]
-> ExpectedVersion
-> UUID
-> [serialized]
-> m (Maybe EventWriteError)
storeAndPublishEvents store handlers expectedVersion uuid events = do
result <- storeEvents store expectedVersion uuid events
case result of
Just err -> return $ Just err
Nothing -> do
mapM_ (\handler -> mapM_ (handler uuid) events) handlers
return Nothing