In-memory implementations for eventium.
Eventium-memory provides in-memory implementations of event stores and projection caches for the Eventium event sourcing framework. This package is ideal for development, testing, and prototyping event-sourced applications without requiring external dependencies like databases. All data is stored in STM-based concurrent data structures for thread-safe access.
Eventium Memory
In-memory event store for Eventium, backed by STM.
Overview
eventium-memory provides thread-safe, in-memory implementations of EventStoreReader and EventStoreWriter for development, testing, and prototyping. No external database is required.
API
-- Create a TVar-backed store
eventMapTVar :: IO (TVar (EventMap event))
-- TVar-based (for use inside STM or lifted to IO)
tvarEventStoreReader :: TVar (EventMap event) -> VersionedEventStoreReader STM event
tvarEventStoreWriter :: TVar (EventMap event) -> VersionedEventStoreWriter STM event
tvarGlobalEventStoreReader :: TVar (EventMap event) -> GlobalEventStoreReader STM event
-- MonadState-based (for pure state threading)
stateEventStoreReader :: (MonadState (EventMap event) m) => VersionedEventStoreReader m event
stateEventStoreWriter :: (MonadState (EventMap event) m) => VersionedEventStoreWriter m event
stateGlobalEventStoreReader :: (MonadState (EventMap event) m) => GlobalEventStoreReader m event
Use runEventStoreReaderUsing atomically / runEventStoreWriterUsing atomically to lift the STM stores into IO.
Usage
import Control.Concurrent.STM (atomically)
import Eventium
import Eventium.Store.Memory
main :: IO ()
main = do
tvar <- eventMapTVar
let writer = runEventStoreWriterUsing atomically (tvarEventStoreWriter tvar)
reader = runEventStoreReaderUsing atomically (tvarEventStoreReader tvar)
result <- applyCommandHandler writer reader myHandler aggregateId cmd
print result
When to Use
- Testing -- fast, isolated, no I/O overhead.
- Prototyping -- iterate on domain logic without database setup.
- Examples -- the counter-cli example uses this backend.
For persistent storage, use eventium-sqlite or eventium-postgresql.
Installation
dependencies:
- eventium-core
- eventium-memory
Documentation
License
MIT -- see LICENSE.md.