Files
tricu/bench/Bench.hs

65 lines
2.3 KiB
Haskell

{-# LANGUAGE BangPatterns #-}
module Main where
import Criterion.Main
import qualified Data.Map as Map
import Eval
import FileEval
import Parser
import Research
-- | Build an environment from a library file.
loadLib :: FilePath -> IO Env
loadLib = evaluateFile
main :: IO ()
main = do
!baseLib <- loadLib "lib/base.tri"
!listLib <- loadLib "lib/list.tri"
!contractsLib <- loadLib "lib/contracts.tri"
!intLib <- loadLib "lib/intensionalContracts.tri"
!guardedLib <- loadLib "lib/guardedBase.tri"
let !env = Map.unions [baseLib, listLib, contractsLib, intLib, guardedLib]
defaultMain
[ bgroup "contracts"
[ bench "raw head" $ whnf
(result . evalTricu env . parseTricu)
"head [1 2 3 4 5]"
, bench "safeHead (checked)" $ whnf
(result . evalTricu env . parseTricu)
"safeHead [1 2 3 4 5]"
, bench "raw div" $ whnf
(result . evalTricu env . parseTricu)
"div 10 2"
, bench "safeDiv (checked)" $ whnf
(result . evalTricu env . parseTricu)
"safeDiv 10 2"
, bench "safeDiv failure (div by zero)" $ whnf
(result . evalTricu env . parseTricu)
"safeDiv 10 0"
, bench "sortedMax on sorted list" $ whnf
(result . evalTricu env . parseTricu)
"sortedMax [1 2 3 4 5]"
, bench "safeHalf (even check)" $ whnf
(result . evalTricu env . parseTricu)
"safeHalf 8"
, bench "sortedList? success" $ whnf
(result . evalTricu env . parseTricu)
"withContract (sortedList? nat?) [1 2 3 4 5] (xs : sum xs) (msg : 0)"
, bench "sortedList? failure" $ whnf
(result . evalTricu env . parseTricu)
"withContract (sortedList? nat?) [5 1 3] (xs : sum xs) (msg : 0)"
, bench "listOf nat? success" $ whnf
(result . evalTricu env . parseTricu)
"withContract (listOf nat?) [1 2 3 4 5] (xs : sum xs) (msg : 0)"
, bench "fn2 apply add" $ whnf
(result . evalTricu env . parseTricu)
"(fn2 nat? nat? nat? add) 3 5"
, bench "fnContract apply identity" $ whnf
(result . evalTricu env . parseTricu)
"(fnContract nat? nat? (x : x)) 7"
]
]