git.iko.soy/typeable/postgresql-simple
on master help sign in
Capture the functionality for parsing arrays as a first-class function
f0586ebTom Ellis
src/Database/PostgreSQL/Simple/FromField.hs+9−6
@@ -105,6 +105,7 @@ module Database.PostgreSQL.Simple.FromField
105 , typeOid
105 , typeOid
106 , PQ.Oid(..)
106 , PQ.Oid(..)
107 , PQ.Format(..)
107 , PQ.Format(..)
108+ , pgArrayFieldParser
108
109
109 , fromJSONField
110 , fromJSONField
110 ) where
111 ) where
@@ -490,27 +491,29 @@ instance (FromField a, FromField b) => FromField (Either a b) where
490
491
491-- | any postgresql array whose elements are compatible with type @a@
492-- | any postgresql array whose elements are compatible with type @a@
492instance (FromField a, Typeable a) => FromField (PGArray a) where
493instance (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
494 info <- typeInfo f
498 info <- typeInfo f
495 case info of
499 case info of
496 TI.Array{} ->
500 TI.Array{} ->
497 case mdat of
501 case mdat of
498 Nothing -> returnError UnexpectedNull f ""
502 Nothing -> returnError UnexpectedNull f ""
499 Just dat -> do
503 Just dat -> do
500− case parseOnly (fromArray info f) dat of
504+ case parseOnly (fromArray fieldParser info f) dat of
501 Left err -> returnError ConversionFailed f err
505 Left err -> returnError ConversionFailed f err
502 Right conv -> PGArray <$> conv
506 Right conv -> PGArray <$> conv
503 _ -> returnError Incompatible f ""
507 _ -> returnError Incompatible f ""
504
508
505−fromArray :: (FromField a)
506− => TypeInfo -> Field -> Parser (Conversion [a])
509+fromArray :: FieldParser a -> TypeInfo -> Field -> Parser (Conversion [a])
507−fromArray typeInfo f = sequence . (parseIt <$>) <$> array delim
510+fromArray fieldParser typeInfo f = sequence . (parseIt <$>) <$> array delim
508 where
511 where
509 delim = typdelim (typelem typeInfo)
512 delim = typdelim (typelem typeInfo)
510 fElem = f{ typeOid = typoid (typelem typeInfo) }
513 fElem = f{ typeOid = typoid (typelem typeInfo) }
511
514
512 parseIt item =
515 parseIt item =
513− fromField f' $ if item' == "NULL" then Nothing else Just item'
516+ fieldParser f' $ if item' == "NULL" then Nothing else Just item'
514 where
517 where
515 item' = fmt delim item
518 item' = fmt delim item
516 f' | Arrays.Array _ <- item = f
519 f' | Arrays.Array _ <- item = f