module Data.CQRS.Memory.Internal.Storage
( Event(..)
, Store(..)
, Storage(..)
, newStorage
) where
import Control.Concurrent.STM (atomically)
import Control.Concurrent.STM.TVar (TVar, newTVar)
import Data.CQRS.Types.ArchiveRef
import Data.CQRS.Types.ArchiveMetadata
import Data.CQRS.Types.PersistedEvent (PersistedEvent(..))
import Data.Sequence (Seq)
import qualified Data.Sequence as S
import Data.UUID.Types (UUID)
data Event e =
Event { eAggregateId :: UUID
, ePersistedEvent :: PersistedEvent e
, eArchiveRef :: ArchiveRef
}
deriving (Show)
data Store e = Store
{ msEvents :: Seq (Event e)
, msArchives :: Seq ArchiveMetadata
}
newtype Storage e = Storage (TVar (Store e))
newStorage :: IO (Storage e)
newStorage = atomically $ fmap Storage $ newTVar $ Store S.empty S.empty