Bryan O'Sullivan avatar Bryan O'Sullivan committed cc5ad41 Merge

Merge pull request #102 from nikita-volkov/master

Fix the Maybe being treated as ADT in Generics bug

Comments (0)

Files changed (2)

Data/Aeson/Generic.hs

 
 toJSON :: (Data a) => a -> Value
 toJSON = toJSON_generic
+         `ext1Q` maybe
          `ext1Q` list
          `ext1Q` vector
          `ext1Q` set
          `extQ` (T.toJSON :: T ())
          --`extQ` (T.toJSON :: T Ordering)
   where
+    maybe (Just a) = toJSON a
+    maybe Nothing = Null
     list xs = Array . V.fromList . map toJSON $ xs
     vector v = Array . V.map toJSON $ v
     set s = Array . V.fromList . map toJSON . Set.toList $ s
 
 parseJSON :: (Data a) => Value -> Parser a
 parseJSON j = parseJSON_generic j
+             `ext1R` maybeP
              `ext1R` list
              `ext1R` vector
              `ext2R'` mapAny
   where
     value :: (T.FromJSON a) => Parser a
     value = T.parseJSON j
+    maybeP :: (Data a) => Parser (Maybe a)
+    maybeP = if j == Null then return Nothing else Just <$> parseJSON j
     list :: (Data a) => Parser [a]
     list = V.toList <$> parseJSON j
     vector :: (Data a) => Parser (V.Vector a)

tests/Properties.hs

     , testProperty "Double" $ genericFrom (1::Double)
     , testProperty "Int" $ genericFrom (1::Int)
     , testProperty "Foo" $ genericFrom (undefined::Foo)
+    , testProperty "Maybe" $ genericFrom (Just 1 :: Maybe Int)
     ],
   testGroup "genericTo" [
       testProperty "Bool" $ genericTo True
     , testProperty "Double" $ genericTo (1::Double)
     , testProperty "Int" $ genericTo (1::Int)
     , testProperty "Foo" $ genericTo (undefined::Foo)
+    , testProperty "Maybe" $ genericTo (Just 1 :: Maybe Int)
     ],
   testGroup "roundTrip" [
       testProperty "Bool" $ roundTripEq True
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.