{-# LANGUAGE TypeFamilies #-}
module Arbiter.Core.MonadArbiter
( MonadArbiter (..)
, JobHandler
, HasRegistry
, ResultOf
, Params
, SomeParam (..)
, ParamType (..)
, Query (..)
) where
import Data.Int (Int64)
import Data.Kind (Type)
import GHC.TypeLits (ErrorMessage (..), TypeError)
import UnliftIO (MonadUnliftIO)
import Arbiter.Core.Codec (ParamType (..), Params, SomeParam (..))
import Arbiter.Core.Job.Schema (SchemaName)
import Arbiter.Core.Job.Types (JobRead)
import Arbiter.Core.Listen (Listener)
import Arbiter.Core.QueueRegistry (JobPayloadRegistry, ResultFor)
import Arbiter.Core.Sql.Query (Query (..))
class (MonadUnliftIO m) => MonadArbiter m where
type RegistryOf m :: JobPayloadRegistry
type
RegistryOf m =
TypeError
( 'Text "No registry declared for "
':<>: 'ShowType m
':$$: 'Text "Its MonadArbiter instance is missing the RegistryOf definition."
':$$: 'Text "Add to the instance: type RegistryOf "
':<>: 'ShowType m
':<>: 'Text " = YourRegistry"
)
type Handler m job result :: Type
getSchema :: m SchemaName
executeQuery :: Query a -> m [a]
executeQueryPrepared :: Query a -> m [a]
executeQueryPrepared = Query a -> m [a]
forall a. Query a -> m [a]
forall (m :: * -> *) a. MonadArbiter m => Query a -> m [a]
executeQuery
executeStatement :: Query a -> m Int64
withDbTransaction :: m a -> m a
runHandlerWithConnection
:: JobHandler m payload (ResultOf m payload)
-> JobRead payload
-> m (ResultOf m payload)
getListener :: m (Maybe Listener)
type JobHandler m (payload :: Type) result = Handler m (JobRead payload) result
type HasRegistry m (registry :: JobPayloadRegistry) =
(MonadArbiter m, RegistryOf m ~ registry)
type ResultOf m (payload :: Type) = ResultFor payload (RegistryOf m)