{-# LANGUAGE TypeFamilies #-}
module Arbiter.Core.MonadArbiter
( MonadArbiter (..)
, JobHandler
, HasRegistry
, ResultOf
, Query (..)
, Piece (..)
, mkQuery
, Params
, SomeParam (..)
, ParamType (..)
, RowCodec
, Col (..)
, NullCol (..)
, runCodec
, Stored (..)
, storedBytes
, countOr0
, countOr0Prepared
, queryMaybe
, queryAny
) where
import Data.Int (Int64)
import Data.Kind (Type)
import Data.Maybe (listToMaybe)
import GHC.TypeLits (ErrorMessage (..), TypeError)
import UnliftIO (MonadUnliftIO)
import Arbiter.Core.Codec (Col (..), NullCol (..), ParamType (..), Params, RowCodec, SomeParam (..), runCodec)
import Arbiter.Core.Job.Schema (SchemaName)
import Arbiter.Core.Job.Types (JobRead)
import Arbiter.Core.Job.Types.Internal (Stored (..), storedBytes)
import Arbiter.Core.Listen (Listener)
import Arbiter.Core.QueueRegistry (JobPayloadRegistry, ResultFor)
import Arbiter.Core.Sql.Query (Piece (..), Query (..), mkQuery)
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)
countOr0 :: (MonadArbiter m) => Query Int64 -> m Int64
countOr0 :: forall (m :: * -> *). MonadArbiter m => Query Int64 -> m Int64
countOr0 = ([Int64] -> Int64) -> m [Int64] -> m Int64
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Int64] -> Int64
singleCount (m [Int64] -> m Int64)
-> (Query Int64 -> m [Int64]) -> Query Int64 -> m Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Query Int64 -> m [Int64]
forall a. Query a -> m [a]
forall (m :: * -> *) a. MonadArbiter m => Query a -> m [a]
executeQuery
countOr0Prepared :: (MonadArbiter m) => Query Int64 -> m Int64
countOr0Prepared :: forall (m :: * -> *). MonadArbiter m => Query Int64 -> m Int64
countOr0Prepared = ([Int64] -> Int64) -> m [Int64] -> m Int64
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Int64] -> Int64
singleCount (m [Int64] -> m Int64)
-> (Query Int64 -> m [Int64]) -> Query Int64 -> m Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Query Int64 -> m [Int64]
forall a. Query a -> m [a]
forall (m :: * -> *) a. MonadArbiter m => Query a -> m [a]
executeQueryPrepared
queryMaybe :: (MonadArbiter m) => Query a -> m (Maybe a)
queryMaybe :: forall (m :: * -> *) a. MonadArbiter m => Query a -> m (Maybe a)
queryMaybe = ([a] -> Maybe a) -> m [a] -> m (Maybe a)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Maybe a
forall a. [a] -> Maybe a
listToMaybe (m [a] -> m (Maybe a))
-> (Query a -> m [a]) -> Query a -> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Query a -> m [a]
forall a. Query a -> m [a]
forall (m :: * -> *) a. MonadArbiter m => Query a -> m [a]
executeQuery
queryAny :: (MonadArbiter m) => Query Bool -> m Bool
queryAny :: forall (m :: * -> *). MonadArbiter m => Query Bool -> m Bool
queryAny = ([Bool] -> Bool) -> m [Bool] -> m Bool
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or (m [Bool] -> m Bool)
-> (Query Bool -> m [Bool]) -> Query Bool -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Query Bool -> m [Bool]
forall a. Query a -> m [a]
forall (m :: * -> *) a. MonadArbiter m => Query a -> m [a]
executeQuery
singleCount :: [Int64] -> Int64
singleCount :: [Int64] -> Int64
singleCount [Int64
count] = Int64
count
singleCount [Int64]
_ = Int64
0