on master help sign in
Merge pull request #664 from andrewthad/primitive-instances

add ToJSON and FromJSON instances for array types from primitive

commite8303d35697766e1a555235bc2d4e5e45d4d8f5e authorAdam Bergmark <adam@bergmark.nl> dateMon 24 Sep 2018, 03:07 (8 years ago) parentb48e042e297eb5
4 files changed+70
Data/Aeson/Types/FromJSON.hs+32 Data/Aeson/Types/ToJSON.hs+36 aeson.cabal+1 benchmarks/aeson-benchmarks.cabal+1
Data/Aeson/Types/FromJSON.hs+32
@@ -140,6 +140,16 @@ import qualified Data.Vector.Primitive as VP
140140import qualified Data.Vector.Storable as VS
141141import qualified Data.Vector.Unboxed as VU
142142
143+import qualified GHC.Exts as Exts
144+import qualified Data.Primitive.Array as PM
145+import qualified Data.Primitive.SmallArray as PM
146+import qualified Data.Primitive.Types as PM
147+
148+#if MIN_VERSION_primitive(0,6,4)
149+import qualified Data.Primitive.UnliftedArray as PM
150+import qualified Data.Primitive.PrimArray as PM
151+#endif
152+
143153#ifndef HAS_COERCIBLE
144154#define HAS_COERCIBLE (__GLASGOW_HASKELL__ >= 707)
145155#endif
@@ -1681,6 +1691,28 @@ instance FromJSON DotNetTime where
16811691 _ -> fail "could not parse .NET time"
16821692 {-# INLINE parseJSON #-}
16831693
1694+-------------------------------------------------------------------------------
1695+-- primitive
1696+-------------------------------------------------------------------------------
1697+
1698+#if MIN_VERSION_base(4,7,0)
1699+instance FromJSON a => FromJSON (PM.Array a) where
1700+ -- note: we could do better than this if vector exposed the data
1701+ -- constructor in Data.Vector.
1702+ parseJSON = fmap Exts.fromList . parseJSON
1703+
1704+instance FromJSON a => FromJSON (PM.SmallArray a) where
1705+ parseJSON = fmap Exts.fromList . parseJSON
1706+
1707+#if MIN_VERSION_primitive(0,6,4)
1708+instance (PM.Prim a,FromJSON a) => FromJSON (PM.PrimArray a) where
1709+ parseJSON = fmap Exts.fromList . parseJSON
1710+
1711+instance (PM.PrimUnlifted a,FromJSON a) => FromJSON (PM.UnliftedArray a) where
1712+ parseJSON = fmap Exts.fromList . parseJSON
1713+#endif
1714+#endif
1715+
16841716-------------------------------------------------------------------------------
16851717-- time
16861718-------------------------------------------------------------------------------
Data/Aeson/Types/ToJSON.hs+36
@@ -128,6 +128,16 @@ import qualified Data.Vector.Unboxed as VU
128128import qualified Data.Aeson.Encoding.Builder as EB
129129import qualified Data.ByteString.Builder as B
130130
131+import qualified GHC.Exts as Exts
132+import qualified Data.Primitive.Array as PM
133+import qualified Data.Primitive.SmallArray as PM
134+import qualified Data.Primitive.Types as PM
135+
136+#if MIN_VERSION_primitive(0,6,4)
137+import qualified Data.Primitive.UnliftedArray as PM
138+import qualified Data.Primitive.PrimArray as PM
139+#endif
140+
131141#if !(MIN_VERSION_bytestring(0,10,0))
132142import Foreign.ForeignPtr (withForeignPtr)
133143import Foreign.Marshal.Utils (copyBytes)
@@ -1918,6 +1928,32 @@ dotNetTime (DotNetTime t) = secs ++ formatMillis t ++ ")/"
19181928formatMillis :: (FormatTime t) => t -> String
19191929formatMillis = take 3 . formatTime defaultTimeLocale "%q"
19201930
1931+-------------------------------------------------------------------------------
1932+-- primitive
1933+-------------------------------------------------------------------------------
1934+
1935+#if MIN_VERSION_base(4,7,0)
1936+instance ToJSON a => ToJSON (PM.Array a) where
1937+ -- note: we could do better than this if vector exposed the data
1938+ -- constructor in Data.Vector.
1939+ toJSON = toJSON . Exts.toList
1940+ toEncoding = toEncoding . Exts.toList
1941+
1942+instance ToJSON a => ToJSON (PM.SmallArray a) where
1943+ toJSON = toJSON . Exts.toList
1944+ toEncoding = toEncoding . Exts.toList
1945+
1946+#if (MIN_VERSION_primitive(0,6,4))
1947+instance (PM.Prim a,ToJSON a) => ToJSON (PM.PrimArray a) where
1948+ toJSON = toJSON . Exts.toList
1949+ toEncoding = toEncoding . Exts.toList
1950+
1951+instance (PM.PrimUnlifted a,ToJSON a) => ToJSON (PM.UnliftedArray a) where
1952+ toJSON = toJSON . Exts.toList
1953+ toEncoding = toEncoding . Exts.toList
1954+#endif
1955+#endif
1956+
19211957-------------------------------------------------------------------------------
19221958-- time
19231959-------------------------------------------------------------------------------
aeson.cabal+1
@@ -108,6 +108,7 @@ library
108108 dlist >= 0.6,
109109 ghc-prim >= 0.2,
110110 hashable >= 1.1.2.0,
111+ primitive >= 0.6.1,
111112 scientific >= 0.3.4.7 && < 0.4,
112113 tagged >=0.8.3 && <0.9,
113114 template-haskell >= 2.7,
benchmarks/aeson-benchmarks.cabal+1
@@ -39,6 +39,7 @@ library
3939 ghc-prim >= 0.2,
4040 hashable >= 1.1.2.0,
4141 mtl,
42+ primitive >= 0.6.1,
4243 scientific >= 0.3.4.7 && < 0.4,
4344 syb,
4445 tagged >=0.8.3 && <0.9,