packages feed

packed-data-0.1.0.2: benchmark/tree/Main.hs

module Main (main) where

import qualified AST
import qualified Build
import CIReport
import Control.Monad (when)
import Criterion.Main
import Criterion.Main.Options (Mode (..), describe)
import Criterion.Types (Config (..))
import Data.Maybe (isJust, isNothing)
import qualified Increment
import qualified List
import Options.Applicative (execParser)
import qualified Pack
import qualified Sum
import System.Directory
import qualified Traversals

main :: IO ()
main = do
    mode <- execParser (describe defaultConfig)
    when (isNothing (csvPath mode) && modeExportOtherThanCsv mode) $ do
        putStrLn "Warning: Report for CI will not be generated."
        putStrLn "Warning: Use the CSV export function to generate graphs and CI report."
    -- Criterion seems to append the result to the file if it already exists
    -- Therefore, it adds a new header. Cassava does not like this.
    _ <- case csvPath mode of
        Just p -> do
            exists <- doesFileExist p
            when exists (removeFile p)
        _ -> return ()
    runMode mode benchmarks
    case csvPath mode of
        Nothing -> return ()
        Just exportPath -> do
            putStrLn "Generating CI report..."
            generateCIReport exportPath
            putStrLn "Generation CI report."
  where
    depths = [1, 5, 10, 15, 20]
    benchmarks =
        [ Traversals.benchmark depths
        , Pack.benchmark depths
        , Increment.benchmark depths
        , Sum.benchmark depths
        , AST.benchmark depths
        , Build.benchmark depths
        , List.benchmark depths
        ]
    csvPath (RunIters cfg _ _ _) = csvPathFromCfg cfg
    csvPath (Run cfg _ _) = csvPathFromCfg cfg
    csvPath _ = Nothing
    csvPathFromCfg = csvFile
    modeExportOtherThanCsv (RunIters cfg _ _ _) = cfgExportOtherThanCsv cfg
    modeExportOtherThanCsv (Run cfg _ _) = cfgExportOtherThanCsv cfg
    modeExportOtherThanCsv _ = False
    cfgExportOtherThanCsv cfg =
        any
            isJust
            $ ($ cfg)
                <$> [ junitFile
                    , jsonFile
                    , reportFile
                    , rawDataFile
                    ]