# 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
```haskell
-- 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
```haskell
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
```yaml
dependencies:
- eventium-core
- eventium-memory
```
## Documentation
- [Main README](../README.md)
- [Design](../DESIGN.md)
- [Examples](../examples/)
## License
MIT -- see [LICENSE.md](LICENSE.md)