| Copyright | (c) 2024 |
|---|---|
| License | BSD3 |
| Maintainer | maintainer@example.com |
| Stability | experimental |
| Safe Haskell | None |
| Language | GHC2021 |
Hindsight
Description
Hindsight is a type-safe event sourcing system that provides strong compile-time guarantees for event handling, versioning, and consistency in event-driven applications.
Getting Started
To get started with Hindsight, you'll typically want to:
- Define your events using
Eventinstances and type families - Choose a storage backend (Memory, Filesystem, or PostgreSQL)
- Set up projections to build read models
- Insert and query events through the event store
Example Usage
import Hindsight
import Hindsight.Store.Memory (newMemoryStore)
-- Define your event (using type-level string)
type UserRegistered = "user_registered"
data UserInfo = UserInfo { userId :: UUID, name :: Text }
deriving (Show, Eq, Generic, FromJSON, ToJSON)
-- Declare versions and register event
type instance MaxVersion UserRegistered = 0
type instance Versions UserRegistered = '[UserInfo]
instance Event UserRegistered
instance MigrateVersion 0 UserRegistered
-- Use it
main = do
store <- newMemoryStore
streamId <- StreamId <$> UUID.nextRandom
let event = mkEvent UserRegistered (UserInfo userId Alice)
result <- insertEvents store Nothing $ singleEvent streamId NoStream event
case result of
SuccessfulInsertion _ -> putStrLn "Event inserted successfully"
FailedInsertion err -> putStrLn $ "Failed: " <> show err
Storage Backends
Storage backends are in separate packages:
- Hindsight.Store.Memory (package: hindsight-memory-store) - In-memory storage for testing and development
- Hindsight.Store.Filesystem (package: hindsight-filesystem-store) - File-based persistence for durable event storage
- Hindsight.Store.PostgreSQL (package: hindsight-postgresql-store) - PostgreSQL backend with ACID guarantees and projection system
Core Concepts
- Hindsight.Events - Event definitions, versioning, and type-level utilities
- Hindsight.Store - Common event store interface and data types
For projection system, see the hindsight-postgresql-projections package.