packages feed

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 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