@@ -1,6 +1,6 @@
11{-# LANGUAGE DeriveDataTypeable, FlexibleInstances, GeneralizedNewtypeDeriving,
22 IncoherentInstances, OverlappingInstances, OverloadedStrings, Rank2Types,
3− ViewPatterns #-}
3+ ViewPatterns, FlexibleContexts, UndecidableInstances #-}
44
55-- |
66-- Module: Data.Aeson.Types
@@ -61,6 +61,7 @@ import Data.Time.Format (FormatTime, formatTime, parseTime)
6161import Data.Typeable (Typeable)
6262import Data.Vector (Vector)
6363import Data.Word (Word, Word8, Word16, Word32, Word64)
64+import Foreign.Storable (Storable)
6465import System.Locale (defaultTimeLocale)
6566import qualified Data.ByteString as B
6667import qualified Data.ByteString.Lazy as LB
@@ -72,6 +73,11 @@ import qualified Data.Set as Set
7273import qualified Data.Text as T
7374import qualified Data.Text.Lazy as LT
7475import qualified Data.Vector as V
76+import qualified Data.Vector.Storable as VS
77+import qualified Data.Vector.Primitive as VP
78+import qualified Data.Vector.Unboxed as VU
79+import qualified Data.Vector.Generic as VG
80+
7581
7682-- | The result of running a 'Parser'.
7783data Result a = Error String
@@ -574,6 +580,33 @@ instance (FromJSON a) => FromJSON (Vector a) where
574580 parseJSON v = typeMismatch "Vector a" v
575581 {-# INLINE parseJSON #-}
576582
583+vectorToJSON :: (VG.Vector v a, ToJSON a) => v a -> Value
584+vectorToJSON = Array . V.map toJSON . V.convert
585+{-# INLINE vectorToJSON #-}
586+
587+vectorParseJSON :: (FromJSON a, VG.Vector w a) => String -> Value -> Parser (w a)
588+vectorParseJSON _ (Array a) = V.convert <$> V.mapM parseJSON a
589+vectorParseJSON s v = typeMismatch s v
590+{-# INLINE vectorParseJSON #-}
591+
592+instance (Storable a, ToJSON a) => ToJSON (VS.Vector a) where
593+ toJSON = vectorToJSON
594+
595+instance (Storable a, FromJSON a) => FromJSON (VS.Vector a) where
596+ parseJSON = vectorParseJSON "Data.Vector.Storable.Vector a"
597+
598+instance (VP.Prim a, ToJSON a) => ToJSON (VP.Vector a) where
599+ toJSON = vectorToJSON
600+
601+instance (VP.Prim a, FromJSON a) => FromJSON (VP.Vector a) where
602+ parseJSON = vectorParseJSON "Data.Vector.Primitive.Vector a"
603+
604+instance (VG.Vector VU.Vector a, ToJSON a) => ToJSON (VU.Vector a) where
605+ toJSON = vectorToJSON
606+
607+instance (VG.Vector VU.Vector a, FromJSON a) => FromJSON (VU.Vector a) where
608+ parseJSON = vectorParseJSON "Data.Vector.Unboxed.Vector a"
609+
577610instance (ToJSON a) => ToJSON (Set.Set a) where
578611 toJSON = toJSON . Set.toList
579612 {-# INLINE toJSON #-}