@@ -24,6 +24,7 @@ import Control.Monad.Except
2424import Control.Monad.Trans.Maybe
2525import Control.Monad.Trans.Control
2626import Data.ByteString (ByteString)
27+import Data.Function ((&))
2728import Data.Maybe
2829import Data.Proxy (Proxy)
2930import Data.Text (Text)
@@ -53,7 +54,7 @@ evalPQ (PQ pq) = fmap fst . pq
5354execPQ :: Functor m => PQ db0 db1 m x -> Connection db0 -> m (Connection db1)
5455execPQ (PQ pq) = fmap snd . pq
5556
56−class MonadPQ pq where
57+class AtkeyPQ pq where
5758
5859 pqAp
5960 :: Monad m
@@ -67,43 +68,46 @@ class MonadPQ pq where
6768 -> pq db0 db1 m x
6869 -> pq db0 db2 m y
6970
71+ pqThen
72+ :: Monad m
73+ => pq db1 db2 m y
74+ -> pq db0 db1 m x
75+ -> pq db0 db2 m y
76+ pqThen pq2 pq1 = pq1 & pqBind (\ _ -> pq2)
77+
78+class AtkeyPQ pq => MonadPQ pq where
79+
7080 pqExec
7181 :: MonadBase IO io
7282 => Statement '[] '[] db0 db1
7383 -> pq db0 db1 io (Maybe (Result '[]))
7484
75− pqExecParams
76− :: (MonadBase IO io, ToOids ps, AllZip HasEncoding ps xs)
77− => Statement ps ys db0 db1
78− -> NP I xs
79− -> pq db0 db1 io (Maybe (Result ys))
80−
8185 pqPrepare
8286 :: (MonadBase IO io, ToOids ps)
8387 => ByteString
8488 -> Statement ps xs db0 db1
8589 -> pq db0 db1 io (Maybe (Result '[]), PreparedStatement ps xs db0 db1)
8690
87− pqExecPrepared
88− :: (MonadBase IO io, AllZip HasEncoding ps xs)
89− => PreparedStatement ps ys db0 db1
91+class MonadQuery db m | m -> db where
92+
93+ pqExecParams
94+ :: (ToOids ps, AllZip HasEncoding ps xs)
95+ => Statement ps ys db db
9096 -> NP I xs
91− -> pq db0 db1 io (Maybe (Result ys))
97+ -> m (Maybe (Result ys))
9298
93−(&>>)
94− :: (MonadPQ pq, MonadBase IO io)
95− => pq db0 db1 io (Maybe (Result '[]))
96− -> Statement '[] '[] db1 db2
97− -> pq db0 db2 io (Maybe (Result '[]))
98−pq1 &>> statement2 = pqBind (\ _ -> pqExec statement2) pq1
99+ pqExecNil
100+ :: Statement '[] ys db db
101+ -> m (Maybe (Result ys))
102+ pqExecNil statement = pqExecParams statement Nil
99103
100−pqExecNil
101− :: (MonadPQ pq, MonadBase IO io)
102− => Statement '[] ys db0 db1
103− -> pq db0 db1 io (Maybe (Result ys))
104−pqExecNil statement = pqExecParams statement Nil
104+ pqExecPrepared
105+ :: AllZip HasEncoding ps xs
106+ => PreparedStatement ps ys db db
107+ -> NP I xs
108+ -> m (Maybe (Result ys))
105109
106−instance MonadPQ PQ where
110+instance AtkeyPQ PQ where
107111
108112 pqAp (PQ f) (PQ x) = PQ $ \ conn -> do
109113 (f', conn') <- f conn
@@ -114,10 +118,23 @@ instance MonadPQ PQ where
114118 (x', conn') <- x conn
115119 runPQ (f x') conn'
116120
121+instance MonadPQ PQ where
122+
117123 pqExec (UnsafeStatement q) = PQ $ \ (Connection conn) -> do
118124 result <- liftBase $ LibPQ.exec conn q
119125 return (Result <$> result, Connection conn)
120126
127+ pqPrepare statementName (UnsafeStatement q :: Statement ps ys db0 db1) =
128+ PQ $ \ (Connection conn) -> do
129+ result <- liftBase $
130+ LibPQ.prepare conn statementName q (Just (toOids (proxy# :: Proxy# ps)))
131+ return
132+ ( ( Result <$> result
133+ , UnsafePreparedStatement statementName
134+ ) , Connection conn )
135+
136+instance MonadBase IO io => MonadQuery db (PQ db db io) where
137+
121138 pqExecParams (UnsafeStatement q :: Statement ps ys db0 db1) params =
122139 PQ $ \ (Connection conn) -> do
123140 let
@@ -130,15 +147,6 @@ instance MonadPQ PQ where
130147 result <- liftBase $ LibPQ.execParams conn q params' LibPQ.Binary
131148 return (Result <$> result, Connection conn)
132149
133− pqPrepare statementName (UnsafeStatement q :: Statement ps ys db0 db1) =
134− PQ $ \ (Connection conn) -> do
135− result <- liftBase $
136− LibPQ.prepare conn statementName q (Just (toOids (proxy# :: Proxy# ps)))
137− return
138− ( ( Result <$> result
139− , UnsafePreparedStatement statementName
140− ) , Connection conn )
141−
142150 pqExecPrepared (q :: PreparedStatement ps ys db0 db1) params =
143151 PQ $ \ (Connection conn) -> do
144152 let