packages feed

aeson-schemas-1.3.4: 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
  = -- | { a: Int }
    Field String String
  | -- | { a: #OtherSchema }
    Include String String
  | -- | { #OtherSchema }
    Ref String

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