aeson-schemas-1.3.4: bench/Benchmarks/Data/Schemas.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TemplateHaskell #-}
module Benchmarks.Data.Schemas (
module Benchmarks.Data.Schemas,
module Benchmarks.Data.Schemas.TH,
) where
import Control.Monad (forM)
import Data.Char (chr, toUpper)
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (lift)
import Language.Haskell.TH.TestUtils ()
import Benchmarks.Data.Schemas.TH
-- Generates:
--
-- type Schema1 = { a1: Int }
-- type Schema5 = { a1: Int, a2: Int, ... a5: Int }
-- type Schema10 = { a1: Int, a2: Int, ... a10: Int }
-- type Schema100 = { a1: Int, a2: Int, ... a100: Int }
$( do
-- The sizes of schemas to generate
let schemaSizes = [1, 5, 10, 100]
allSchemas = flip map schemaSizes $ \n ->
let name = "Schema" ++ show n
in (n, name, mkName name)
concat
<$> sequence
[ forM allSchemas $ \(n, _, name) -> genSchema name $ keysTo n
, [d|
sizedSchemas :: [(Int, String)]
sizedSchemas = $(lift $ flip map allSchemas $ \(n, name, _) -> (n, name))
sizedSchemasNames :: [(String, Name)]
sizedSchemasNames = $(lift $ flip map allSchemas $ \(_, name, thName) -> (name, thName))
|]
]
)
-- Generates:
--
-- type SchemaNest1 = { a1: Int }
-- type SchemaNest5 = { a1: { a2: { ... a5: Int } }
-- type SchemaNest10 = { a1: { a2: { ... a10: Int } }
-- type SchemaNest100 = { a1: { a2: { ... a100: Int } }
$( do
-- The depths of schemas to generate
let schemaSizes = [1, 5, 10, 100]
allSchemas = flip map schemaSizes $ \n ->
let name = "SchemaNest" ++ show n
in (n, name, mkName name)
concat
<$> sequence
[ forM allSchemas $ \(n, _, name) ->
genSchema' name $
foldr (\i inner -> genSchemaDef [Field (mkField i) inner]) "Int" [1 .. n]
, [d|
nestedSchemas :: [(Int, String)]
nestedSchemas = $(lift $ flip map allSchemas $ \(n, name, _) -> (n, name))
nestedSchemasNames :: [(String, Name)]
nestedSchemasNames = $(lift $ flip map allSchemas $ \(_, name, thName) -> (name, thName))
|]
]
)
-- Generates:
--
-- type SchemaA1 = { a1: Int }
-- type SchemaB1 = { b1: Int }
-- ...
-- type SchemaZ1 = { z1: Int }
-- type SchemaA2 = { a2: Int }
-- type SchemaB2 = { a2: Int }
-- ...
$( do
let numSchemas = 100
allSchemas = flip map [1 .. numSchemas] $ \n ->
let (q, r) = n `divMod` 26
c = chr $ 97 + r -- a .. z
field = c : show q
name = "Schema" ++ map toUpper field
in (field, name, mkName name)
concat
<$> sequence
[ forM allSchemas $ \(field, _, name) -> genSchema name [Field field "Int"]
, [d|
singleSchemas :: [String]
singleSchemas = $(lift $ flip map allSchemas $ \(_, name, _) -> name)
singleSchemasNames :: [(String, Name)]
singleSchemasNames = $(lift $ flip map allSchemas $ \(_, name, thName) -> (name, thName))
|]
]
)