eventful-core-0.1.3: Core module for eventful

Safe HaskellNone
LanguageHaskell2010

Eventful.Store.Class

Contents

Synopsis

EventStore

data EventStore serialized m Source #

The EventStore is the core type of eventful. A store operates in some monad m and stores events by serializing them to the type serialized.

Constructors

EventStore 

Fields

newtype GloballyOrderedEventStore serialized m Source #

Gets all the events ordered starting with a given SequenceNumber, and ordered by SequenceNumber. This is used when replaying all the events in a store.

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.

runEventStoreUsing :: (Monad m, Monad mstore) => (forall a. mstore a -> m a) -> EventStore serialized mstore -> EventStore serialized m Source #

Changes the monad an EventStore runs in. This is useful to run event stores in another Monad while forgetting the original Monad.

runGloballyOrderedEventStoreUsing :: (Monad m, Monad mstore) => (forall a. mstore a -> m a) -> GloballyOrderedEventStore serialized mstore -> GloballyOrderedEventStore serialized m Source #

Serialization

serializedEventStore :: Monad m => Serializer event serialized -> EventStore serialized m -> EventStore event m Source #

Wraps an EventStore and transparently serializes/deserializes events for you. Note that in this implementation deserialization errors when using getEvents are simply ignored (the event is not returned).

Utility types

data ProjectionEvent event Source #

A ProjectionEvent is an event that is associated with a Projection via the projection's UUID.

Constructors

ProjectionEvent 

Fields

Instances

Functor ProjectionEvent Source # 

Methods

fmap :: (a -> b) -> ProjectionEvent a -> ProjectionEvent b #

(<$) :: a -> ProjectionEvent b -> ProjectionEvent a #

Foldable ProjectionEvent Source # 

Methods

fold :: Monoid m => ProjectionEvent m -> m #

foldMap :: Monoid m => (a -> m) -> ProjectionEvent a -> m #

foldr :: (a -> b -> b) -> b -> ProjectionEvent a -> b #

foldr' :: (a -> b -> b) -> b -> ProjectionEvent a -> b #

foldl :: (b -> a -> b) -> b -> ProjectionEvent a -> b #

foldl' :: (b -> a -> b) -> b -> ProjectionEvent a -> b #

foldr1 :: (a -> a -> a) -> ProjectionEvent a -> a #

foldl1 :: (a -> a -> a) -> ProjectionEvent a -> a #

toList :: ProjectionEvent a -> [a] #

null :: ProjectionEvent a -> Bool #

length :: ProjectionEvent a -> Int #

elem :: Eq a => a -> ProjectionEvent a -> Bool #

maximum :: Ord a => ProjectionEvent a -> a #

minimum :: Ord a => ProjectionEvent a -> a #

sum :: Num a => ProjectionEvent a -> a #

product :: Num a => ProjectionEvent a -> a #

Traversable ProjectionEvent Source # 

Methods

traverse :: Applicative f => (a -> f b) -> ProjectionEvent a -> f (ProjectionEvent b) #

sequenceA :: Applicative f => ProjectionEvent (f a) -> f (ProjectionEvent a) #

mapM :: Monad m => (a -> m b) -> ProjectionEvent a -> m (ProjectionEvent b) #

sequence :: Monad m => ProjectionEvent (m a) -> m (ProjectionEvent a) #

Eq event => Eq (ProjectionEvent event) Source # 

Methods

(==) :: ProjectionEvent event -> ProjectionEvent event -> Bool #

(/=) :: ProjectionEvent event -> ProjectionEvent event -> Bool #

Show event => Show (ProjectionEvent event) Source # 

data StoredEvent event Source #

A StoredEvent is an event with associated storage metadata.

Constructors

StoredEvent 

Fields

Instances

Functor StoredEvent Source # 

Methods

fmap :: (a -> b) -> StoredEvent a -> StoredEvent b #

(<$) :: a -> StoredEvent b -> StoredEvent a #

Foldable StoredEvent Source # 

