packages feed

aeson-schemas-1.3.0: bench/Benchmarks/Data/Schemas/TH.hs

{-# LANGUAGE LambdaCase #-}

module Benchmarks.Data.Schemas.TH
  ( SchemaDef(..)
  , genSchema
  , genSchema'
  , genSchemaDef
  , keysTo
  , mkField
  ) where

import Data.List (intercalate)
import Language.Haskell.TH
import Language.Haskell.TH.Quote

import Data.Aeson.Schema (schema)

data SchemaDef
  = Field String String   -- ^ { a: Int }
  | Include String String -- ^ { a: #OtherSchema }
  | Ref String            -- ^ { #OtherSchema }

genSchema :: Name -> [SchemaDef] -> DecQ
genSchema name = genSchema' name . genSchemaDef

genSchema' :: Name -> String -> DecQ
genSchema' name = tySynD name [] . quoteType schema

genSchemaDef :: [SchemaDef] -> String
genSchemaDef schemaDef = "{" ++ intercalate "," (map fromSchemaDef schemaDef) ++ "}"
  where
    fromSchemaDef = \case
      Field key ty -> key ++ ": " ++ ty
      Include key name -> key ++ ": #" ++ name
      Ref name -> "#" ++ name

keysTo :: Int -> [SchemaDef]
keysTo n = map (\i -> Field (mkField i) "Int") [1..n]

mkField :: Int -> String
mkField i = "a" ++ show i