module Database.Relational.Query.Monad.Type (
ConfigureQuery, configureQuery, qualifyQuery, askConfig, QueryCore, extractCore,
OrderedQuery,
) where
import Data.Functor.Identity (Identity, runIdentity)
import Database.Relational.Query.Component (Config, Duplication, QueryRestriction)
import Database.Relational.Query.Sub (Qualified, JoinProduct)
import Database.Relational.Query.Context (Flat)
import Database.Relational.Query.Projection (Projection)
import Database.Relational.Query.Projectable (PlaceHolders)
import qualified Database.Relational.Query.Monad.Trans.Qualify as Qualify
import Database.Relational.Query.Monad.Trans.Qualify (Qualify, qualify, evalQualifyPrime)
import Database.Relational.Query.Monad.Trans.Config (QueryConfig, runQueryConfig, askQueryConfig)
import Database.Relational.Query.Monad.Trans.Join (QueryJoin, extractProduct)
import Database.Relational.Query.Monad.Trans.Restricting (Restrictings, extractRestrict)
import Database.Relational.Query.Monad.Trans.Ordering (Orderings)
type ConfigureQuery = Qualify (QueryConfig Identity)
configureQuery :: ConfigureQuery q -> Config -> q
configureQuery cq c = runIdentity $ runQueryConfig (evalQualifyPrime cq) c
qualifyQuery :: a -> ConfigureQuery (Qualified a)
qualifyQuery = Qualify.qualifyQuery
askConfig :: ConfigureQuery Config
askConfig = qualify askQueryConfig
type QueryCore = Restrictings Flat (QueryJoin ConfigureQuery)
extractCore :: QueryCore a
-> ConfigureQuery (((a, QueryRestriction Flat), JoinProduct), Duplication)
extractCore = extractProduct . extractRestrict
type OrderedQuery c m p r = Orderings c m (PlaceHolders p, Projection c r)