| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Eventium.Store.Class
Synopsis
- newtype EventStoreReader key position (m :: Type -> Type) event = EventStoreReader {
- getEvents :: QueryRange key position -> m [event]
- newtype EventStoreWriter key position (m :: Type -> Type) event = EventStoreWriter {
- storeEvents :: key -> ExpectedPosition position -> [event] -> m (Either (EventWriteError position) EventVersion)
- type VersionedEventStoreReader (m :: Type -> Type) event = EventStoreReader UUID EventVersion m (VersionedStreamEvent event)
- type GlobalEventStoreReader (m :: Type -> Type) event = EventStoreReader () SequenceNumber m (GlobalStreamEvent event)
- type VersionedEventStoreWriter = EventStoreWriter UUID EventVersion
- data StreamEvent key position event = StreamEvent {
- streamEventKey :: !key
- streamEventPosition :: !position
- streamEventEvent :: !event
- type VersionedStreamEvent event = StreamEvent UUID EventVersion event
- type GlobalStreamEvent event = StreamEvent () SequenceNumber (VersionedStreamEvent event)
- data ExpectedPosition position
- = AnyPosition
- | NoStream
- | StreamExists
- | ExactPosition position
- newtype EventWriteError position = EventStreamNotAtExpectedVersion position
- runEventStoreReaderUsing :: (Monad m, Monad mstore) => (forall a. mstore a -> m a) -> EventStoreReader key position mstore event -> EventStoreReader key position m event
- runEventStoreWriterUsing :: (Monad m, Monad mstore) => (forall a. mstore a -> m a) -> EventStoreWriter key posirion mstore event -> EventStoreWriter key posirion m event
- module Eventium.Store.Queries
- serializedEventStoreReader :: forall (m :: Type -> Type) event serialized key position. Monad m => Serializer event serialized -> EventStoreReader key position m serialized -> EventStoreReader key position m event
- serializedVersionedEventStoreReader :: forall (m :: Type -> Type) event serialized. Monad m => Serializer event serialized -> VersionedEventStoreReader m serialized -> VersionedEventStoreReader m event
- serializedGlobalEventStoreReader :: forall (m :: Type -> Type) event serialized. Monad m => Serializer event serialized -> GlobalEventStoreReader m serialized -> GlobalEventStoreReader m event
- serializedEventStoreWriter :: forall (m :: Type -> Type) event serialized key position. Monad m => Serializer event serialized -> EventStoreWriter key position m serialized -> EventStoreWriter key position m event
- newtype EventVersion = EventVersion {}
- newtype SequenceNumber = SequenceNumber {}
- transactionalExpectedWriteHelper :: (Monad m, Ord position, Num position) => (key -> m position) -> (key -> [event] -> m EventVersion) -> key -> ExpectedPosition position -> [event] -> m (Either (EventWriteError position) EventVersion)
EventStore
newtype EventStoreReader key position (m :: Type -> Type) event Source #
An EventStoreReader is a function to query a stream from an event store.
It operates in some monad m and returns events of type event from a
stream at key ordered by position.
Constructors
| EventStoreReader | |
Fields
| |
Instances
| Functor m => Functor (EventStoreReader key position m) Source # | |
Defined in Eventium.Store.Class Methods fmap :: (a -> b) -> EventStoreReader key position m a -> EventStoreReader key position m b # (<$) :: a -> EventStoreReader key position m b -> EventStoreReader key position m a # | |
newtype EventStoreWriter key position (m :: Type -> Type) event Source #
An EventStoreWriter is a function to write some events of type event
to an event store in some monad m.
Constructors
| EventStoreWriter | |
Fields
| |
Instances
| Contravariant (EventStoreWriter key position m) Source # | |
Defined in Eventium.Store.Class Methods contramap :: (a' -> a) -> EventStoreWriter key position m a -> EventStoreWriter key position m a' # (>$) :: b -> EventStoreWriter key position m b -> EventStoreWriter key position m a # | |
type VersionedEventStoreReader (m :: Type -> Type) event = EventStoreReader UUID EventVersion m (VersionedStreamEvent event) Source #
type GlobalEventStoreReader (m :: Type -> Type) event = EventStoreReader () SequenceNumber m (GlobalStreamEvent event) Source #
data StreamEvent key position event Source #
An event along with the key for the event stream it is from and its
position in that event stream.
Constructors
| StreamEvent | |
Fields
| |
Instances
| Foldable (StreamEvent key position) Source # | |
Defined in Eventium.Store.Class Methods fold :: Monoid m => StreamEvent key position m -> m # foldMap :: Monoid m => (a -> m) -> StreamEvent key position a -> m # foldMap' :: Monoid m => (a -> m) -> StreamEvent key position a -> m # foldr :: (a -> b -> b) -> b -> StreamEvent key position a -> b # foldr' :: (a -> b -> b) -> b -> StreamEvent key position a -> b # foldl :: (b -> a -> b) -> b -> StreamEvent key position a -> b # foldl' :: (b -> a -> b) -> b -> StreamEvent key position a -> b # foldr1 :: (a -> a -> a) -> StreamEvent key position a -> a # foldl1 :: (a -> a -> a) -> StreamEvent key position a -> a # toList :: StreamEvent key position a -> [a] # null :: StreamEvent key position a -> Bool # length :: StreamEvent key position a -> Int # elem :: Eq a => a -> StreamEvent key position a -> Bool # maximum :: Ord a => StreamEvent key position a -> a # minimum :: Ord a => StreamEvent key position a -> a # sum :: Num a => StreamEvent key position a -> a # product :: Num a => StreamEvent key position a -> a # | |
| Traversable (StreamEvent key position) Source # | |
Defined in Eventium.Store.Class Methods traverse :: Applicative f => (a -> f b) -> StreamEvent key position a -> f (StreamEvent key position b) # sequenceA :: Applicative f => StreamEvent key position (f a) -> f (StreamEvent key position a) # mapM :: Monad m => (a -> m b) -> StreamEvent key position a -> m (StreamEvent key position b) # sequence :: Monad m => StreamEvent key position (m a) -> m (StreamEvent key position a) # | |
| Functor (StreamEvent key position) Source # | |
Defined in Eventium.Store.Class Methods fmap :: (a -> b) -> StreamEvent key position a -> StreamEvent key position b # (<$) :: a -> StreamEvent key position b -> StreamEvent key position a # | |
| (Show key, Show position, Show event) => Show (StreamEvent key position event) Source # | |
Defined in Eventium.Store.Class Methods showsPrec :: Int -> StreamEvent key position event -> ShowS # show :: StreamEvent key position event -> String # showList :: [StreamEvent key position event] -> ShowS # | |
| (Eq key, Eq position, Eq event) => Eq (StreamEvent key position event) Source # | |
Defined in Eventium.Store.Class Methods (==) :: StreamEvent key position event -> StreamEvent key position event -> Bool # (/=) :: StreamEvent key position event -> StreamEvent key position event -> Bool # | |
type VersionedStreamEvent event = StreamEvent UUID EventVersion event Source #
type GlobalStreamEvent event = StreamEvent () SequenceNumber (VersionedStreamEvent event) Source #
data ExpectedPosition position Source #
ExpectedPosition is used to assert the event stream is at a certain position. This is used when multiple writers are concurrently writing to the event store. If the expected position is incorrect, then storing fails.
Constructors
| AnyPosition | Used when the writer doesn't care what position the stream is at. |
| NoStream | The stream shouldn't exist yet. |
| StreamExists | The stream should already exist. |
| ExactPosition position | Used to assert the stream is at a particular position. |
Instances
| Show position => Show (ExpectedPosition position) Source # | |
Defined in Eventium.Store.Class Methods showsPrec :: Int -> ExpectedPosition position -> ShowS # show :: ExpectedPosition position -> String # showList :: [ExpectedPosition position] -> ShowS # | |
| Eq position => Eq (ExpectedPosition position) Source # | |
Defined in Eventium.Store.Class Methods (==) :: ExpectedPosition position -> ExpectedPosition position -> Bool # (/=) :: ExpectedPosition position -> ExpectedPosition position -> Bool # | |
newtype EventWriteError position Source #
Constructors
| EventStreamNotAtExpectedVersion position |
Instances
| Show position => Show (EventWriteError position) Source # | |
Defined in Eventium.Store.Class Methods showsPrec :: Int -> EventWriteError position -> ShowS # show :: EventWriteError position -> String # showList :: [EventWriteError position] -> ShowS # | |
| Eq position => Eq (EventWriteError position) Source # | |
Defined in Eventium.Store.Class Methods (==) :: EventWriteError position -> EventWriteError position -> Bool # (/=) :: EventWriteError position -> EventWriteError position -> Bool # | |
runEventStoreReaderUsing :: (Monad m, Monad mstore) => (forall a. mstore a -> m a) -> EventStoreReader key position mstore event -> EventStoreReader key position m event Source #
Changes the monad an EventStoreReader runs in. This is useful to run
event stores in another Monad while forgetting the original Monad.
runEventStoreWriterUsing :: (Monad m, Monad mstore) => (forall a. mstore a -> m a) -> EventStoreWriter key posirion mstore event -> EventStoreWriter key posirion m event Source #
Analog of runEventStoreReaderUsing for a EventStoreWriter.
module Eventium.Store.Queries
Serialization
serializedEventStoreReader :: forall (m :: Type -> Type) event serialized key position. Monad m => Serializer event serialized -> EventStoreReader key position m serialized -> EventStoreReader key position m event Source #
Wraps an EventStoreReader and transparently serializes/deserializes
events for you. Note that in this implementation deserialization errors are
simply ignored (the event is not returned).
serializedVersionedEventStoreReader :: forall (m :: Type -> Type) event serialized. Monad m => Serializer event serialized -> VersionedEventStoreReader m serialized -> VersionedEventStoreReader m event Source #
Convenience wrapper around serializedEventStoreReader for
VersionedEventStoreReader.
serializedGlobalEventStoreReader :: forall (m :: Type -> Type) event serialized. Monad m => Serializer event serialized -> GlobalEventStoreReader m serialized -> GlobalEventStoreReader m event Source #
Convenience wrapper around serializedEventStoreReader for
GlobalEventStoreReader.
serializedEventStoreWriter :: forall (m :: Type -> Type) event serialized key position. Monad m => Serializer event serialized -> EventStoreWriter key position m serialized -> EventStoreWriter key position m event Source #
Like serializedEventStoreReader but for an EventStoreWriter. Note that
EventStoreWriter is an instance of Contravariant, so you can just use
contramap serialize instead of this function.
Utility types
newtype EventVersion Source #
Event versions are a strictly increasing series of integers for each projection. They allow us to order the events when they are replayed, and they also help as a concurrency check in a multi-threaded environment so services modifying the projection can be sure the projection didn't change during their execution.
Constructors
| EventVersion | |
Fields | |
Instances
newtype SequenceNumber Source #
The sequence number gives us a global ordering of events in a particular event store. Using sequence numbers is not strictly necessary for an event sourcing and CQRS system, but it makes it way easier to replay events consistently without having to use distributed transactions in an event bus. In SQL-based event stores, they are also very cheap to create.
Constructors
| SequenceNumber | |
Fields | |
Instances
Utility functions
transactionalExpectedWriteHelper :: (Monad m, Ord position, Num position) => (key -> m position) -> (key -> [event] -> m EventVersion) -> key -> ExpectedPosition position -> [event] -> m (Either (EventWriteError position) EventVersion) Source #
Helper to create storeEventsRaw given a function to get the latest
stream version and a function to write to the event store. **NOTE**: This
only works if the monad m is transactional.