eventium-core-0.1.0: Core module for eventium
Safe HaskellNone
LanguageHaskell2010

Eventium.Store.Class

Synopsis

EventStore

newtype EventStoreReader key position (m :: Type -> Type) 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

Instances details
Functor m => Functor (EventStoreReader key position m) Source # 
Instance details

Defined in Eventium.Store.Class

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 key position (m :: Type -> Type) 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

Instances details
Contravariant (EventStoreWriter key position m) Source # 
Instance details

Defined in Eventium.Store.Class

Methods

contramap :: (a' -> a) -> EventStoreWriter key position m a -> EventStoreWriter key position m a' #

(>$) :: b -> EventStoreWriter key position m b -> EventStoreWriter key position m a #

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

Instances details
Foldable (StreamEvent key position) Source # 
Instance details

Defined in Eventium.Store.Class

Methods

fold :: Monoid m => StreamEvent key position m -> m #

foldMap :: Monoid m => (a -> m) -> StreamEvent key position a -> 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 # 
Instance details

Defined in Eventium.Store.Class

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

Functor (StreamEvent key position) Source # 
Instance details

Defined in Eventium.Store.Class

Methods

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

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

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

Defined in Eventium.Store.Class

Methods

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

show :: StreamEvent key position event -> String #

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

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

Defined in Eventium.Store.Class

Methods

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

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

data ExpectedPosition position Source #

ExpectedPosition is used to assert the event stream is at a certain position. This is used when multiple writers are concurrently writing to the event store. If the expected position is incorrect, then storing fails.

Constructors

AnyPosition

Used when the writer doesn't care what position the stream is at.

NoStream

The stream shouldn't exist yet.

StreamExists

The stream should already exist.

ExactPosition position

Used to assert the stream is at a particular position.

Instances

Instances details
Show position => Show (ExpectedPosition position) Source # 
Instance details

Defined in Eventium.Store.Class

Methods

showsPrec :: Int -> ExpectedPosition position -> ShowS #

show :: ExpectedPosition position -> String #

showList :: [ExpectedPosition position] -> ShowS #

Eq position => Eq (ExpectedPosition position) Source # 
Instance details

Defined in Eventium.Store.Class

Methods

(==) :: ExpectedPosition position -> ExpectedPosition position -> Bool #

(/=) :: ExpectedPosition position -> ExpectedPosition position -> Bool #

newtype EventWriteError position Source #

Constructors

EventStreamNotAtExpectedVersion position 

Instances

Instances details
Show position => Show (EventWriteError position) Source # 
Instance details

Defined in Eventium.Store.Class

Methods

showsPrec :: Int -> EventWriteError position -> ShowS #

show :: EventWriteError position -> String #

showList :: [EventWriteError position] -> ShowS #

Eq position => Eq (EventWriteError position) Source # 
Instance details

Defined in Eventium.Store.Class

Methods

(==) :: EventWriteError position -> EventWriteError position -> Bool #

(/=) :: EventWriteError position -> EventWriteError position -> Bool #

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 key posirion mstore event -> EventStoreWriter key posirion m event Source #

Serialization

serializedEventStoreReader :: forall (m :: Type -> Type) event serialized key position. 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 :: forall (m :: Type -> Type) event serialized. Monad m => Serializer event serialized -> VersionedEventStoreReader m serialized -> VersionedEventStoreReader m event Source #

serializedGlobalEventStoreReader :: forall (m :: Type -> Type) event serialized. Monad m => Serializer event serialized -> GlobalEventStoreReader m serialized -> GlobalEventStoreReader m event Source #

Convenience wrapper around serializedEventStoreReader for GlobalEventStoreReader.

serializedEventStoreWriter :: forall (m :: Type -> Type) event serialized key position. Monad m => Serializer event serialized -> EventStoreWriter key position m serialized -> EventStoreWriter key position 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

Instances details
FromJSON EventVersion Source # 
Instance details

Defined in Eventium.Store.Class

ToJSON EventVersion Source # 
Instance details

Defined in Eventium.Store.Class

Enum EventVersion Source # 
Instance details

Defined in Eventium.Store.Class

Num EventVersion Source # 
Instance details

Defined in Eventium.Store.Class

Read EventVersion Source # 
Instance details

Defined in Eventium.Store.Class

Show EventVersion Source # 
Instance details

Defined in Eventium.Store.Class

Eq EventVersion Source # 
Instance details

Defined in Eventium.Store.Class

Ord EventVersion Source # 
Instance details

Defined in Eventium.Store.Class

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

Instances details
FromJSON SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

ToJSON SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

Enum SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

Num SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

Read SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

Show SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

Eq SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

Ord SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

FromHttpApiData SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

ToHttpApiData SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

PathPiece SequenceNumber Source # 
Instance details

Defined in Eventium.Store.Class

Utility functions

transactionalExpectedWriteHelper :: (Monad m, Ord position, Num position) => (key -> m position) -> (key -> [event] -> m EventVersion) -> key -> ExpectedPosition position -> [event] -> m (Either (EventWriteError position) EventVersion) 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.