on master help sign in
Merge pull request #462 from lspitzner/master
da1db20Adam Bergmark
Data/Aeson/Types/FromJSON.hs+99−10
@@ -87,7 +87,7 @@ import Data.Hashable (Hashable(..))
87import Data.Int (Int16, Int32, Int64, Int8)
87import Data.Int (Int16, Int32, Int64, Int8)
88import Data.List.NonEmpty (NonEmpty(..))
88import Data.List.NonEmpty (NonEmpty(..))
89import Data.Maybe (fromMaybe)
89import Data.Maybe (fromMaybe)
90−import Data.Monoid ((<>), Dual(..), First (..), Last (..))
90+import Data.Monoid ((<>))
91import Data.Proxy (Proxy(..))
91import Data.Proxy (Proxy(..))
92import Data.Ratio ((%), Ratio)
92import Data.Ratio ((%), Ratio)
93import Data.Scientific (Scientific)
93import Data.Scientific (Scientific)
@@ -112,7 +112,9 @@ import qualified Data.HashSet as HashSet
112import qualified Data.IntMap as IntMap
112import qualified Data.IntMap as IntMap
113import qualified Data.IntSet as IntSet
113import qualified Data.IntSet as IntSet
114import qualified Data.Map as M
114import qualified Data.Map as M
115+import qualified Data.Monoid as Monoid
115import qualified Data.Scientific as Scientific
116import qualified Data.Scientific as Scientific
117+import qualified Data.Semigroup as Semigroup
116import qualified Data.Sequence as Seq
118import qualified Data.Sequence as Seq
117import qualified Data.Set as Set
119import qualified Data.Set as Set
118import qualified Data.Text as T
120import qualified Data.Text as T
@@ -124,6 +126,7 @@ import qualified Data.Vector.Generic as VG
124import qualified Data.Vector.Primitive as VP
126import qualified Data.Vector.Primitive as VP
125import qualified Data.Vector.Storable as VS
127import qualified Data.Vector.Storable as VS
126import qualified Data.Vector.Unboxed as VU
128import qualified Data.Vector.Unboxed as VU
129+
127import Unsafe.Coerce (unsafeCoerce)
130import Unsafe.Coerce (unsafeCoerce)
128
131
129#ifndef HAS_COERCIBLE
132#ifndef HAS_COERCIBLE
@@ -1314,6 +1317,8 @@ instance (FromJSON a) => FromJSON (NonEmpty a) where
1314 parseJSON = parseJSON1
1317 parseJSON = parseJSON1
1315 {-# INLINE parseJSON #-}
1318 {-# INLINE parseJSON #-}
1316
1319
1320+
1321+
1317-------------------------------------------------------------------------------
1322-------------------------------------------------------------------------------
1318-- scientific
1323-- scientific
1319-------------------------------------------------------------------------------
1324-------------------------------------------------------------------------------
@@ -1605,29 +1610,113 @@ instance FromJSON NominalDiffTime where
1605-- base Monoid/Semigroup
1610-- base Monoid/Semigroup
1606-------------------------------------------------------------------------------
1611-------------------------------------------------------------------------------
1607
1612
1608−instance FromJSON1 Dual where
1613+instance FromJSON1 Monoid.Dual where
1609− liftParseJSON p _ = fmap Dual . p
1614+ liftParseJSON p _ = fmap Monoid.Dual . p
1615+ {-# INLINE liftParseJSON #-}
1616+
1617+instance FromJSON a => FromJSON (Monoid.Dual a) where
1618+ parseJSON = parseJSON1
1619+ {-# INLINE parseJSON #-}
1620+
1621+
1622+instance FromJSON1 Monoid.First where
1623+ liftParseJSON p p' = fmap Monoid.First . liftParseJSON p p'
1624+ {-# INLINE liftParseJSON #-}
1625+
1626+instance FromJSON a => FromJSON (Monoid.First a) where
1627+ parseJSON = parseJSON1
1628+ {-# INLINE parseJSON #-}
1629+
1630+
1631+instance FromJSON1 Monoid.Last where
1632+ liftParseJSON p p' = fmap Monoid.Last . liftParseJSON p p'
1633+ {-# INLINE liftParseJSON #-}
1634+
1635+instance FromJSON a => FromJSON (Monoid.Last a) where
1636+ parseJSON = parseJSON1
1637+ {-# INLINE parseJSON #-}
1638+
1639+
1640+instance FromJSON1 Semigroup.Min where
1641+ liftParseJSON p _ a = Semigroup.Min <$> p a
1642+ {-# INLINE liftParseJSON #-}
1643+
1644+ liftParseJSONList _ p a = fmap Semigroup.Min <$> p a
1645+ {-# INLINE liftParseJSONList #-}
1646+
1647+instance (FromJSON a) => FromJSON (Semigroup.Min a) where
1648+ parseJSON = parseJSON1
1649+ {-# INLINE parseJSON #-}
1650+
1651+ parseJSONList = liftParseJSONList parseJSON parseJSONList
1652+ {-# INLINE parseJSONList #-}
1653+
1654+
1655+instance FromJSON1 Semigroup.Max where
1656+ liftParseJSON p _ a = Semigroup.Max <$> p a
1610 {-# INLINE liftParseJSON #-}
1657 {-# INLINE liftParseJSON #-}
1611
1658
1659+ liftParseJSONList _ p a = fmap Semigroup.Max <$> p a
1660+ {-# INLINE liftParseJSONList #-}
1661+
1612−instance FromJSON a => FromJSON (Dual a) where
1662+instance (FromJSON a) => FromJSON (Semigroup.Max a) where
1663+ parseJSON = parseJSON1
1664+ {-# INLINE parseJSON #-}
1665+
1666+ parseJSONList = liftParseJSONList parseJSON parseJSONList
1667+ {-# INLINE parseJSONList #-}
1668+
1669+
1670+instance FromJSON1 Semigroup.First where
1671+ liftParseJSON p _ a = Semigroup.First <$> p a
1672+ {-# INLINE liftParseJSON #-}
1673+
1674+ liftParseJSONList _ p a = fmap Semigroup.First <$> p a
1675+ {-# INLINE liftParseJSONList #-}
1676+
1677+instance (FromJSON a) => FromJSON (Semigroup.First a) where
1678+ parseJSON = parseJSON1
1679+ {-# INLINE parseJSON #-}
1680+
1681+ parseJSONList = liftParseJSONList parseJSON parseJSONList
1682+ {-# INLINE parseJSONList #-}
1683+
1684+
1685+instance FromJSON1 Semigroup.Last where
1686+ liftParseJSON p _ a = Semigroup.Last <$> p a
1687+ {-# INLINE liftParseJSON #-}
1688+
1689+ liftParseJSONList _ p a = fmap Semigroup.Last <$> p a
1690+ {-# INLINE liftParseJSONList #-}
1691+
1692+instance (FromJSON a) => FromJSON (Semigroup.Last a) where
1613 parseJSON = parseJSON1
1693 parseJSON = parseJSON1
1614 {-# INLINE parseJSON #-}
1694 {-# INLINE parseJSON #-}
1615
1695
1696+ parseJSONList = liftParseJSONList parseJSON parseJSONList
1697+ {-# INLINE parseJSONList #-}
1616
1698
1699+
1617−instance FromJSON1 First where
1700+instance FromJSON1 Semigroup.WrappedMonoid where
1618− liftParseJSON p p' = fmap First . liftParseJSON p p'
1701+ liftParseJSON p _ a = Semigroup.WrapMonoid <$> p a
1619 {-# INLINE liftParseJSON #-}
1702 {-# INLINE liftParseJSON #-}
1620
1703
1704+ liftParseJSONList _ p a = fmap Semigroup.WrapMonoid <$> p a
1705+ {-# INLINE liftParseJSONList #-}
1706+
1621−instance FromJSON a => FromJSON (First a) where
1707+instance (FromJSON a) => FromJSON (Semigroup.WrappedMonoid a) where
1622 parseJSON = parseJSON1
1708 parseJSON = parseJSON1
1623 {-# INLINE parseJSON #-}
1709 {-# INLINE parseJSON #-}
1624
1710
1711+ parseJSONList = liftParseJSONList parseJSON parseJSONList
1712+ {-# INLINE parseJSONList #-}
1713+
1625
1714
1626−instance FromJSON1 Last where
1715+instance FromJSON1 Semigroup.Option where
1627− liftParseJSON p p' = fmap Last . liftParseJSON p p'
1716+ liftParseJSON p p' = fmap Semigroup.Option . liftParseJSON p p'
1628 {-# INLINE liftParseJSON #-}
1717 {-# INLINE liftParseJSON #-}
1629
1718
1630−instance FromJSON a => FromJSON (Last a) where
1719+instance FromJSON a => FromJSON (Semigroup.Option a) where
1631 parseJSON = parseJSON1
1720 parseJSON = parseJSON1
1632 {-# INLINE parseJSON #-}
1721 {-# INLINE parseJSON #-}
1633
1722
Data/Aeson/Types/ToJSON.hs+104−13
@@ -78,7 +78,7 @@ import Data.Functor.Sum (Sum(..))
78import Data.Int (Int16, Int32, Int64, Int8)
78import Data.Int (Int16, Int32, Int64, Int8)
79import Data.List (intersperse)
79import Data.List (intersperse)
80import Data.List.NonEmpty (NonEmpty(..))
80import Data.List.NonEmpty (NonEmpty(..))
81−import Data.Monoid ((<>), Dual(..), First(..), Last(..))
81+import Data.Monoid ((<>))
82import Data.Proxy (Proxy(..))
82import Data.Proxy (Proxy(..))
83import Data.Ratio (Ratio, denominator, numerator)
83import Data.Ratio (Ratio, denominator, numerator)
84import Data.Scientific (Scientific)
84import Data.Scientific (Scientific)
@@ -104,7 +104,9 @@ import qualified Data.IntMap as IntMap
104import qualified Data.IntSet as IntSet
104import qualified Data.IntSet as IntSet
105import qualified Data.List.NonEmpty as NE
105import qualified Data.List.NonEmpty as NE
106import qualified Data.Map as M
106import qualified Data.Map as M
107+import qualified Data.Monoid as Monoid
107import qualified Data.Scientific as Scientific
108import qualified Data.Scientific as Scientific
109+import qualified Data.Semigroup as Semigroup
108import qualified Data.Sequence as Seq
110import qualified Data.Sequence as Seq
109import qualified Data.Set as Set
111import qualified Data.Set as Set
110import qualified Data.Text as T
112import qualified Data.Text as T
@@ -2026,14 +2028,14 @@ instance ToJSON NominalDiffTime where
2026-- base Monoid/Semigroup
2028-- base Monoid/Semigroup
2027-------------------------------------------------------------------------------
2029-------------------------------------------------------------------------------
2028
2030
2029−instance ToJSON1 Dual where
2031+instance ToJSON1 Monoid.Dual where
2030− liftToJSON t _ = t . getDual
2032+ liftToJSON t _ = t . Monoid.getDual
2031 {-# INLINE liftToJSON #-}
2033 {-# INLINE liftToJSON #-}
2032
2034
2033− liftToEncoding t _ = t . getDual
2035+ liftToEncoding t _ = t . Monoid.getDual
2034 {-# INLINE liftToEncoding #-}
2036 {-# INLINE liftToEncoding #-}
2035
2037
2036−instance ToJSON a => ToJSON (Dual a) where
2038+instance ToJSON a => ToJSON (Monoid.Dual a) where
2037 toJSON = toJSON1
2039 toJSON = toJSON1
2038 {-# INLINE toJSON #-}
2040 {-# INLINE toJSON #-}
2039
2041
@@ -2041,14 +2043,14 @@ instance ToJSON a => ToJSON (Dual a) where
2041 {-# INLINE toEncoding #-}
2043 {-# INLINE toEncoding #-}
2042
2044
2043
2045
2044−instance ToJSON1 First where
2046+instance ToJSON1 Monoid.First where
2045− liftToJSON t to' = liftToJSON t to' . getFirst
2047+ liftToJSON t to' = liftToJSON t to' . Monoid.getFirst
2046 {-# INLINE liftToJSON #-}
2048 {-# INLINE liftToJSON #-}
2047
2049
2048− liftToEncoding t to' = liftToEncoding t to' . getFirst
2050+ liftToEncoding t to' = liftToEncoding t to' . Monoid.getFirst
2049 {-# INLINE liftToEncoding #-}
2051 {-# INLINE liftToEncoding #-}
2050
2052
2051−instance ToJSON a => ToJSON (First a) where
2053+instance ToJSON a => ToJSON (Monoid.First a) where
2052 toJSON = toJSON1
2054 toJSON = toJSON1
2053 {-# INLINE toJSON #-}
2055 {-# INLINE toJSON #-}
2054
2056
@@ -2056,14 +2058,103 @@ instance ToJSON a => ToJSON (First a) where
2056 {-# INLINE toEncoding #-}
2058 {-# INLINE toEncoding #-}
2057
2059
2058
2060
2059−instance ToJSON1 Last where
2061+instance ToJSON1 Monoid.Last where
2060− liftToJSON t to' = liftToJSON t to' . getLast
2062+ liftToJSON t to' = liftToJSON t to' . Monoid.getLast
2061 {-# INLINE liftToJSON #-}
2063 {-# INLINE liftToJSON #-}
2062
2064
2063− liftToEncoding t to' = liftToEncoding t to' . getLast
2065+ liftToEncoding t to' = liftToEncoding t to' . Monoid.getLast
2064 {-# INLINE liftToEncoding #-}
2066 {-# INLINE liftToEncoding #-}
2065
2067
2066−instance ToJSON a => ToJSON (Last a) where
2068+instance ToJSON a => ToJSON (Monoid.Last a) where
2069+ toJSON = toJSON1
2070+ {-# INLINE toJSON #-}
2071+
2072+ toEncoding = toEncoding1
2073+ {-# INLINE toEncoding #-}
2074+
2075+
2076+instance ToJSON1 Semigroup.Min where
2077+ liftToJSON t _ (Semigroup.Min x) = t x
2078+ {-# INLINE liftToJSON #-}
2079+
2080+ liftToEncoding t _ (Semigroup.Min x) = t x
2081+ {-# INLINE liftToEncoding #-}
2082+
2083+instance ToJSON a => ToJSON (Semigroup.Min a) where
2084+ toJSON = toJSON1
2085+ {-# INLINE toJSON #-}
2086+
2087+ toEncoding = toEncoding1
2088+ {-# INLINE toEncoding #-}
2089+
2090+
2091+instance ToJSON1 Semigroup.Max where
2092+ liftToJSON t _ (Semigroup.Max x) = t x
2093+ {-# INLINE liftToJSON #-}
2094+
2095+ liftToEncoding t _ (Semigroup.Max x) = t x
2096+ {-# INLINE liftToEncoding #-}
2097+
2098+instance ToJSON a => ToJSON (Semigroup.Max a) where
2099+ toJSON = toJSON1
2100+ {-# INLINE toJSON #-}
2101+
2102+ toEncoding = toEncoding1
2103+ {-# INLINE toEncoding #-}
2104+
2105+instance ToJSON1 Semigroup.First where
2106+ liftToJSON t _ (Semigroup.First x) = t x
2107+ {-# INLINE liftToJSON #-}
2108+
2109+ liftToEncoding t _ (Semigroup.First x) = t x
2110+ {-# INLINE liftToEncoding #-}
2111+
2112+instance ToJSON a => ToJSON (Semigroup.First a) where
2113+ toJSON = toJSON1
2114+ {-# INLINE toJSON #-}
2115+
2116+ toEncoding = toEncoding1
2117+ {-# INLINE toEncoding #-}
2118+
2119+
2120+instance ToJSON1 Semigroup.Last where
2121+ liftToJSON t _ (Semigroup.Last x) = t x
2122+ {-# INLINE liftToJSON #-}
2123+
2124+ liftToEncoding t _ (Semigroup.Last x) = t x
2125+ {-# INLINE liftToEncoding #-}
2126+
2127+instance ToJSON a => ToJSON (Semigroup.Last a) where
2128+ toJSON = toJSON1
2129+ {-# INLINE toJSON #-}
2130+
2131+ toEncoding = toEncoding1
2132+ {-# INLINE toEncoding #-}
2133+
2134+
2135+instance ToJSON1 Semigroup.WrappedMonoid where
2136+ liftToJSON t _ (Semigroup.WrapMonoid x) = t x
2137+ {-# INLINE liftToJSON #-}
2138+
2139+ liftToEncoding t _ (Semigroup.WrapMonoid x) = t x
2140+ {-# INLINE liftToEncoding #-}
2141+
2142+instance ToJSON a => ToJSON (Semigroup.WrappedMonoid a) where
2143+ toJSON = toJSON1
2144+ {-# INLINE toJSON #-}
2145+
2146+ toEncoding = toEncoding1
2147+ {-# INLINE toEncoding #-}
2148+
2149+
2150+instance ToJSON1 Semigroup.Option where
2151+ liftToJSON t to' = liftToJSON t to' . Semigroup.getOption
2152+ {-# INLINE liftToJSON #-}
2153+
2154+ liftToEncoding t to' = liftToEncoding t to' . Semigroup.getOption
2155+ {-# INLINE liftToEncoding #-}
2156+
2157+instance ToJSON a => ToJSON (Semigroup.Option a) where
2067 toJSON = toJSON1
2158 toJSON = toJSON1
2068 {-# INLINE toJSON #-}
2159 {-# INLINE toJSON #-}
2069
2160
changelog.md+5
@@ -1,5 +1,10 @@
1For the latest version of this document, please see [https://github.com/bos/aeson/blob/master/changelog.md](https://github.com/bos/aeson/blob/master/changelog.md).
1For the latest version of this document, please see [https://github.com/bos/aeson/blob/master/changelog.md](https://github.com/bos/aeson/blob/master/changelog.md).
2
2
3+# Upcoming
4+
5+* Add `ToJSON`/`FromJSON` instances for newtypes from `Data.Semigroup`:
6+ `Min`, `Max`, `First`, `Last`, `WrappedMonoid`, `Option`.
7+
3# 1.0.0.0
8# 1.0.0.0
4
9
5Major enhancements:
10Major enhancements:
tests/UnitTests.hs+14
@@ -59,6 +59,8 @@ import qualified Data.HashSet as HashSet
59import qualified Data.IntMap as IntMap
59import qualified Data.IntMap as IntMap
60import qualified Data.IntSet as IntSet
60import qualified Data.IntSet as IntSet
61import qualified Data.Map as M
61import qualified Data.Map as M
62+import qualified Data.Monoid as Monoid
63+import qualified Data.Semigroup as Semigroup
62import qualified Data.Sequence as Seq
64import qualified Data.Sequence as Seq
63import qualified Data.Set as Set
65import qualified Data.Set as Set
64import qualified Data.Text.Lazy as LT
66import qualified Data.Text.Lazy as LT
@@ -419,6 +421,18 @@ jsonExamples =
419
421
420 , Example "MyEither Int String: Left" "42" (MyLeft 42 :: MyEither Int String)
422 , Example "MyEither Int String: Left" "42" (MyLeft 42 :: MyEither Int String)
421 , Example "MyEither Int String: Right" "\"foo\"" (MyRight "foo" :: MyEither Int String)
423 , Example "MyEither Int String: Right" "\"foo\"" (MyRight "foo" :: MyEither Int String)
424+
425+ -- newtypes from Monoid/Semigroup
426+ , Example "Monoid.Dual Int" "2" (pure 2 :: Monoid.Dual Int)
427+ , Example "Monoid.First Int" "2" (pure 2 :: Monoid.First Int)
428+ , Example "Monoid.Last Int" "2" (pure 2 :: Monoid.Last Int)
429+ , Example "Semigroup.Min Int" "2" (pure 2 :: Semigroup.Min Int)
430+ , Example "Semigroup.Max Int" "2" (pure 2 :: Semigroup.Max Int)
431+ , Example "Semigroup.First Int" "2" (pure 2 :: Semigroup.First Int)
432+ , Example "Semigroup.Last Int" "2" (pure 2 :: Semigroup.Last Int)
433+ , Example "Semigroup.WrappedMonoid Int" "2" (Semigroup.WrapMonoid 2 :: Semigroup.WrappedMonoid Int)
434+ , Example "Semigroup.Option Just" "2" (pure 2 :: Semigroup.Option Int)
435+ , Example "Semigroup.Option Nothing" "null" (Semigroup.Option (Nothing :: Maybe Bool))
422 ]
436 ]
423
437
424
438