packages feed

morte-1.1.0: benchmarks/Bench.hs

module Main (main) where

import Morte.Core
import Morte.Parser (ParseError, exprFromText, prettyParseError)

import Criterion.Main    (Benchmark, defaultMain, env, bgroup, bench, nf)
import Data.Text.Lazy    (Text)
import qualified Data.Text.Lazy as T
import Data.Text.Lazy.IO (readFile, hPutStrLn)
import GHC.IO.Handle.FD  (stderr)
import Paths_morte       (getDataFileName)
import Prelude hiding    (readFile)

benchFilenames :: [String]
benchFilenames = [
      "recursive.mt"
    , "factorial.mt"
    ]

readMtFile :: String -> IO (String, Text)
readMtFile filename = do
    path   <- getDataFileName filename
    mtFile <- readFile path
    return (filename, mtFile)

partitionExpr :: (String, Text) -> ([(String, ParseError)],[(String, Expr)])
              -> ([(String, ParseError)],[(String, Expr)])
partitionExpr (filename, contents) (pe,ps) =
    case exprFromText contents of
        Left  perr -> ((filename,perr):pe,ps)
        Right expr -> (pe,(filename,expr):ps)

pprFileParseError :: (String, ParseError) -> Text
pprFileParseError (fn,pe) = T.unlines [T.pack fn, prettyParseError pe]

srcEnv :: IO [(String, Expr)]
srcEnv = do
    mtFiles <- mapM readMtFile benchFilenames
    let (pe,ps) = foldr partitionExpr ([],[]) mtFiles
    mapM_ (hPutStrLn stderr . pprFileParseError) pe
    return ps

main :: IO ()
main = defaultMain [
      env srcEnv $ bgroup "source" . map benchExpr
    ]

benchExpr :: (String, Expr) -> Benchmark
benchExpr (tag,expr) = bgroup tag [
      bench "normalize" $ nf normalize expr
    , bench "equality"  $ nf (expr ==) expr
    , bench "typeOf"    $ nf typeOf    expr
    ]