@@ -14,7 +14,7 @@ import GHC.Generics (Generic)
15import Data.Aeson.Types
15import Data.Aeson.Types
16import Data.Aeson.TH (mkToJSON, mkParseJSON)
16import Data.Aeson.TH (mkToJSON, mkParseJSON)
17−import qualified Data.Aeson.Generic as G (fromJSON, toJSON)
17+import qualified Data.Aeson.Generic as G (fromJSON, toJSON)
19--------------------------------------------------------------------------------
19--------------------------------------------------------------------------------
@@ -33,53 +33,164 @@ instance NFData a => NFData (D a) where
33 rnf (Product s c x) = s `deepseq` c `deepseq` rnf x
33 rnf (Product s c x) = s `deepseq` c `deepseq` rnf x
34 rnf (Record d b y) = d `deepseq` b `deepseq` rnf y
34 rnf (Record d b y) = d `deepseq` b `deepseq` rnf y
36−--------------------------------------------------------------------------------
38type T = D (D (D ()))
36type T = D (D (D ()))
41−d = Record
39+d = Record
42 { testOne = 1234.56789
40 { testOne = 1234.56789
43 , testTwo = True
41 , testTwo = True
44 , testThree = Product "Hello World!" 'a' $
42 , testThree = Product "Hello World!" 'a' $
46 { testOne = 9876.54321
44 { testOne = 9876.54321
47 , testTwo = False
45 , testTwo = False
48 , testThree = Product "Yeehaa!!!" '\n' Nullary
46 , testThree = Product "Yeehaa!!!" '\n' Nullary
52−--------------------------------------------------------------------------------
54instance ToJSON a => ToJSON (D a)
50instance ToJSON a => ToJSON (D a)
55instance FromJSON a => FromJSON (D a)
51instance FromJSON a => FromJSON (D a)
53+thDToJSON :: ToJSON a => D a -> Value
54+thDToJSON = $(mkToJSON id ''D)
56+thDParseJSON :: FromJSON a => Value -> Parser (D a)
57+thDParseJSON = $(mkParseJSON id ''D)
59+thDFromJSON :: FromJSON a => Value -> Result (D a)
60+thDFromJSON = parse thDParseJSON
57--------------------------------------------------------------------------------
62--------------------------------------------------------------------------------
59−thToJSON :: ToJSON a => D a -> Value
64+data BigRecord = BigRecord
60−thToJSON = $(mkToJSON id ''D)
65+ { field01 :: !(), field02 :: !(), field03 :: !(), field04 :: !(), field05 :: !()
66+ , field06 :: !(), field07 :: !(), field08 :: !(), field09 :: !(), field10 :: !()
67+ , field11 :: !(), field12 :: !(), field13 :: !(), field14 :: !(), field15 :: !()
68+ , field16 :: !(), field17 :: !(), field18 :: !(), field19 :: !(), field20 :: !()
69+ , field21 :: !(), field22 :: !(), field23 :: !(), field24 :: !(), field25 :: !()
70+ } deriving (Eq, Generic, Data, Typeable)
72+instance NFData BigRecord
74+bigRecord = BigRecord () () () () ()
80+instance ToJSON BigRecord
81+instance FromJSON BigRecord
83+thBigRecordToJSON :: BigRecord -> Value
84+thBigRecordToJSON = $(mkToJSON id ''BigRecord)
86+thBigRecordParseJSON :: Value -> Parser BigRecord
87+thBigRecordParseJSON = $(mkParseJSON id ''BigRecord)
89+thBigRecordFromJSON :: Value -> Result BigRecord
90+thBigRecordFromJSON = parse thBigRecordParseJSON
92+--------------------------------------------------------------------------------
94+data BigProduct = BigProduct
100+ deriving (Eq, Generic, Data, Typeable)
102+instance NFData BigProduct
104+bigProduct = BigProduct () () () () ()
110+instance ToJSON BigProduct
111+instance FromJSON BigProduct
113+thBigProductToJSON :: BigProduct -> Value
114+thBigProductToJSON = $(mkToJSON id ''BigProduct)
116+thBigProductParseJSON :: Value -> Parser BigProduct
117+thBigProductParseJSON = $(mkParseJSON id ''BigProduct)
119+thBigProductFromJSON :: Value -> Result BigProduct
120+thBigProductFromJSON = parse thBigProductParseJSON
122+--------------------------------------------------------------------------------
124+data BigSum = F01 | F02 | F03 | F04 | F05
125+ | F06 | F07 | F08 | F09 | F10
126+ | F11 | F12 | F13 | F14 | F15
127+ | F16 | F17 | F18 | F19 | F20
128+ | F21 | F22 | F23 | F24 | F25
129+ deriving (Eq, Generic, Data, Typeable)
131+instance NFData BigSum
135+instance ToJSON BigSum
136+instance FromJSON BigSum
138+thBigSumToJSON :: BigSum -> Value
139+thBigSumToJSON = $(mkToJSON id ''BigSum)
62−thParseJSON :: FromJSON a => Value -> Parser (D a)
141+thBigSumParseJSON :: Value -> Parser BigSum
63−thParseJSON = $(mkParseJSON id ''D)
142+thBigSumParseJSON = $(mkParseJSON id ''BigSum)
65−thFromJSON :: FromJSON a => Value -> Result (D a)
144+thBigSumFromJSON :: Value -> Result BigSum
66−thFromJSON = parse thParseJSON
145+thBigSumFromJSON = parse thBigSumParseJSON
68--------------------------------------------------------------------------------
147--------------------------------------------------------------------------------
70−type FJ = Value -> Result T
149+type FJ a = Value -> Result a
72main :: IO ()
151main :: IO ()
75− in d `deepseq` v `deepseq` defaultMain
152+main = defaultMain
153+ [ let v = thDToJSON d
154+ in d `deepseq` v `deepseq`
76− [ group "toJSON" (nf thToJSON d)
156+ [ group "toJSON" (nf thDToJSON d)
77− (nf G.toJSON d)
157+ (nf G.toJSON d)
78− (nf toJSON d)
158+ (nf toJSON d)
159+ , group "fromJSON" (nf (thDFromJSON :: FJ T) v)
160+ (nf (G.fromJSON :: FJ T) v)
161+ (nf (fromJSON :: FJ T) v)
163+ , let v = thBigRecordToJSON bigRecord
164+ in bigRecord `deepseq` v `deepseq`
166+ [ group "toJSON" (nf thBigRecordToJSON bigRecord)
167+ (nf G.toJSON bigRecord)
168+ (nf toJSON bigRecord)
79− , group "fromJSON" (nf (thFromJSON :: FJ) v)
169+ , group "fromJSON" (nf (thBigRecordFromJSON :: FJ BigRecord) v)
80− (nf (G.fromJSON :: FJ) v)
170+ (nf (G.fromJSON :: FJ BigRecord) v)
81− (nf (fromJSON :: FJ) v)
171+ (nf (fromJSON :: FJ BigRecord) v)
173+ , let v = thBigProductToJSON bigProduct
174+ in bigProduct `deepseq` v `deepseq`
176+ [ group "toJSON" (nf thBigProductToJSON bigProduct)
177+ (nf G.toJSON bigProduct)
178+ (nf toJSON bigProduct)
179+ , group "fromJSON" (nf (thBigProductFromJSON :: FJ BigProduct) v)
180+ (nf (G.fromJSON :: FJ BigProduct) v)
181+ (nf (fromJSON :: FJ BigProduct) v)
183+ , let v = thBigSumToJSON bigSum
184+ in bigSum `deepseq` v `deepseq`
186+ [ group "toJSON" (nf thBigSumToJSON bigSum)
187+ (nf G.toJSON bigSum)
189+ , group "fromJSON" (nf (thBigSumFromJSON :: FJ BigSum) v)
190+ (nf (G.fromJSON :: FJ BigSum) v)
191+ (nf (fromJSON :: FJ BigSum) v)
84group n th syb gen = bgroup n [ bench "th" th
195group n th syb gen = bgroup n [ bench "th" th
85 , bench "syb" syb
196 , bench "syb" syb