on master help sign in
Merge pull request #102 from nikita-volkov/master

Fix the Maybe being treated as ADT in Generics bug

commit04a43d8f3702ea7aa151a32c808023ce61457fbb authorBryan O'Sullivan <bos@serpentine.com> dateMon 14 Jan 2013, 21:32 (14 years ago) parentae0bd6cf60b08e
2 files changed+8
Data/Aeson/Generic.hs+6 tests/Properties.hs+2
Data/Aeson/Generic.hs+6
@@ -84,6 +84,7 @@ type T a = a -> Value
8484
8585toJSON :: (Data a) => a -> Value
8686toJSON = toJSON_generic
87+ `ext1Q` maybe
8788 `ext1Q` list
8889 `ext1Q` vector
8990 `ext1Q` set
@@ -119,6 +120,8 @@ toJSON = toJSON_generic
119120 `extQ` (T.toJSON :: T ())
120121 --`extQ` (T.toJSON :: T Ordering)
121122 where
123+ maybe (Just a) = toJSON a
124+ maybe Nothing = Null
122125 list xs = Array . V.fromList . map toJSON $ xs
123126 vector v = Array . V.map toJSON $ v
124127 set s = Array . V.fromList . map toJSON . Set.toList $ s
@@ -187,6 +190,7 @@ type F a = Parser a
187190
188191parseJSON :: (Data a) => Value -> Parser a
189192parseJSON j = parseJSON_generic j
193+ `ext1R` maybeP
190194 `ext1R` list
191195 `ext1R` vector
192196 `ext2R'` mapAny
@@ -222,6 +226,8 @@ parseJSON j = parseJSON_generic j
222226 where
223227 value :: (T.FromJSON a) => Parser a
224228 value = T.parseJSON j
229+ maybeP :: (Data a) => Parser (Maybe a)
230+ maybeP = if j == Null then return Nothing else Just <$> parseJSON j
225231 list :: (Data a) => Parser [a]
226232 list = V.toList <$> parseJSON j
227233 vector :: (Data a) => Parser (V.Vector a)
tests/Properties.hs+2
@@ -151,12 +151,14 @@ tests = [
151151 , testProperty "Double" $ genericFrom (1::Double)
152152 , testProperty "Int" $ genericFrom (1::Int)
153153 , testProperty "Foo" $ genericFrom (undefined::Foo)
154+ , testProperty "Maybe" $ genericFrom (Just 1 :: Maybe Int)
154155 ],
155156 testGroup "genericTo" [
156157 testProperty "Bool" $ genericTo True
157158 , testProperty "Double" $ genericTo (1::Double)
158159 , testProperty "Int" $ genericTo (1::Int)
159160 , testProperty "Foo" $ genericTo (undefined::Foo)
161+ , testProperty "Maybe" $ genericTo (Just 1 :: Maybe Int)
160162 ],
161163 testGroup "roundTrip" [
162164 testProperty "Bool" $ roundTripEq True