@@ -1,6 +1,6 @@
1{-# LANGUAGE DeriveDataTypeable, FlexibleInstances, GeneralizedNewtypeDeriving,
1{-# LANGUAGE DeriveDataTypeable, FlexibleInstances, GeneralizedNewtypeDeriving,
2 IncoherentInstances, OverlappingInstances, OverloadedStrings, Rank2Types,
2 IncoherentInstances, OverlappingInstances, OverloadedStrings, Rank2Types,
3− ViewPatterns #-}
3+ ViewPatterns, FlexibleContexts, UndecidableInstances #-}
6-- Module: Data.Aeson.Types
6-- Module: Data.Aeson.Types
@@ -61,6 +61,7 @@ import Data.Time.Format (FormatTime, formatTime, parseTime)
61import Data.Typeable (Typeable)
61import Data.Typeable (Typeable)
62import Data.Vector (Vector)
62import Data.Vector (Vector)
63import Data.Word (Word, Word8, Word16, Word32, Word64)
63import Data.Word (Word, Word8, Word16, Word32, Word64)
64+import Foreign.Storable (Storable)
64import System.Locale (defaultTimeLocale)
65import System.Locale (defaultTimeLocale)
65import qualified Data.ByteString as B
66import qualified Data.ByteString as B
66import qualified Data.ByteString.Lazy as LB
67import qualified Data.ByteString.Lazy as LB
@@ -72,6 +73,11 @@ import qualified Data.Set as Set
72import qualified Data.Text as T
73import qualified Data.Text as T
73import qualified Data.Text.Lazy as LT
74import qualified Data.Text.Lazy as LT
74import qualified Data.Vector as V
75import 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
76-- | The result of running a 'Parser'.
82-- | The result of running a 'Parser'.
77data Result a = Error String
83data Result a = Error String
@@ -574,6 +580,33 @@ instance (FromJSON a) => FromJSON (Vector a) where
574 parseJSON v = typeMismatch "Vector a" v
580 parseJSON v = typeMismatch "Vector a" v
575 {-# INLINE parseJSON #-}
581 {-# INLINE parseJSON #-}
583+vectorToJSON :: (VG.Vector v a, ToJSON a) => v a -> Value
584+vectorToJSON = Array . V.map toJSON . V.convert
585+{-# INLINE vectorToJSON #-}
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 #-}
592+instance (Storable a, ToJSON a) => ToJSON (VS.Vector a) where
593+ toJSON = vectorToJSON
595+instance (Storable a, FromJSON a) => FromJSON (VS.Vector a) where
596+ parseJSON = vectorParseJSON "Data.Vector.Storable.Vector a"
598+instance (VP.Prim a, ToJSON a) => ToJSON (VP.Vector a) where
599+ toJSON = vectorToJSON
601+instance (VP.Prim a, FromJSON a) => FromJSON (VP.Vector a) where
602+ parseJSON = vectorParseJSON "Data.Vector.Primitive.Vector a"
604+instance (VG.Vector VU.Vector a, ToJSON a) => ToJSON (VU.Vector a) where
605+ toJSON = vectorToJSON
607+instance (VG.Vector VU.Vector a, FromJSON a) => FromJSON (VU.Vector a) where
608+ parseJSON = vectorParseJSON "Data.Vector.Unboxed.Vector a"
577instance (ToJSON a) => ToJSON (Set.Set a) where
610instance (ToJSON a) => ToJSON (Set.Set a) where
578 toJSON = toJSON . Set.toList
611 toJSON = toJSON . Set.toList
579 {-# INLINE toJSON #-}
612 {-# INLINE toJSON #-}