module Data.CQRS.Internal.EventStore
( EventStore(..)
, enumerateEventStore
, retrieveEvents
, storeEvents
) where
import Data.ByteString (ByteString)
import Data.Conduit (ResourceT, Source, ($=))
import qualified Data.Conduit.List as CL
import Data.CQRS.EventStore.Backend
import Data.CQRS.GUID
import Data.CQRS.Serializable
import Data.CQRS.PersistedEvent (PersistedEvent(..))
data EventStore e b = EventStore { esBackend :: b }
enumerateEventStore :: forall e b . (Serializable e, EventStoreBackend b) => EventStore e b -> Source (ResourceT IO) [PersistedEvent e]
enumerateEventStore es =
esbEnumerateAllEvents (esBackend es) $= CL.map (\re -> [fmap deserialize' re])
storeEvents :: (Serializable e, EventStoreBackend b) => EventStore e b -> GUID -> Int -> [PersistedEvent e] -> IO ()
storeEvents (EventStore esb) guid v0 evs = do
esbStoreEvents esb guid v0 $ (map $ fmap $ serialize) evs
retrieveEvents :: (Serializable e, EventStoreBackend b) => EventStore e b -> GUID -> Int -> Source (ResourceT IO) (PersistedEvent e)
retrieveEvents (EventStore esb) guid v0 = (esbRetrieveEvents esb guid v0) $= (CL.map (fmap deserialize'))
deserialize' :: Serializable e => ByteString -> e
deserialize' s =
case deserialize s of
Nothing -> error "Could not deserialize event -- event deserialization MUST NOT fail"
Just e -> e