@@ -54,6 +54,8 @@ import qualified Data.ByteString.Char8 as B
54import Data.Int (Int16, Int32, Int64)
54import Data.Int (Int16, Int32, Int64)
55import Data.List (foldl')
55import Data.List (foldl')
56import Data.Ratio (Ratio)
56import Data.Ratio (Ratio)
57+import Data.Sequence (Seq)
58+import qualified Data.Sequence as S
57import Data.Time ( UTCTime, ZonedTime, LocalTime, Day, TimeOfDay )
59import Data.Time ( UTCTime, ZonedTime, LocalTime, Day, TimeOfDay )
58import Data.Typeable (Typeable, typeOf)
60import Data.Typeable (Typeable, typeOf)
59import Data.Word (Word64)
61import Data.Word (Word64)
@@ -62,6 +64,7 @@ import Database.PostgreSQL.Simple.BuiltinTypes
62import Database.PostgreSQL.Simple.Ok
64import Database.PostgreSQL.Simple.Ok
63import Database.PostgreSQL.Simple.Types (Binary(..), Null(..))
65import Database.PostgreSQL.Simple.Types (Binary(..), Null(..))
64import Database.PostgreSQL.Simple.Time
66import Database.PostgreSQL.Simple.Time
67+import Database.PostgreSQL.Simple.Arrays
65import qualified Database.PostgreSQL.LibPQ as PQ
68import qualified Database.PostgreSQL.LibPQ as PQ
66import System.IO.Unsafe (unsafePerformIO)
69import System.IO.Unsafe (unsafePerformIO)
67import qualified Data.ByteString as SB
70import qualified Data.ByteString as SB
@@ -241,6 +244,15 @@ instance (FromField a, FromField b) => FromField (Either a b) where
241 fromField f dat = (Right <$> fromField f dat)
244 fromField f dat = (Right <$> fromField f dat)
242 <|> (Left <$> fromField f dat)
245 <|> (Left <$> fromField f dat)
247+instance (FromField a, Typeable a) => FromField (Seq a) where
248+ fromField f dat = either (returnError ConversionFailed f)
250+ (parseOnly (fromArray ',' f) (maybe "" id dat))
252+fromArray :: (FromField a) => Char -> Field -> Parser (Ok [a])
253+fromArray delim f = sequence . (fromField f . Just
254+ . fmt delim <$>) <$> array delim
244newtype Compat = Compat Word64
256newtype Compat = Compat Word64
246mkCompats :: [BuiltinType] -> Compat
258mkCompats :: [BuiltinType] -> Compat