git.iko.soy/typeable/postgresql-simple
on master help sign in
Merge pull request #134 from tomjaguarpaw/master

Capture the functionality for parsing arrays as a first-class function

commit5c9da9f5d0704d481e7a8d0a4cc9984af9be65dd authorLeon P Smith <leon.p.smith+github@gmail.com> dateSat 27 Dec 2014, 13:43 (12 years ago) parente0dc1e4f0586eb
1 file changed+9−6
src/Database/PostgreSQL/Simple/FromField.hs+9−6
src/Database/PostgreSQL/Simple/FromField.hs+9−6
@@ -105,6 +105,7 @@ module Database.PostgreSQL.Simple.FromField
105105 , typeOid
106106 , PQ.Oid(..)
107107 , PQ.Format(..)
108+ , pgArrayFieldParser
108109
109110 , fromJSONField
110111 ) where
@@ -490,27 +491,29 @@ instance (FromField a, FromField b) => FromField (Either a b) where
490491
491492-- | any postgresql array whose elements are compatible with type @a@
492493instance (FromField a, Typeable a) => FromField (PGArray a) where
493− fromField f mdat = do
494+ fromField = pgArrayFieldParser fromField
495+
496+pgArrayFieldParser :: Typeable a => FieldParser a -> FieldParser (PGArray a)
497+pgArrayFieldParser fieldParser f mdat = do
494498 info <- typeInfo f
495499 case info of
496500 TI.Array{} ->
497501 case mdat of
498502 Nothing -> returnError UnexpectedNull f ""
499503 Just dat -> do
500− case parseOnly (fromArray info f) dat of
504+ case parseOnly (fromArray fieldParser info f) dat of
501505 Left err -> returnError ConversionFailed f err
502506 Right conv -> PGArray <$> conv
503507 _ -> returnError Incompatible f ""
504508
505−fromArray :: (FromField a)
506− => TypeInfo -> Field -> Parser (Conversion [a])
507−fromArray typeInfo f = sequence . (parseIt <$>) <$> array delim
509+fromArray :: FieldParser a -> TypeInfo -> Field -> Parser (Conversion [a])
510+fromArray fieldParser typeInfo f = sequence . (parseIt <$>) <$> array delim
508511 where
509512 delim = typdelim (typelem typeInfo)
510513 fElem = f{ typeOid = typoid (typelem typeInfo) }
511514
512515 parseIt item =
513− fromField f' $ if item' == "NULL" then Nothing else Just item'
516+ fieldParser f' $ if item' == "NULL" then Nothing else Just item'
514517 where
515518 item' = fmt delim item
516519 f' | Arrays.Array _ <- item = f