-- | Event store data types.
module Data.CQRS.EventStore
       ( EventStore(..)
       ) where

import Data.CQRS.Event
import Data.CQRS.GUID
import Data.Binary

-- | Event stores are the backend used for reading and storing all the
-- information about recorded events.
data EventStore =
  EventStore {
    -- | Store a sequence of events for aggregate identified by GUID
    -- into the event store, starting at the provided version number.
    -- If the version number does not match the expected value, a
    -- failure occurs.
    storeEvents :: (Event e a, Binary e) => GUID a -> Int -> [e] -> IO (),
    -- | Retrieve the sequence of events associated with the aggregate
    -- identified by the given GUID. The events are returned in increasing
    -- order of version number. The version number of the last event is returned
    -- as well.
    retrieveEvents :: (Event e a, Binary e) => GUID a -> IO (Int,[e]),
    -- | Run transaction against the event store. The transaction is
    -- expected to commit if the supplied IO action runs to completion
    -- (i.e. doesn't throw an exception) and to rollback otherwise.
    withTransaction :: forall a . IO a -> IO a,
    -- | Close the event store.
    closeEventStore :: IO ()
    }