packages feed

yaml-streamly-0.12.1: bench/Main.hs

{-# LANGUAGE TypeApplications #-}

module Main where

import GHCupTypes

import Criterion.Main
import Data.Yaml
import System.Directory
import System.IO.Temp
import System.FilePath

import qualified System.IO.Strict as SIO
import qualified Data.ByteString as B


-- Our benchmark harness.
main :: IO ()
main = do
  defaultMain [
      env setupEnvDecode $ \ ~(yaml, yamlPath) ->
      bgroup "decode" [ bench "decodeEither'" $ nf (decodeEither' @Value) yaml
                      , bench "decodeFileEither" $ nfIO (decodeFileEither @Value yamlPath)
                      ]
    , envWithCleanup setupEnvEncode cleanupEnvCode $ \ ~(decoded, tmpdir) ->
      bgroup "encode" [ bench "encode" $ nf encode decoded
                      , bench "encodeFile" $ nfIO (encodeFile (tmpdir </> "encoded") decoded)
                      ]
    ]
 where
  setupEnvDecode = do
    let yamlPath = "bench/resources/ghcup-0.0.6.yaml"
    yaml <- B.readFile yamlPath
    pure (yaml, yamlPath)
  setupEnvEncode = do
    decoded <- read @GHCupInfo <$> SIO.readFile "bench/resources/ghcup-0.0.6.yaml.decoded"
    ctmpdir <- getCanonicalTemporaryDirectory
    tmpdir <- createTempDirectory ctmpdir "yaml-bench"
    pure (decoded, tmpdir)
  cleanupEnvCode (_, tmpdir) = do
    removePathForcibly tmpdir