eventful-core-0.2.0: Core module for eventful

Safe HaskellNone
LanguageHaskell2010

Eventful.Store.Class

Contents

Synopsis

EventStore

newtype EventStoreReader key position m event #

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

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 #

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 #

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

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

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

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

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

Methods

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

show :: StreamEvent key position event -> String #

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

data ExpectedVersion #

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 #

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 #

Serialization

serializedEventStoreReader :: Monad m => Serializer event serialized -> EventStoreReader key position m serialized -> EventStoreReader key position m event #

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 #

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 #

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 # 
Eq EventVersion # 
Num EventVersion # 
Ord EventVersion # 
Read EventVersion # 
Show EventVersion # 
ToJSON EventVersion # 
FromJSON EventVersion # 

newtype SequenceNumber #

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 # 
Eq SequenceNumber # 
Num SequenceNumber # 
Ord SequenceNumber # 
Read SequenceNumber # 
Show SequenceNumber # 
ToJSON SequenceNumber # 
FromJSON SequenceNumber # 
ToHttpApiData SequenceNumber # 
FromHttpApiData SequenceNumber # 
PathPiece SequenceNumber # 

Utility functions

transactionalExpectedWriteHelper :: Monad m => (UUID -> m EventVersion) -> (UUID -> [event] -> m ()) -> ExpectedVersion -> UUID -> [event] -> m (Maybe EventWriteError) #

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.