eventium-memory 0.6.1 → 0.7.0
raw patch · 4 files changed
+40/−5 lines, 4 filesdep ~eventium-corePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: eventium-core
API changes (from Hackage documentation)
- Eventium.ProjectionCache.Memory: ProjectionCache :: (key -> position -> encoded -> m ()) -> (key -> m (Maybe (position, encoded))) -> ProjectionCache key position encoded (m :: Type -> Type)
+ Eventium.ProjectionCache.Memory: ProjectionCache :: (key -> position -> encoded -> m ()) -> (key -> m (Maybe (position, encoded))) -> ProjectionCache key position (m :: Type -> Type) encoded
- Eventium.ProjectionCache.Memory: [loadSnapshot] :: ProjectionCache key position encoded (m :: Type -> Type) -> key -> m (Maybe (position, encoded))
+ Eventium.ProjectionCache.Memory: [loadSnapshot] :: ProjectionCache key position (m :: Type -> Type) encoded -> key -> m (Maybe (position, encoded))
- Eventium.ProjectionCache.Memory: [storeSnapshot] :: ProjectionCache key position encoded (m :: Type -> Type) -> key -> position -> encoded -> m ()
+ Eventium.ProjectionCache.Memory: [storeSnapshot] :: ProjectionCache key position (m :: Type -> Type) encoded -> key -> position -> encoded -> m ()
- Eventium.ProjectionCache.Memory: codecProjectionCache :: forall (m :: Type -> Type) state encoded key position. Monad m => Codec state encoded -> ProjectionCache key position encoded m -> ProjectionCache key position state m
+ Eventium.ProjectionCache.Memory: codecProjectionCache :: forall (m :: Type -> Type) state encoded key position. Monad m => Codec state encoded -> ProjectionCache key position m encoded -> ProjectionCache key position m state
- Eventium.ProjectionCache.Memory: data ProjectionCache key position encoded (m :: Type -> Type)
+ Eventium.ProjectionCache.Memory: data ProjectionCache key position (m :: Type -> Type) encoded
- Eventium.ProjectionCache.Memory: embeddedStateProjectionCache :: forall s (m :: Type -> Type) key position encoded. (MonadState s m, Ord key) => (s -> ProjectionMap key position encoded) -> (s -> ProjectionMap key position encoded -> s) -> ProjectionCache key position encoded m
+ Eventium.ProjectionCache.Memory: embeddedStateProjectionCache :: forall s (m :: Type -> Type) key position encoded. (MonadState s m, Ord key) => (s -> ProjectionMap key position encoded) -> (s -> ProjectionMap key position encoded -> s) -> ProjectionCache key position m encoded
- Eventium.ProjectionCache.Memory: getLatestGlobalProjectionWithCache :: Monad m => GlobalEventStoreReader m event -> GlobalProjectionCache state m -> GlobalStreamProjection state event -> m (GlobalStreamProjection state event)
+ Eventium.ProjectionCache.Memory: getLatestGlobalProjectionWithCache :: Monad m => GlobalEventStoreReader m event -> GlobalProjectionCache m state -> GlobalStreamProjection state event -> m (GlobalStreamProjection state event)
- Eventium.ProjectionCache.Memory: getLatestVersionedProjectionWithCache :: Monad m => VersionedEventStoreReader m event -> VersionedProjectionCache state m -> VersionedStreamProjection state event -> m (VersionedStreamProjection state event)
+ Eventium.ProjectionCache.Memory: getLatestVersionedProjectionWithCache :: Monad m => VersionedEventStoreReader m event -> VersionedProjectionCache m state -> VersionedStreamProjection state event -> m (VersionedStreamProjection state event)
- Eventium.ProjectionCache.Memory: runProjectionCacheUsing :: (forall a. () => mstore a -> m a) -> ProjectionCache key position encoded mstore -> ProjectionCache key position encoded m
+ Eventium.ProjectionCache.Memory: runProjectionCacheUsing :: (forall a. () => mstore a -> m a) -> ProjectionCache key position mstore encoded -> ProjectionCache key position m encoded
- Eventium.ProjectionCache.Memory: snapshotEventHandler :: forall (m :: Type -> Type) event state. Monad m => VersionedEventStoreReader m event -> VersionedProjectionCache state m -> Projection state event -> EventHandler m (VersionedStreamEvent event)
+ Eventium.ProjectionCache.Memory: snapshotEventHandler :: forall (m :: Type -> Type) event state. Monad m => VersionedEventStoreReader m event -> VersionedProjectionCache m state -> Projection state event -> EventHandler m (VersionedStreamEvent event)
- Eventium.ProjectionCache.Memory: snapshotGlobalEventHandler :: forall (m :: Type -> Type) event state. Monad m => GlobalEventStoreReader m event -> GlobalProjectionCache state m -> Projection state (VersionedStreamEvent event) -> EventHandler m (GlobalStreamEvent event)
+ Eventium.ProjectionCache.Memory: snapshotGlobalEventHandler :: forall (m :: Type -> Type) event state. Monad m => GlobalEventStoreReader m event -> GlobalProjectionCache m state -> Projection state (VersionedStreamEvent event) -> EventHandler m (GlobalStreamEvent event)
- Eventium.ProjectionCache.Memory: tvarProjectionCache :: Ord key => TVar (ProjectionMap key position encoded) -> ProjectionCache key position encoded STM
+ Eventium.ProjectionCache.Memory: tvarProjectionCache :: Ord key => TVar (ProjectionMap key position encoded) -> ProjectionCache key position STM encoded
- Eventium.ProjectionCache.Memory: type GlobalProjectionCache encoded (m :: Type -> Type) = ProjectionCache () SequenceNumber encoded m
+ Eventium.ProjectionCache.Memory: type GlobalProjectionCache (m :: Type -> Type) encoded = ProjectionCache () SequenceNumber m encoded
- Eventium.ProjectionCache.Memory: type VersionedProjectionCache encoded (m :: Type -> Type) = ProjectionCache UUID EventVersion encoded m
+ Eventium.ProjectionCache.Memory: type VersionedProjectionCache (m :: Type -> Type) encoded = ProjectionCache UUID EventVersion m encoded
- Eventium.ProjectionCache.Memory: updateGlobalProjectionCache :: Monad m => GlobalEventStoreReader m event -> GlobalProjectionCache state m -> GlobalStreamProjection state event -> m ()
+ Eventium.ProjectionCache.Memory: updateGlobalProjectionCache :: Monad m => GlobalEventStoreReader m event -> GlobalProjectionCache m state -> GlobalStreamProjection state event -> m ()
- Eventium.ProjectionCache.Memory: updateVersionedProjectionCache :: Monad m => VersionedEventStoreReader m event -> VersionedProjectionCache state m -> VersionedStreamProjection state event -> m ()
+ Eventium.ProjectionCache.Memory: updateVersionedProjectionCache :: Monad m => VersionedEventStoreReader m event -> VersionedProjectionCache m state -> VersionedStreamProjection state event -> m ()
Files
- CHANGELOG.md +9/−0
- eventium-memory.cabal +3/−3
- src/Eventium/ProjectionCache/Memory.hs +2/−2
- tests/Eventium/ProcessManagerSpec.hs +26/−0
CHANGELOG.md view
@@ -1,5 +1,14 @@ # eventium-memory Changelog +## 0.7.0++### Breaking changes++- `ProjectionCache` type parameters reordered to put the monad before the payload+ (`ProjectionCache key position m encoded`; `GlobalProjectionCache m encoded`,+ `VersionedProjectionCache m encoded`), following the `eventium-core` change —+ behaviour unchanged, update explicit type signatures.+ ## 0.6.1 - Raise `base` lower bound to `>= 4.20` (GHC 9.10) to match the supported toolchain.
eventium-memory.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: eventium-memory-version: 0.6.1+version: 0.7.0 synopsis: In-memory implementations for eventium description: 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@@ -49,7 +49,7 @@ build-depends: base >=4.20 && <5 , containers >=0.6 && <0.8- , eventium-core >=0.6.1 && <0.7.0+ , eventium-core >=0.7.0 && <0.8.0 , mtl >=2.2 && <2.4 , safe ==0.3.* , stm ==2.5.*@@ -89,7 +89,7 @@ HUnit , base >=4.20 && <5 , containers >=0.6 && <0.8- , eventium-core >=0.6.1 && <0.7.0+ , eventium-core >=0.7.0 && <0.8.0 , eventium-testkit , hspec , mtl >=2.2 && <2.4
src/Eventium/ProjectionCache/Memory.hs view
@@ -38,7 +38,7 @@ tvarProjectionCache :: (Ord key) => TVar (ProjectionMap key position encoded) ->- ProjectionCache key position encoded STM+ ProjectionCache key position STM encoded tvarProjectionCache tvar = ProjectionCache { storeSnapshot = \uuid version projState -> modifyTVar' tvar (storeProjectionInMap uuid version projState),@@ -50,7 +50,7 @@ (MonadState s m, Ord key) => (s -> ProjectionMap key position encoded) -> (s -> ProjectionMap key position encoded -> s) ->- ProjectionCache key position encoded m+ ProjectionCache key position m encoded embeddedStateProjectionCache getMap setMap = ProjectionCache { storeSnapshot = \uuid version projState -> modify' (storeSnapshot uuid version projState),
tests/Eventium/ProcessManagerSpec.hs view
@@ -2,10 +2,16 @@ module Eventium.ProcessManagerSpec (spec) where +import Control.Concurrent.STM import Data.IORef+import qualified Data.Map.Strict as Map+import Data.Maybe (isJust)+import Eventium.EventHandler (EventHandler (..)) import Eventium.ProcessManager import Eventium.Projection+import Eventium.ProjectionCache.Memory (tvarProjectionCache) import Eventium.Store.Class+import Eventium.Store.Memory (emptyEventMap, tvarGlobalEventStoreReader) import Eventium.UUID import Test.Hspec @@ -71,6 +77,26 @@ ] finalState = latestProjection proj events finalState.pendingTransfers `shouldBe` [(target, 30), (target, 50)]++ describe "cachedProcessManagerEventHandler" $ do+ it "dispatches effects and advances the snapshot cache" $ do+ eventsTVar <- newTVarIO emptyEventMap+ cacheTVar <- newTVarIO Map.empty+ dispatchedTVar <- newTVarIO ([] :: [(UUID, TestCommand)])+ let reader = tvarGlobalEventStoreReader eventsTVar+ cache = tvarProjectionCache cacheTVar+ dispatcher =+ fireAndForgetDispatcher $ \uuid cmd ->+ modifyTVar' dispatchedTVar (++ [(uuid, cmd)])+ handler = cachedProcessManagerEventHandler testProcessManager reader cache dispatcher+ target = uuidFromInteger 2+ event = StreamEvent (uuidFromInteger 1) 0 (emptyMetadata "") (TransferInitiated target 50)+ atomically $ case handler of EventHandler f -> f event+ dispatched <- readTVarIO dispatchedTVar+ dispatched `shouldBe` [(target, AcceptCredit 50)]+ -- The handler persisted a snapshot for the global projection (key = ()).+ snap <- readTVarIO cacheTVar+ Map.lookup () snap `shouldSatisfy` isJust describe "runProcessManagerEffects" $ do it "should dispatch commands via the dispatch function" $ do