| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Eventful.Store.Class
- newtype EventStoreReader key position m event = EventStoreReader {
- getEvents :: QueryRange key position -> m [event]
- newtype EventStoreWriter m event = EventStoreWriter {
- storeEvents :: ExpectedVersion -> UUID -> [event] -> m (Maybe EventWriteError)
- type VersionedEventStoreReader m event = EventStoreReader UUID EventVersion m (VersionedStreamEvent event)
- type GlobalEventStoreReader m event = EventStoreReader () SequenceNumber m (GlobalStreamEvent event)
- 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 ExpectedVersion
- data EventWriteError = EventStreamNotAtExpectedVersion EventVersion
- 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 mstore event -> EventStoreWriter m event
- module Eventful.Store.Queries
- serializedEventStoreReader :: Monad m => Serializer event serialized -> EventStoreReader key position m serialized -> EventStoreReader key position m event
- serializedVersionedEventStoreReader :: Monad m => Serializer event serialized -> VersionedEventStoreReader m serialized -> VersionedEventStoreReader m event
- serializedGlobalEventStoreReader :: Monad m => Serializer event serialized -> GlobalEventStoreReader m serialized -> GlobalEventStoreReader m event
- serializedEventStoreWriter :: Monad m => Serializer event serialized -> EventStoreWriter m serialized -> EventStoreWriter m event
- newtype EventVersion = EventVersion {}
- newtype SequenceNumber = SequenceNumber {}
- transactionalExpectedWriteHelper :: Monad m => (UUID -> m EventVersion) -> (UUID -> [event] -> m ()) -> ExpectedVersion -> UUID -> [event] -> m (Maybe EventWriteError)
EventStore
newtype EventStoreReader key position m 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 # | |
newtype EventStoreWriter m 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
type VersionedEventStoreReader m event = EventStoreReader UUID EventVersion m (VersionedStreamEvent event) Source #
type GlobalEventStoreReader m 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
| Functor (StreamEvent key position) Source # | |
| Foldable (StreamEvent key position) Source # | |
| Traversable (StreamEvent key position) Source # | |
| (Eq event, Eq position, Eq key) => Eq (StreamEvent key position event) Source # | |
| (Show event, Show position, Show key) => Show (StreamEvent key position event) Source # | |
type VersionedStreamEvent event = StreamEvent UUID EventVersion event Source #
type GlobalStreamEvent event = StreamEvent () SequenceNumber (VersionedStreamEvent event) Source #
data ExpectedVersion Source #
ExpectedVersion is used to assert the event stream is at a certain version number. This is used when multiple writers are concurrently writing to the event store. If the expected version is incorrect, then storing fails.
Constructors
| AnyVersion | Used when the writer doesn't care what version the stream is at. |
| NoStream | The stream shouldn't exist yet. |
| StreamExists | The stream should already exist. |
| ExactVersion EventVersion | Used to assert the stream is at a particular version. |
Instances
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 mstore event -> EventStoreWriter m event Source #
Analog of runEventStoreReaderUsing for a EventStoreWriter.
module Eventful.Store.Queries
Serialization
serializedEventStoreReader :: 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 :: Monad m => Serializer event serialized -> VersionedEventStoreReader m serialized -> VersionedEventStoreReader m event Source #
Convenience wrapper around serializedEventStoreReader for
VersionedEventStoreReader.
serializedGlobalEventStoreReader :: Monad m => Serializer event serialized -> GlobalEventStoreReader m serialized -> GlobalEventStoreReader m event Source #
Convenience wrapper around serializedEventStoreReader for
GlobalEventStoreReader.
serializedEventStoreWriter :: Monad m => Serializer event serialized -> EventStoreWriter m serialized -> EventStoreWriter 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 | |
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 => (UUID -> m EventVersion) -> (UUID -> [event] -> m ()) -> ExpectedVersion -> UUID -> [event] -> m (Maybe EventWriteError) 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.