on master help sign in
add ToJSON and FromJSON instances for array types from primitive
cf38cd3Andrew Martin
Data/Aeson/Types/FromJSON.hs+30
@@ -139,6 +139,16 @@ import qualified Data.Vector.Primitive as VP
139import qualified Data.Vector.Storable as VS
139import qualified Data.Vector.Storable as VS
140import qualified Data.Vector.Unboxed as VU
140import qualified Data.Vector.Unboxed as VU
141
141
142+import qualified GHC.Exts as Exts
143+import qualified Data.Primitive.Array as PM
144+import qualified Data.Primitive.SmallArray as PM
145+import qualified Data.Primitive.Types as PM
146+
147+#if (MIN_VERSION_primitive(0,6,4))
148+import qualified Data.Primitive.UnliftedArray as PM
149+import qualified Data.Primitive.PrimArray as PM
150+#endif
151+
142#ifndef HAS_COERCIBLE
152#ifndef HAS_COERCIBLE
143#define HAS_COERCIBLE (__GLASGOW_HASKELL__ >= 707)
153#define HAS_COERCIBLE (__GLASGOW_HASKELL__ >= 707)
144#endif
154#endif
@@ -1673,6 +1683,26 @@ instance FromJSON DotNetTime where
1673 _ -> fail "could not parse .NET time"
1683 _ -> fail "could not parse .NET time"
1674 {-# INLINE parseJSON #-}
1684 {-# INLINE parseJSON #-}
1675
1685
1686+-------------------------------------------------------------------------------
1687+-- primitive
1688+-------------------------------------------------------------------------------
1689+
1690+instance FromJSON a => FromJSON (PM.Array a) where
1691+ -- note: we could do better than this if vector exposed the data
1692+ -- constructor in Data.Vector.
1693+ parseJSON = fmap Exts.fromList . parseJSON
1694+
1695+instance FromJSON a => FromJSON (PM.SmallArray a) where
1696+ parseJSON = fmap Exts.fromList . parseJSON
1697+
1698+#if (MIN_VERSION_primitive(0,6,4))
1699+instance (PM.Prim a,FromJSON a) => FromJSON (PM.PrimArray a) where
1700+ parseJSON = fmap Exts.fromList . parseJSON
1701+
1702+instance (PM.PrimUnlifted a,FromJSON a) => FromJSON (PM.UnliftedArray a) where
1703+ parseJSON = fmap Exts.fromList . parseJSON
1704+#endif
1705+
1676-------------------------------------------------------------------------------
1706-------------------------------------------------------------------------------
1677-- time
1707-- time
1678-------------------------------------------------------------------------------
1708-------------------------------------------------------------------------------
Data/Aeson/Types/ToJSON.hs+34
@@ -127,6 +127,16 @@ import qualified Data.Vector.Unboxed as VU
127import qualified Data.Aeson.Encoding.Builder as EB
127import qualified Data.Aeson.Encoding.Builder as EB
128import qualified Data.ByteString.Builder as B
128import qualified Data.ByteString.Builder as B
129
129
130+import qualified GHC.Exts as Exts
131+import qualified Data.Primitive.Array as PM
132+import qualified Data.Primitive.SmallArray as PM
133+import qualified Data.Primitive.Types as PM
134+
135+#if (MIN_VERSION_primitive(0,6,4))
136+import qualified Data.Primitive.UnliftedArray as PM
137+import qualified Data.Primitive.PrimArray as PM
138+#endif
139+
130#if !(MIN_VERSION_bytestring(0,10,0))
140#if !(MIN_VERSION_bytestring(0,10,0))
131import Foreign.ForeignPtr (withForeignPtr)
141import Foreign.ForeignPtr (withForeignPtr)
132import Foreign.Marshal.Utils (copyBytes)
142import Foreign.Marshal.Utils (copyBytes)
@@ -1904,6 +1914,30 @@ dotNetTime (DotNetTime t) = secs ++ formatMillis t ++ ")/"
1904formatMillis :: (FormatTime t) => t -> String
1914formatMillis :: (FormatTime t) => t -> String
1905formatMillis = take 3 . formatTime defaultTimeLocale "%q"
1915formatMillis = take 3 . formatTime defaultTimeLocale "%q"
1906
1916
1917+-------------------------------------------------------------------------------
1918+-- primitive
1919+-------------------------------------------------------------------------------
1920+
1921+instance ToJSON a => ToJSON (PM.Array a) where
1922+ -- note: we could do better than this if vector exposed the data
1923+ -- constructor in Data.Vector.
1924+ toJSON = toJSON . Exts.toList
1925+ toEncoding = toEncoding . Exts.toList
1926+
1927+instance ToJSON a => ToJSON (PM.SmallArray a) where
1928+ toJSON = toJSON . Exts.toList
1929+ toEncoding = toEncoding . Exts.toList
1930+
1931+#if (MIN_VERSION_primitive(0,6,4))
1932+instance (PM.Prim a,ToJSON a) => ToJSON (PM.PrimArray a) where
1933+ toJSON = toJSON . Exts.toList
1934+ toEncoding = toEncoding . Exts.toList
1935+
1936+instance (PM.PrimUnlifted a,ToJSON a) => ToJSON (PM.UnliftedArray a) where
1937+ toJSON = toJSON . Exts.toList
1938+ toEncoding = toEncoding . Exts.toList
1939+#endif
1940+
1907-------------------------------------------------------------------------------
1941-------------------------------------------------------------------------------
1908-- time
1942-- time
1909-------------------------------------------------------------------------------
1943-------------------------------------------------------------------------------
aeson.cabal+1
@@ -108,6 +108,7 @@ library
108 dlist >= 0.6,
108 dlist >= 0.6,
109 ghc-prim >= 0.2,
109 ghc-prim >= 0.2,
110 hashable >= 1.1.2.0,
110 hashable >= 1.1.2.0,
111+ primitive >= 0.6.1,
111 scientific >= 0.3.4.7 && < 0.4,
112 scientific >= 0.3.4.7 && < 0.4,
112 tagged >=0.8.3 && <0.9,
113 tagged >=0.8.3 && <0.9,
113 template-haskell >= 2.7,
114 template-haskell >= 2.7,