@@ -1,7 +1,9 @@
1{-# LANGUAGE
1{-# LANGUAGE
3 , FlexibleInstances
4 , FlexibleInstances
5 , MagicHash
7 , MagicHash
6 , MultiParamTypeClasses
8 , MultiParamTypeClasses
7 , PolyKinds
9 , PolyKinds
@@ -16,8 +18,8 @@ import Data.Aeson (FromJSON, ToJSON, eitherDecodeStrict, encode)
16import Data.ByteString (ByteString)
18import Data.ByteString (ByteString)
17import Data.Int (Int16,Int32,Int64)
19import Data.Int (Int16,Int32,Int64)
18import Generics.SOP
20import Generics.SOP
19import PostgreSQL.Binary.Decoding (Value)
22import PostgreSQL.Binary.Decoding (Value)
20−import PostgreSQL.Binary.Encoding (Encoding)
21import Data.Scientific (Scientific)
23import Data.Scientific (Scientific)
22import Data.Text (Text)
24import Data.Text (Text)
23import Data.Time (Day, TimeOfDay, TimeZone, LocalTime, UTCTime, DiffTime)
25import Data.Time (Day, TimeOfDay, TimeZone, LocalTime, UTCTime, DiffTime)
@@ -92,7 +94,7 @@ instance (FromValue pg x, FromValues pgs xs)
92 :* decodeValues (proxy# :: Proxy# pgs) results
94 :* decodeValues (proxy# :: Proxy# pgs) results
94class ToValue x pg where
96class ToValue x pg where
95− toValue :: Proxy# pg -> x -> Encoding
97+ toValue :: Proxy# pg -> x -> Encoder.Encoding
96instance ToValue Int16 'PGInt2 where
98instance ToValue Int16 'PGInt2 where
97 toValue _ = Encoder.int2_int16
99 toValue _ = Encoder.int2_int16
98instance ToValue Int32 'PGInt4 where
100instance ToValue Int32 'PGInt4 where
@@ -144,3 +146,28 @@ instance (ToValue x pg, ToValues xs pgs)
144 toValues _ (I x :* xs)
146 toValues _ (I x :* xs)
145 = Encoder.encodingBytes ((toValue (proxy# :: Proxy# pg)) x)
147 = Encoder.encodingBytes ((toValue (proxy# :: Proxy# pg)) x)
146 : toValues (proxy# :: Proxy# pgs) xs
148 : toValues (proxy# :: Proxy# pgs) xs
150+newtype Encoding x = Encoding { unEncoding :: x -> Encoder.Encoding }
151+class ToEncoding pg x where toEncoding :: Proxy pg -> Encoding x
154+ :: AllZip ToEncoding pgs xs
159+ proxy :* proxies -> toEncoding proxy :* toEncodings proxies
161+encodeParameters' :: NP (Encoding :*: I) xs -> NP (K ByteString) xs
162+encodeParameters' = \case
164+ (Encoding enc :*: I x) :* parameters ->
165+ K (Encoder.encodingBytes (enc x)) :* encodeParameters' parameters
168+ :: AllZip ToEncoding pgs xs
171+ -> NP (K ByteString) xs
172+encodeParameters proxies parameters = encodeParameters' $
173+ hzipWith (:*:) (toEncodings proxies) parameters