module Eventful.ReadModel.Class
( ReadModel (..)
, runPollingReadModel
) where
import Control.Concurrent (threadDelay)
import Control.Monad (forever)
import Control.Monad.IO.Class (liftIO, MonadIO)
import Eventful.Store.Class
data ReadModel model serialized m =
ReadModel
{ readModelModel :: model
, readModelLatestAppliedSequence :: model -> m SequenceNumber
, readModelHandleEvents :: model -> [GlobalStreamEvent serialized] -> m ()
}
type PollingPeriodSeconds = Double
runPollingReadModel
:: (MonadIO m, Monad mstore)
=> ReadModel model serialized m
-> GlobalEventStoreReader mstore serialized
-> (forall a. mstore a -> m a)
-> PollingPeriodSeconds
-> m ()
runPollingReadModel ReadModel{..} globalReader runStore waitSeconds = forever $ do
latestSeq <- readModelLatestAppliedSequence readModelModel
newEvents <- runStore $ getEvents globalReader (eventsStartingAt () $ latestSeq + 1)
readModelHandleEvents readModelModel newEvents
liftIO $ threadDelay $ ceiling (waitSeconds * 1000000)