{-# 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" ] ]