module Eventful.EventBus
( synchronousEventBusWrapper
, storeAndPublishEvents
) where
import Eventful.Store.Class
import Eventful.UUID
synchronousEventBusWrapper
:: (Monad m)
=> EventStoreWriter m event
-> [EventStoreWriter m event -> UUID -> event -> m ()]
-> EventStoreWriter m event
synchronousEventBusWrapper writer handlers = wrappedStore
where
handlers' = map ($ wrappedStore) handlers
wrappedStore = EventStoreWriter $ storeAndPublishEvents writer handlers'
storeAndPublishEvents
:: (Monad m)
=> EventStoreWriter m event
-> [UUID -> event -> m ()]
-> ExpectedVersion
-> UUID
-> [event]
-> 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