on master help sign in
Specialize ToJSON for common types

Here's a motivating example: ``` mkArray :: [Value] -> Array mkArray = Vector.fromList mkObject :: [(Text, Value)] -> Object mkObject = HashMap.fromList someArray :: Array someArray = mkArray [toJSON (mkObject ["dummy" .=== mkObject ["dummy" .=== "dummy", "dummy" .=== "dummy", "dummy" .=== 42, "dummy" .=== 42], "dummy" .=== mkArray [toJSON "dummy", toJSON "dummy"], "dummy" .=== mkObject ["dummy" .=== 42, "dummy" .=== 42], "dummy" .=== mkArray [toJSON "dummy"]])] ``` If `aeson` doesn't pre-specialize, every time this example is compiled you pay the cost of specialization. In this case this blows up the number of terms from 181 to 2464 making compile time significantly slower than necessary.

commit80b72b3561c8f539fce13ce6d45b26d68a6c60ca authorBartosz Nitka <bnitka@fb.com> dateWed 26 Oct 2016, 19:05 (10 years ago) parentbd9c2d1
1 file changed+9
Data/Aeson/Types/ToJSON.hs+9
Data/Aeson/Types/ToJSON.hs+9
@@ -615,6 +615,11 @@ instance ToJSON1 [] where
615615 {-# INLINE liftToEncoding #-}
616616
617617instance (ToJSON a) => ToJSON [a] where
618+ {-# SPECIALIZE instance ToJSON String #-}
619+ {-# SPECIALIZE instance ToJSON [String] #-}
620+ {-# SPECIALIZE instance ToJSON [Array] #-}
621+ {-# SPECIALIZE instance ToJSON [Object] #-}
622+
618623 toJSON = toJSON1
619624 {-# INLINE toJSON #-}
620625
@@ -1865,6 +1870,8 @@ instance ToJSON1 Vector where
18651870 {-# INLINE liftToEncoding #-}
18661871
18671872instance (ToJSON a) => ToJSON (Vector a) where
1873+ {-# SPECIALIZE instance ToJSON Array #-}
1874+
18681875 toJSON = toJSON1
18691876 {-# INLINE toJSON #-}
18701877
@@ -1936,6 +1943,8 @@ instance ToJSONKey k => ToJSON1 (H.HashMap k) where
19361943 {-# INLINE liftToEncoding #-}
19371944
19381945instance (ToJSON v, ToJSONKey k) => ToJSON (H.HashMap k v) where
1946+ {-# SPECIALIZE instance ToJSON Object #-}
1947+
19391948 toJSON = toJSON1
19401949 {-# INLINE toJSON #-}
19411950