Safe Haskell | None |
---|---|
Language | Haskell2010 |
- 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
.
EventStoreReader | |
|
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
.
EventStoreWriter | |
|
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.
StreamEvent | |
|
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.
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. |
data EventWriteError Source #
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.
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.
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.