Methods

fold :: Monoid m => StoredEvent m -> m #

foldMap :: Monoid m => (a -> m) -> StoredEvent a -> m #

foldr :: (a -> b -> b) -> b -> StoredEvent a -> b #

foldr' :: (a -> b -> b) -> b -> StoredEvent a -> b #

foldl :: (b -> a -> b) -> b -> StoredEvent a -> b #

foldl' :: (b -> a -> b) -> b -> StoredEvent a -> b #

foldr1 :: (a -> a -> a) -> StoredEvent a -> a #

foldl1 :: (a -> a -> a) -> StoredEvent a -> a #

toList :: StoredEvent a -> [a] #

null :: StoredEvent a -> Bool #

length :: StoredEvent a -> Int #

elem :: Eq a => a -> StoredEvent a -> Bool #

maximum :: Ord a => StoredEvent a -> a #

minimum :: Ord a => StoredEvent a -> a #

sum :: Num a => StoredEvent a -> a #

product :: Num a => StoredEvent a -> a #

Traversable StoredEvent Source # 

Methods

traverse :: Applicative f => (a -> f b) -> StoredEvent a -> f (StoredEvent b) #

sequenceA :: Applicative f => StoredEvent (f a) -> f (StoredEvent a) #

mapM :: Monad m => (a -> m b) -> StoredEvent a -> m (StoredEvent b) #

sequence :: Monad m => StoredEvent (m a) -> m (StoredEvent a) #

Eq event => Eq (StoredEvent event) Source # 

Methods

(==) :: StoredEvent event -> StoredEvent event -> Bool #

(/=) :: StoredEvent event -> StoredEvent event -> Bool #

Show event => Show (StoredEvent event) Source # 

Methods

showsPrec :: Int -> StoredEvent event -> ShowS #

show :: StoredEvent event -> String #

showList :: [StoredEvent event] -> ShowS #

data GloballyOrderedEvent event Source #

A GloballyOrderedEvent is like a StoredEvent but has a global SequenceNumber.

Constructors

GloballyOrderedEvent 

Fields

Instances

Functor GloballyOrderedEvent Source # 
Foldable GloballyOrderedEvent Source # 

Methods

fold :: Monoid m => GloballyOrderedEvent m -> m #

foldMap :: Monoid m => (a -> m) -> GloballyOrderedEvent a -> m #

foldr :: (a -> b -> b) -> b -> GloballyOrderedEvent a -> b #

foldr' :: (a -> b -> b) -> b -> GloballyOrderedEvent a -> b #

foldl :: (b -> a -> b) -> b -> GloballyOrderedEvent a -> b #

foldl' :: (b -> a -> b) -> b -> GloballyOrderedEvent a -> b #

foldr1 :: (a -> a -> a) -> GloballyOrderedEvent a -> a #

foldl1 :: (a -> a -> a) -> GloballyOrderedEvent a -> a #

toList :: GloballyOrderedEvent a -> [a] #

null :: GloballyOrderedEvent a -> Bool #

length :: GloballyOrderedEvent a -> Int #

elem :: Eq a => a -> GloballyOrderedEvent a -> Bool #

maximum :: Ord a => GloballyOrderedEvent a -> a #

minimum :: Ord a => GloballyOrderedEvent a -> a #

sum :: Num a => GloballyOrderedEvent a -> a #

product :: Num a => GloballyOrderedEvent a -> a #

Traversable GloballyOrderedEvent Source # 
Eq event => Eq (GloballyOrderedEvent event) Source # 
Show event => Show (GloballyOrderedEvent event) Source # 

storedEventToGloballyOrderedEvent :: SequenceNumber -> StoredEvent event -> GloballyOrderedEvent event Source #

Convert a StoredEvent to a GloballyOrderedEvent by adding the SequenceNumber. This is mainly used by event stores to create globally ordered events.

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 -> [serialized] -> m ()) -> ExpectedVersion -> UUID -> [serialized] -> 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.