eventful-core-0.2.0: Core module for eventful

Safe HaskellNone
LanguageHaskell2010

Eventful.Store.Class

Contents

Synopsis

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 # 

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 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

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 # 

Methods

fmap :: (a -> b) -> StreamEvent key position a -> StreamEvent key position b #

(<$) :: a -> StreamEvent key position b -> StreamEvent key position a #

Foldable (StreamEvent key position) Source # 

Methods

fold :: Monoid m => StreamEvent key position m -> 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 # 

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) #

(Eq event, Eq position, Eq key) => Eq (StreamEvent key position event) Source # 

Methods

(==) :: StreamEvent key position event -> StreamEvent key position event -> Bool #

(/=) :: StreamEvent key position event -> StreamEvent key position event -> Bool #

(Show event, Show position, Show key) => Show (StreamEvent key position event) Source # 

Methods

showsPrec :: Int -> StreamEvent key position event -> ShowS #

show :: StreamEvent key position event -> String #

showList :: [StreamEvent key position event] -> ShowS #

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.

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 #

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).

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

Instances

Enum EventVersion Source # 
Eq EventVersion Source # 
Num EventVersion Source # 
Ord EventVersion Source # 
Read EventVersion Source # 
Show EventVersion Source # 
ToJSON EventVersion Source # 
FromJSON EventVersion Source # 

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 

Instances

Enum SequenceNumber Source # 
Eq SequenceNumber Source # 
Num SequenceNumber Source # 
Ord SequenceNumber Source # 
Read SequenceNumber Source # 
Show SequenceNumber Source # 
ToJSON SequenceNumber Source # 
FromJSON SequenceNumber Source # 
ToHttpApiData SequenceNumber Source # 
FromHttpApiData SequenceNumber Source # 
PathPiece SequenceNumber Source # 

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.