module Database.Relational.Query.Monad.Trans.Qualify (
Qualify, qualify,
evalQualifyPrime, qualifyQuery
) where
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.State (StateT, runStateT, get, modify)
import Control.Applicative (Applicative)
import Control.Monad (liftM)
import Database.Relational.Query.Sub (Qualified)
import qualified Database.Relational.Query.Sub as SubQuery
type AliasId = Int
newtype Qualify m a =
Qualify (StateT AliasId m a)
deriving (Monad, Functor, Applicative)
evalQualifyPrime :: Monad m => Qualify m a -> m a
evalQualifyPrime (Qualify s) = fst `liftM` runStateT s 0
newAlias :: Monad m => Qualify m AliasId
newAlias = Qualify $ do
ai <- get
modify (+ 1)
return ai
qualify :: Monad m => m a -> Qualify m a
qualify = Qualify . lift
qualifyQuery :: Monad m
=> query
-> Qualify m (Qualified query)
qualifyQuery query =
do n <- newAlias
return . SubQuery.qualify query $ SubQuery.Qualifier n