packages feed

eventium-memory-0.1.0: README.md

# Eventium Memory

In-memory implementations of event stores, read models, and projection caches for Eventium.

## Overview

`eventium-memory` provides thread-safe, in-memory storage implementations for the Eventium event sourcing framework. This package is ideal for development, testing, and prototyping event-sourced applications without requiring external dependencies like databases.

## Features

- ✅ **In-Memory Event Store** - Fast, STM-based event storage
- ✅ **Thread-Safe** - Concurrent access via Software Transactional Memory
- ✅ **No External Dependencies** - No database setup required
- ✅ **Perfect for Testing** - Fast test execution with isolated state
- ✅ **Projection Cache** - In-memory snapshot storage
- ✅ **Read Model Support** - Memory-based read model implementation

## Components

### Event Store (`Eventium.Store.Memory`)
Implements both `EventStoreReader` and `EventStoreWriter` with:
- Per-stream versioning
- Global event ordering
- Optimistic concurrency control
- STM transactions for atomicity

### Read Model (`Eventium.ReadModel.Memory`)
In-memory read model implementation for building query-optimized views.

### Projection Cache (`Eventium.ProjectionCache.Memory`)
Stores projection snapshots in memory to avoid replaying entire event histories.

## Usage

```haskell
import Eventium.Store.Memory (newEventStore)
import Control.Concurrent.STM (atomically)

main :: IO ()
main = do
  -- Create a new in-memory event store
  store <- atomically newEventStore
  
  -- Use it with your command handlers and projections
  result <- applyCommandHandler 
    (eventStoreWriter store)
    (eventStoreReader store) 
    myCommandHandler 
    aggregateId 
    command
```

## Installation

Add to your `package.yaml`:

```yaml
dependencies:
  - eventium-core
  - eventium-memory
```

Or to your `.cabal` file:

```cabal
build-depends:
    eventium-core
  , eventium-memory
```

## Use Cases

### Development
Quickly prototype event-sourced applications without database setup.

### Testing
- Fast test execution (no I/O overhead)
- Isolated test state (each test gets fresh store)
- Easy verification of event sequences

### Demonstration
Perfect for demos, tutorials, and learning event sourcing concepts.

## Example

```haskell
-- Create store
store <- atomically newEventStore

-- Write events
writeResult <- atomically $ 
  writeEvents (eventStoreWriter store) 
    streamKey 
    ExpectedPositionAny 
    [event1, event2]

-- Read events back
events <- atomically $ 
  readEvents (eventStoreReader store) 
    streamKey 
    QueryRangeAll
```

## Limitations

- **Not Persistent** - All data lost when process ends
- **Memory Constraints** - Limited by available RAM
- **Single Process** - No distributed access

For production use, consider:
- `eventium-sqlite` - Persistent, single-process storage
- `eventium-postgresql` - Persistent, multi-process storage

## Documentation

- [Main README](../README.md) - Project overview
- [Design Documentation](../DESIGN.md) - Architecture details
- [Examples](../examples/) - Working applications

## License

MIT - see [LICENSE.md](LICENSE.md)