on master help sign in
Merge pull request #462 from lspitzner/master

Add [From|To]JSON[1] instances for Data.Semigroup.* newtypes

commitda1db201dc7dbab6fe434bfb9d05ea7ad5e26ca0 authorAdam Bergmark <adam@bergmark.nl> dateFri 16 Sep 2016, 17:22 (10 years ago) parent47bc68f8eec675
4 files changed+222−23
Data/Aeson/Types/FromJSON.hs+99−10 Data/Aeson/Types/ToJSON.hs+104−13 changelog.md+5 tests/UnitTests.hs+14
Data/Aeson/Types/FromJSON.hs+99−10
@@ -87,7 +87,7 @@ import Data.Hashable (Hashable(..))
8787import Data.Int (Int16, Int32, Int64, Int8)
8888import Data.List.NonEmpty (NonEmpty(..))
8989import Data.Maybe (fromMaybe)
90−import Data.Monoid ((<>), Dual(..), First (..), Last (..))
90+import Data.Monoid ((<>))
9191import Data.Proxy (Proxy(..))
9292import Data.Ratio ((%), Ratio)
9393import Data.Scientific (Scientific)
@@ -112,7 +112,9 @@ import qualified Data.HashSet as HashSet
112112import qualified Data.IntMap as IntMap
113113import qualified Data.IntSet as IntSet
114114import qualified Data.Map as M
115+import qualified Data.Monoid as Monoid
115116import qualified Data.Scientific as Scientific
117+import qualified Data.Semigroup as Semigroup
116118import qualified Data.Sequence as Seq
117119import qualified Data.Set as Set
118120import qualified Data.Text as T
@@ -124,6 +126,7 @@ import qualified Data.Vector.Generic as VG
124126import qualified Data.Vector.Primitive as VP
125127import qualified Data.Vector.Storable as VS
126128import qualified Data.Vector.Unboxed as VU
129+
127130import Unsafe.Coerce (unsafeCoerce)
128131
129132#ifndef HAS_COERCIBLE
@@ -1314,6 +1317,8 @@ instance (FromJSON a) => FromJSON (NonEmpty a) where
13141317 parseJSON = parseJSON1
13151318 {-# INLINE parseJSON #-}
13161319
1320+
1321+
13171322-------------------------------------------------------------------------------
13181323-- scientific
13191324-------------------------------------------------------------------------------
@@ -1605,29 +1610,113 @@ instance FromJSON NominalDiffTime where
16051610-- base Monoid/Semigroup
16061611-------------------------------------------------------------------------------
16071612
1608−instance FromJSON1 Dual where
1609− liftParseJSON p _ = fmap Dual . p
1613+instance FromJSON1 Monoid.Dual where
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
16101657 {-# INLINE liftParseJSON #-}
16111658
1612−instance FromJSON a => FromJSON (Dual a) where
1659+ liftParseJSONList _ p a = fmap Semigroup.Max <$> p a
1660+ {-# INLINE liftParseJSONList #-}
1661+
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
16131693 parseJSON = parseJSON1
16141694 {-# INLINE parseJSON #-}
16151695
1696+ parseJSONList = liftParseJSONList parseJSON parseJSONList
1697+ {-# INLINE parseJSONList #-}
16161698
1617−instance FromJSON1 First where
1618− liftParseJSON p p' = fmap First . liftParseJSON p p'
1699+
1700+instance FromJSON1 Semigroup.WrappedMonoid where
1701+ liftParseJSON p _ a = Semigroup.WrapMonoid <$> p a
16191702 {-# INLINE liftParseJSON #-}
16201703
1621−instance FromJSON a => FromJSON (First a) where
1704+ liftParseJSONList _ p a = fmap Semigroup.WrapMonoid <$> p a
1705+ {-# INLINE liftParseJSONList #-}
1706+
1707+instance (FromJSON a) => FromJSON (Semigroup.WrappedMonoid a) where
16221708 parseJSON = parseJSON1
16231709 {-# INLINE parseJSON #-}
16241710
1711+ parseJSONList = liftParseJSONList parseJSON parseJSONList
1712+ {-# INLINE parseJSONList #-}
1713+
16251714
1626−instance FromJSON1 Last where
1627− liftParseJSON p p' = fmap Last . liftParseJSON p p'
1715+instance FromJSON1 Semigroup.Option where
1716+ liftParseJSON p p' = fmap Semigroup.Option . liftParseJSON p p'
16281717 {-# INLINE liftParseJSON #-}
16291718
1630−instance FromJSON a => FromJSON (Last a) where
1719+instance FromJSON a => FromJSON (Semigroup.Option a) where
16311720 parseJSON = parseJSON1
16321721 {-# INLINE parseJSON #-}
16331722
Data/Aeson/Types/ToJSON.hs+104−13
@@ -78,7 +78,7 @@ import Data.Functor.Sum (Sum(..))
7878import Data.Int (Int16, Int32, Int64, Int8)
7979import Data.List (intersperse)
8080import Data.List.NonEmpty (NonEmpty(..))
81−import Data.Monoid ((<>), Dual(..), First(..), Last(..))
81+import Data.Monoid ((<>))
8282import Data.Proxy (Proxy(..))
8383import Data.Ratio (Ratio, denominator, numerator)
8484import Data.Scientific (Scientific)
@@ -104,7 +104,9 @@ import qualified Data.IntMap as IntMap
104104import qualified Data.IntSet as IntSet
105105import qualified Data.List.NonEmpty as NE
106106import qualified Data.Map as M
107+import qualified Data.Monoid as Monoid
107108import qualified Data.Scientific as Scientific
109+import qualified Data.Semigroup as Semigroup
108110import qualified Data.Sequence as Seq
109111import qualified Data.Set as Set
110112import qualified Data.Text as T
@@ -2026,14 +2028,14 @@ instance ToJSON NominalDiffTime where
20262028-- base Monoid/Semigroup
20272029-------------------------------------------------------------------------------
20282030
2029−instance ToJSON1 Dual where
2030− liftToJSON t _ = t . getDual
2031+instance ToJSON1 Monoid.Dual where
2032+ liftToJSON t _ = t . Monoid.getDual
20312033 {-# INLINE liftToJSON #-}
20322034
2033− liftToEncoding t _ = t . getDual
2035+ liftToEncoding t _ = t . Monoid.getDual
20342036 {-# INLINE liftToEncoding #-}
20352037
2036−instance ToJSON a => ToJSON (Dual a) where
2038+instance ToJSON a => ToJSON (Monoid.Dual a) where
20372039 toJSON = toJSON1
20382040 {-# INLINE toJSON #-}
20392041
@@ -2041,14 +2043,14 @@ instance ToJSON a => ToJSON (Dual a) where
20412043 {-# INLINE toEncoding #-}
20422044
20432045
2044−instance ToJSON1 First where
2045− liftToJSON t to' = liftToJSON t to' . getFirst
2046+instance ToJSON1 Monoid.First where
2047+ liftToJSON t to' = liftToJSON t to' . Monoid.getFirst
20462048 {-# INLINE liftToJSON #-}
20472049
2048− liftToEncoding t to' = liftToEncoding t to' . getFirst
2050+ liftToEncoding t to' = liftToEncoding t to' . Monoid.getFirst
20492051 {-# INLINE liftToEncoding #-}
20502052
2051−instance ToJSON a => ToJSON (First a) where
2053+instance ToJSON a => ToJSON (Monoid.First a) where
20522054 toJSON = toJSON1
20532055 {-# INLINE toJSON #-}
20542056
@@ -2056,14 +2058,103 @@ instance ToJSON a => ToJSON (First a) where
20562058 {-# INLINE toEncoding #-}
20572059
20582060
2059−instance ToJSON1 Last where
2060− liftToJSON t to' = liftToJSON t to' . getLast
2061+instance ToJSON1 Monoid.Last where
2062+ liftToJSON t to' = liftToJSON t to' . Monoid.getLast
20612063 {-# INLINE liftToJSON #-}
20622064
2063− liftToEncoding t to' = liftToEncoding t to' . getLast
2065+ liftToEncoding t to' = liftToEncoding t to' . Monoid.getLast
20642066 {-# INLINE liftToEncoding #-}
20652067
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
20672158 toJSON = toJSON1
20682159 {-# INLINE toJSON #-}
20692160
changelog.md+5
@@ -1,5 +1,10 @@
11For 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).
22
3+# Upcoming
4+
5+* Add `ToJSON`/`FromJSON` instances for newtypes from `Data.Semigroup`:
6+ `Min`, `Max`, `First`, `Last`, `WrappedMonoid`, `Option`.
7+
38# 1.0.0.0
49
510Major enhancements:
tests/UnitTests.hs+14
@@ -59,6 +59,8 @@ import qualified Data.HashSet as HashSet
5959import qualified Data.IntMap as IntMap
6060import qualified Data.IntSet as IntSet
6161import qualified Data.Map as M
62+import qualified Data.Monoid as Monoid
63+import qualified Data.Semigroup as Semigroup
6264import qualified Data.Sequence as Seq
6365import qualified Data.Set as Set
6466import qualified Data.Text.Lazy as LT
@@ -419,6 +421,18 @@ jsonExamples =
419421
420422 , Example "MyEither Int String: Left" "42" (MyLeft 42 :: MyEither Int String)
421423 , 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))
422436 ]
423437
424438