git.iko.soy/typeable/postgresql-simple
on master help sign in
Took most "instance FromRow a" and created an "instance FromRow (Maybe a)"
c756ec5Leon P Smith
src/Database/PostgreSQL/Simple/FromRow.hs+75−4
@@ -1,4 +1,4 @@
1−{-# LANGUAGE RecordWildCards #-}
1+{-# LANGUAGE RecordWildCards, FlexibleInstances #-}
2
2
3------------------------------------------------------------------------------
3------------------------------------------------------------------------------
4-- |
4-- |
@@ -23,8 +23,9 @@ module Database.PostgreSQL.Simple.FromRow
23 , numFieldsRemaining
23 , numFieldsRemaining
24 ) where
24 ) where
25
25
26+import Prelude hiding (null)
26−import Control.Applicative (Applicative(..), (<$>))
27+import Control.Applicative (Applicative(..), (<$>), (<|>), (*>))
27−import Control.Monad (replicateM)
28+import Control.Monad (replicateM, replicateM_)
28import Data.ByteString (ByteString)
29import Data.ByteString (ByteString)
29import qualified Data.ByteString.Char8 as B
30import qualified Data.ByteString.Char8 as B
30import Data.Vector (Vector)
31import Data.Vector (Vector)
@@ -35,7 +36,7 @@ import Database.PostgreSQL.Simple.Internal
35import Database.PostgreSQL.Simple.Compat
36import Database.PostgreSQL.Simple.Compat
36import Database.PostgreSQL.Simple.FromField
37import Database.PostgreSQL.Simple.FromField
37import Database.PostgreSQL.Simple.Ok
38import Database.PostgreSQL.Simple.Ok
38−import Database.PostgreSQL.Simple.Types ((:.)(..))
39+import Database.PostgreSQL.Simple.Types ((:.)(..), Null)
39import Database.PostgreSQL.Simple.TypeInfo
40import Database.PostgreSQL.Simple.TypeInfo
40
41
41import Control.Monad.Trans.State.Strict
42import Control.Monad.Trans.State.Strict
@@ -120,62 +121,132 @@ numFieldsRemaining = RP $ do
120 column <- lift get
121 column <- lift get
121 return $! (\(PQ.Col x) -> fromIntegral x) (nfields rowresult - column)
122 return $! (\(PQ.Col x) -> fromIntegral x) (nfields rowresult - column)
122
123
124+null :: RowParser Null
125+null = field
126+
123instance (FromField a) => FromRow (Only a) where
127instance (FromField a) => FromRow (Only a) where
124 fromRow = Only <$> field
128 fromRow = Only <$> field
125
129
130+instance (FromField a) => FromRow (Maybe (Only a)) where
131+ fromRow = (null *> pure Nothing)
132+ <|> (Just <$> fromRow)
133+
126instance (FromField a, FromField b) => FromRow (a,b) where
134instance (FromField a, FromField b) => FromRow (a,b) where
127 fromRow = (,) <$> field <*> field
135 fromRow = (,) <$> field <*> field
128
136
137+instance (FromField a, FromField b) => FromRow (Maybe (a,b)) where
138+ fromRow = (null *> null *> pure Nothing)
139+ <|> (Just <$> fromRow)
140+
129instance (FromField a, FromField b, FromField c) => FromRow (a,b,c) where
141instance (FromField a, FromField b, FromField c) => FromRow (a,b,c) where
130 fromRow = (,,) <$> field <*> field <*> field
142 fromRow = (,,) <$> field <*> field <*> field
131
143
144+instance (FromField a, FromField b, FromField c) => FromRow (Maybe (a,b,c)) where
145+ fromRow = (null *> null *> null *> pure Nothing)
146+ <|> (Just <$> fromRow)
147+
132instance (FromField a, FromField b, FromField c, FromField d) =>
148instance (FromField a, FromField b, FromField c, FromField d) =>
133 FromRow (a,b,c,d) where
149 FromRow (a,b,c,d) where
134 fromRow = (,,,) <$> field <*> field <*> field <*> field
150 fromRow = (,,,) <$> field <*> field <*> field <*> field
135
151
152+instance (FromField a, FromField b, FromField c, FromField d) =>
153+ FromRow (Maybe (a,b,c,d)) where
154+ fromRow = (null *> null *> null *> null *> pure Nothing)
155+ <|> (Just <$> fromRow)
156+
136instance (FromField a, FromField b, FromField c, FromField d, FromField e) =>
157instance (FromField a, FromField b, FromField c, FromField d, FromField e) =>
137 FromRow (a,b,c,d,e) where
158 FromRow (a,b,c,d,e) where
138 fromRow = (,,,,) <$> field <*> field <*> field <*> field <*> field
159 fromRow = (,,,,) <$> field <*> field <*> field <*> field <*> field
139
160
161+instance (FromField a, FromField b, FromField c, FromField d, FromField e) =>
162+ FromRow (Maybe (a,b,c,d,e)) where
163+ fromRow = (null *> null *> null *> null *> null *> pure Nothing)
164+ <|> (Just <$> fromRow)
165+
140instance (FromField a, FromField b, FromField c, FromField d, FromField e,
166instance (FromField a, FromField b, FromField c, FromField d, FromField e,
141 FromField f) =>
167 FromField f) =>
142 FromRow (a,b,c,d,e,f) where
168 FromRow (a,b,c,d,e,f) where
143 fromRow = (,,,,,) <$> field <*> field <*> field <*> field <*> field
169 fromRow = (,,,,,) <$> field <*> field <*> field <*> field <*> field
144 <*> field
170 <*> field
145
171
172+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
173+ FromField f) =>
174+ FromRow (Maybe (a,b,c,d,e,f)) where
175+ fromRow = (null *> null *> null *> null *> null *>
176+ null *> pure Nothing)
177+ <|> (Just <$> fromRow)
178+
146instance (FromField a, FromField b, FromField c, FromField d, FromField e,
179instance (FromField a, FromField b, FromField c, FromField d, FromField e,
147 FromField f, FromField g) =>
180 FromField f, FromField g) =>
148 FromRow (a,b,c,d,e,f,g) where
181 FromRow (a,b,c,d,e,f,g) where
149 fromRow = (,,,,,,) <$> field <*> field <*> field <*> field <*> field
182 fromRow = (,,,,,,) <$> field <*> field <*> field <*> field <*> field
150 <*> field <*> field
183 <*> field <*> field
151
184
185+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
186+ FromField f, FromField g) =>
187+ FromRow (Maybe (a,b,c,d,e,f,g)) where
188+ fromRow = (null *> null *> null *> null *> null *>
189+ null *> null *> pure Nothing)
190+ <|> (Just <$> fromRow)
191+
152instance (FromField a, FromField b, FromField c, FromField d, FromField e,
192instance (FromField a, FromField b, FromField c, FromField d, FromField e,
153 FromField f, FromField g, FromField h) =>
193 FromField f, FromField g, FromField h) =>
154 FromRow (a,b,c,d,e,f,g,h) where
194 FromRow (a,b,c,d,e,f,g,h) where
155 fromRow = (,,,,,,,) <$> field <*> field <*> field <*> field <*> field
195 fromRow = (,,,,,,,) <$> field <*> field <*> field <*> field <*> field
156 <*> field <*> field <*> field
196 <*> field <*> field <*> field
157
197
198+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
199+ FromField f, FromField g, FromField h) =>
200+ FromRow (Maybe (a,b,c,d,e,f,g,h)) where
201+ fromRow = (null *> null *> null *> null *> null *>
202+ null *> null *> null *> pure Nothing)
203+ <|> (Just <$> fromRow)
204+
158instance (FromField a, FromField b, FromField c, FromField d, FromField e,
205instance (FromField a, FromField b, FromField c, FromField d, FromField e,
159 FromField f, FromField g, FromField h, FromField i) =>
206 FromField f, FromField g, FromField h, FromField i) =>
160 FromRow (a,b,c,d,e,f,g,h,i) where
207 FromRow (a,b,c,d,e,f,g,h,i) where
161 fromRow = (,,,,,,,,) <$> field <*> field <*> field <*> field <*> field
208 fromRow = (,,,,,,,,) <$> field <*> field <*> field <*> field <*> field
162 <*> field <*> field <*> field <*> field
209 <*> field <*> field <*> field <*> field
163
210
211+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
212+ FromField f, FromField g, FromField h, FromField i) =>
213+ FromRow (Maybe (a,b,c,d,e,f,g,h,i)) where
214+ fromRow = (null *> null *> null *> null *> null *>
215+ null *> null *> null *> null *> pure Nothing)
216+ <|> (Just <$> fromRow)
217+
164instance (FromField a, FromField b, FromField c, FromField d, FromField e,
218instance (FromField a, FromField b, FromField c, FromField d, FromField e,
165 FromField f, FromField g, FromField h, FromField i, FromField j) =>
219 FromField f, FromField g, FromField h, FromField i, FromField j) =>
166 FromRow (a,b,c,d,e,f,g,h,i,j) where
220 FromRow (a,b,c,d,e,f,g,h,i,j) where
167 fromRow = (,,,,,,,,,) <$> field <*> field <*> field <*> field <*> field
221 fromRow = (,,,,,,,,,) <$> field <*> field <*> field <*> field <*> field
168 <*> field <*> field <*> field <*> field <*> field
222 <*> field <*> field <*> field <*> field <*> field
169
223
224+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
225+ FromField f, FromField g, FromField h, FromField i, FromField j) =>
226+ FromRow (Maybe (a,b,c,d,e,f,g,h,i,j)) where
227+ fromRow = (null *> null *> null *> null *> null *>
228+ null *> null *> null *> null *> null *> pure Nothing)
229+ <|> (Just <$> fromRow)
230+
170instance FromField a => FromRow [a] where
231instance FromField a => FromRow [a] where
171 fromRow = do
232 fromRow = do
172 n <- numFieldsRemaining
233 n <- numFieldsRemaining
173 replicateM n field
234 replicateM n field
174
235
236+instance FromField a => FromRow (Maybe [a]) where
237+ fromRow = do
238+ n <- numFieldsRemaining
239+ (replicateM_ n null *> pure Nothing) <|> (Just <$> replicateM n field)
240+
175instance FromField a => FromRow (Vector a) where
241instance FromField a => FromRow (Vector a) where
176 fromRow = do
242 fromRow = do
177 n <- numFieldsRemaining
243 n <- numFieldsRemaining
178 V.replicateM n field
244 V.replicateM n field
179
245
246+instance FromField a => FromRow (Maybe (Vector a)) where
247+ fromRow = do
248+ n <- numFieldsRemaining
249+ (replicateM_ n null *> pure Nothing) <|> (Just <$> V.replicateM n field)
250+
180instance (FromRow a, FromRow b) => FromRow (a :. b) where
251instance (FromRow a, FromRow b) => FromRow (a :. b) where
181 fromRow = (:.) <$> fromRow <*> fromRow
252 fromRow = (:.) <$> fromRow <*> fromRow