content: {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE DeriveAnyClass #-}
  {-# LANGUAGE DeriveGeneric #-}
  
  import Control.DeepSeq
  import Data.Text (Text)
  import Faker
  import Faker.Address (country, fullAddress)
  import Faker.Ancient (god)
  import Faker.Combinators (listOf)
  import Faker.Name (name)
  import Faker.TvShow.SiliconValley (email)
  import GHC.Generics
  import Gauge
  
  data Person =
    Person
      { personName :: Text
      , personAddress :: Text
      , personEmail :: Text
      , personCountry :: Text
      }
    deriving (Show, Eq, NFData, Generic)
  
  fakePerson :: Fake Person
  fakePerson = do
    personName <- name
    personAddress <- fullAddress
    personCountry <- country
    personEmail <- email
    pure $ Person {..}
  
  main :: IO ()
  main = defaultMain benchs
    where
      benchs =
        [ bgroup
            "God benchmark"
            [ bench "single god" $ nfIO (generate singleGod)
            , bench "thousand gods" $ nfIO (generate thousandGod)
            ]
        , bgroup
            "Person benchmark"
            [ bench "single person" $ nfIO (generate fakePerson)
            , bench "10 persons" $ nfIO (generate $ listOf 10 fakePerson)
            ]
        ]
        where
          singleGod :: Fake Text
          singleGod = god
          thousandGod :: Fake [Text]
          thousandGod = listOf 1000 god
  