{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
module Database.EventStore.Internal.OperationManager
  ( Manager
  , Decision(..)
  , new
  , submit
  , handle
  , cleanup
  , check
  ) where
import Database.EventStore.Internal.Callback
import Database.EventStore.Internal.Connection
import Database.EventStore.Internal.Control
import Database.EventStore.Internal.Logger
import Database.EventStore.Internal.Manager.Operation.Registry
import Database.EventStore.Internal.Operation
import Database.EventStore.Internal.Prelude
import Database.EventStore.Internal.Types
data Manager = Manager { _reg :: Registry }
new :: ConnectionRef -> IO Manager
new = fmap Manager . newRegistry
submit :: Manager -> Operation a -> Callback a -> EventStore ()
submit Manager{..} op cb = register _reg op cb
handle :: Manager -> Package -> EventStore (Maybe Decision)
handle Manager{..} pkg = handlePackage _reg pkg
cleanup :: Manager -> EventStore ()
cleanup Manager{..} = do
  $(logInfo) "Cleaning up pending requests..."
  abortPendingRequests _reg
  $(logInfo) "Cleanup done successfully."
check :: Manager -> EventStore ()
check Manager{..} = do
  checkAndRetry _reg
  startAwaitings _reg