on dev help sign in
PQ instances
commit9606759441f91f8fcdc0230dc7c0a59c8a3b140b authorEitan Chatav <eitan.chatav@gmail.com> dateSun 19 Mar 2017, 11:18 (10 years ago) parentec4c436
3 files changed+42−2
squeel-postgresql/squeel-postgresql.cabal+1 squeel-postgresql/src/Squeel/PostgreSQL/PQ.hs+39 squeel-postgresql/src/Squeel/PostgreSQL/Value.hs+2−2
squeel-postgresql/squeel-postgresql.cabal+1
@@ -25,6 +25,7 @@ library
2525 build-depends: base
2626 , aeson
2727 , bytestring
28+ , indexed
2829 , postgresql-binary
2930 , postgresql-libpq
3031 , scientific
squeel-postgresql/src/Squeel/PostgreSQL/PQ.hs+39
@@ -1,6 +1,8 @@
11{-# LANGUAGE
22 DataKinds
3+ , DeriveFunctor
34 , FlexibleContexts
5+ , FlexibleInstances
46 , PolyKinds
57 , RecordWildCards
68 , ScopedTypeVariables
@@ -11,6 +13,9 @@
1113
1214module Squeel.PostgreSQL.PQ where
1315
16+import Control.Arrow
17+import Control.Monad.Indexed
18+import Control.Monad.Indexed.Trans
1419import Control.Monad.IO.Class
1520import Data.ByteString (ByteString)
1621import Data.Proxy
@@ -28,6 +33,40 @@ newtype Connection db = Connection { unConnection :: LibPQ.Connection }
2833
2934newtype PQ m db0 db1 x = PQ
3035 { runPQ :: Connection db0 -> m (x, Connection db1) }
36+ deriving Functor
37+
38+instance Functor m => IxFunctor (PQ m) where
39+ imap f (PQ g) = PQ $ fmap (first f) . g
40+
41+instance Applicative m => IxPointed (PQ m) where
42+ ireturn x = PQ $ \ conn -> pure (x, conn)
43+
44+instance Monad m => IxApplicative (PQ m) where
45+ iap (PQ f) (PQ x) = PQ $ \ conn -> do
46+ (f', conn') <- f conn
47+ (x', conn'') <- x conn'
48+ return (f' x', conn'')
49+
50+instance Monad m => Applicative (PQ m db db) where
51+ pure = ireturn
52+ (<*>) = iap
53+
54+instance Monad m => IxMonad (PQ m) where
55+ ibind f (PQ x) = PQ $ \ conn -> do
56+ (x', conn') <- x conn
57+ runPQ (f x') conn'
58+
59+instance Monad m => Monad (PQ m db db) where
60+ return = ireturn
61+ (>>=) = flip ibind
62+
63+instance IxMonadTrans PQ where
64+ ilift m = PQ $ \ conn -> do
65+ x <- m
66+ return (x, conn)
67+
68+instance MonadIO io => MonadIO (PQ io db db) where
69+ liftIO = ilift . liftIO
3170
3271connectdb :: MonadIO io => ByteString -> io (Connection db)
3372connectdb = fmap Connection . liftIO . LibPQ.connectdb
squeel-postgresql/src/Squeel/PostgreSQL/Value.hs+2−2
@@ -17,7 +17,6 @@ import Control.Arrow (left)
1717import Data.Aeson (FromJSON, ToJSON, eitherDecodeStrict, encode)
1818import Data.Bits (Bits)
1919import Data.ByteString (ByteString)
20−import Data.ByteString.Builder
2120import qualified Data.ByteString.Lazy as Lazy (ByteString, toStrict)
2221import Data.Int (Int16,Int32,Int64)
2322import Data.Proxy
@@ -25,6 +24,7 @@ import Data.Vinyl
2524import Data.Vinyl.Functor
2625import PostgreSQL.Binary.Decoder (Decoder)
2726import qualified PostgreSQL.Binary.Decoder as Decoder
27+import PostgreSQL.Binary.Encoder (Encoder)
2828import qualified PostgreSQL.Binary.Encoder as Encoder
2929import Data.Proxy (Proxy)
3030import Data.Scientific (Scientific)
@@ -82,7 +82,7 @@ instance FromValue ('PGType "interval") DiffTime where
8282 fromValue _ = Decoder.interval_int
8383
8484class ToValue x (pg :: PGType) where
85− toValue :: Proxy pg -> x -> Builder
85+ toValue :: Proxy pg -> Encoder x
8686instance ToValue Int16 ('PGType "int2") where
8787 toValue _ = Encoder.int2_int16
8888instance ToValue Int32 ('PGType "int4") where