{-# LANGUAGE
DataKinds
, DefaultSignatures
, FlexibleContexts
, FlexibleInstances
, FunctionalDependencies
, GADTs
, PolyKinds
, MultiParamTypeClasses
, QuantifiedConstraints
, RankNTypes
, TypeApplications
, TypeFamilies
, UndecidableInstances
#-}
module Squeal.PostgreSQL.Session.Monad where
import Control.Category (Category (..))
import Control.Monad
import Control.Monad.Morph
import Prelude hiding (id, (.))
import qualified Generics.SOP as SOP
import qualified Generics.SOP.Record as SOP
import Squeal.PostgreSQL.Manipulation
import Squeal.PostgreSQL.Session.Decode
import Squeal.PostgreSQL.Session.Result
import Squeal.PostgreSQL.Session.Statement
import Squeal.PostgreSQL.Query
import Control.Monad.Trans.Cont
import Control.Monad.Trans.Identity
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader
import qualified Control.Monad.Trans.State.Lazy as Lazy
import qualified Control.Monad.Trans.State.Strict as Strict
import qualified Control.Monad.Trans.Writer.Lazy as Lazy
import qualified Control.Monad.Trans.Writer.Strict as Strict
import qualified Control.Monad.Trans.RWS.Lazy as Lazy
import qualified Control.Monad.Trans.RWS.Strict as Strict
class Monad pq => MonadPQ db pq | pq -> db where
executeParams :: Statement db x y -> x -> pq (Result y)
default executeParams
:: (MonadTrans t, MonadPQ db m, pq ~ t m)
=> Statement db x y -> x -> pq (Result y)
executeParams statement params = lift $ executeParams statement params
executeParams_ :: Statement db x () -> x -> pq ()
executeParams_ statement params = void $ executeParams statement params
execute :: Statement db () y -> pq (Result y)
execute statement = executeParams statement ()
execute_ :: Statement db () () -> pq ()
execute_ = void . execute
executePrepared
:: Traversable list
=> Statement db x y -> list x -> pq (list (Result y))
default executePrepared
:: (MonadTrans t, MonadPQ db m, pq ~ t m)
=> Traversable list
=> Statement db x y -> list x -> pq (list (Result y))
executePrepared statement x = lift $ executePrepared statement x
executePrepared_
:: Foldable list
=> Statement db x () -> list x -> pq ()
default executePrepared_
:: (MonadTrans t, MonadPQ db m, pq ~ t m)
=> Foldable list
=> Statement db x () -> list x -> pq ()
executePrepared_ statement x = lift $ executePrepared_ statement x
manipulateParams ::
( MonadPQ db pq
, GenericParams db params x xs
, GenericRow row y ys
) => Manipulation '[] db params row
-> x -> pq (Result y)
manipulateParams = executeParams . manipulation
manipulateParams_ ::
( MonadPQ db pq
, GenericParams db params x xs
) => Manipulation '[] db params '[]
-> x -> pq ()
manipulateParams_ = executeParams_ . manipulation
manipulate
:: (MonadPQ db pq, GenericRow row y ys)
=> Manipulation '[] db '[] row
-> pq (Result y)
manipulate = execute . manipulation
manipulate_
:: MonadPQ db pq
=> Manipulation '[] db '[] '[]
-> pq ()
manipulate_ = execute_ . manipulation
runQueryParams ::
( MonadPQ db pq
, GenericParams db params x xs
, SOP.IsRecord y ys
, SOP.AllZip FromField row ys
) => Query '[] '[] db params row
-> x -> pq (Result y)
runQueryParams = executeParams . query
runQuery
:: (MonadPQ db pq, SOP.IsRecord y ys, SOP.AllZip FromField row ys)
=> Query '[] '[] db '[] row
-> pq (Result y)
runQuery = execute . query
traversePrepared
:: ( MonadPQ db pq
, GenericParams db params x xs
, Traversable list
, SOP.IsRecord y ys
, SOP.AllZip FromField row ys )
=> Manipulation '[] db params row
-> list x -> pq (list (Result y))
traversePrepared = executePrepared . manipulation
forPrepared
:: ( MonadPQ db pq
, GenericParams db params x xs
, Traversable list
, SOP.IsRecord y ys
, SOP.AllZip FromField row ys )
=> list x
-> Manipulation '[] db params row
-> pq (list (Result y))
forPrepared = flip traversePrepared
traversePrepared_
:: ( MonadPQ db pq
, GenericParams db params x xs
, Foldable list )
=> Manipulation '[] db params '[]
-> list x -> pq ()
traversePrepared_ = executePrepared_ . manipulation
forPrepared_
:: ( MonadPQ db pq
, GenericParams db params x xs
, Foldable list )
=> list x
-> Manipulation '[] db params '[]
-> pq ()
forPrepared_ = flip traversePrepared_
instance MonadPQ db m => MonadPQ db (IdentityT m)
instance MonadPQ db m => MonadPQ db (ReaderT r m)
instance MonadPQ db m => MonadPQ db (Strict.StateT s m)
instance MonadPQ db m => MonadPQ db (Lazy.StateT s m)
instance (Monoid w, MonadPQ db m) => MonadPQ db (Strict.WriterT w m)
instance (Monoid w, MonadPQ db m) => MonadPQ db (Lazy.WriterT w m)
instance MonadPQ db m => MonadPQ db (MaybeT m)
instance MonadPQ db m => MonadPQ db (ExceptT e m)
instance (Monoid w, MonadPQ db m) => MonadPQ db (Strict.RWST r w s m)
instance (Monoid w, MonadPQ db m) => MonadPQ db (Lazy.RWST r w s m)
instance MonadPQ db m => MonadPQ db (ContT r m)