module Main (main) where
import Control.Exception (throw)
import Control.Monad (void)
import Criterion.Main
import Data.Binary (decode, encode)
import qualified Data.ByteString.Lazy as BSL
import Language.Dickinson.Check
import Language.Dickinson.DuplicateCheck
import Language.Dickinson.File
import Language.Dickinson.Lexer
import Language.Dickinson.Parser
import Language.Dickinson.Rename
import Language.Dickinson.ScopeCheck
import Language.Dickinson.Type
import Language.Dickinson.Unique
main :: IO ()
main =
defaultMain [ env parses $ \ ~(c, s) ->
bgroup "parse"
[ bench "lib/color.dck" $ nf parse c
, bench "lex lib/color.dck" $ nf lexDickinson c
, bench "examples/shakespeare.dck" $ nf parse s
]
, env libParsed $ \p ->
bgroup "renamer"
[ bench "bench/data/nestLet.dck" $ nf plainExpr p
]
, env (plainExpr <$> libParsed) $ \ ~(Dickinson _ r) ->
bgroup "scope checker"
[ bench "bench/data/nestLet.dck" $ nf checkScope r
]
, env (void <$> multiParsed) $ \p ->
bgroup "encoder"
[ bench "bench/data/multiple.dck" $ nf encode p
]
, env encodeEnv $ \ ~(e, es) ->
bgroup "decoder"
[ bench "bench/data/multiple.dck" $ nf (decode :: BSL.ByteString -> Dickinson ()) e
, bench "examples/shakespeare.dck" $ nf (decode :: BSL.ByteString -> Dickinson ()) es
]
, env multiParsed $ \ ~(Dickinson _ p) ->
bgroup "check"
[ bench "bench/data/multiple.dck" $ nf checkMultiple p
, bench "bench/data/multiple.dck" $ nf checkDuplicates p -- TODO: better example
]
, bgroup "result"
[ bench "test/eval/context.dck" $ nfIO (evalFile [] "test/eval/context.dck")
, bench "examples/shakespeare.dck" $ nfIO (evalFile [] "examples/shakespeare.dck")
, bench "examples/doggo.dck" $ nfIO (evalFile ["prelude"] "examples/doggo.dck")
, bench "test/demo/animal.dck" $ nfIO (evalFile ["lib"] "test/demo/animal.dck")
, bench "examples/hotTake.dck" $ nfIO (evalFile [] "examples/hotTake.dck")
, bench "examples/fortune.dck" $ nfIO (evalFile [] "examples/fortune.dck")
]
, bgroup "pipeline"
[ bench "examples/shakespeare.dck" $ nfIO (pipeline [] "examples/shakespeare.dck")
, bench "examples/fortune.dck" $ nfIO (pipeline [] "examples/fortune.dck")
]
, bgroup "tcFile"
[ bench "examples/hotTake.dck" $ nfIO (tcFile [] "examples/hotTake.dck")
, bench "examples/fortune.dck" $ nfIO (tcFile [] "examples/fortune.dck")
]
]
where libFile = BSL.readFile "lib/color.dck"
shakespeare = BSL.readFile "examples/shakespeare.dck"
parses = (,) <$> libFile <*> shakespeare
libParsed = either throw id . parseWithMax <$> BSL.readFile "bench/data/nestLet.dck"
multiParsed = either throw id . parse <$> BSL.readFile "bench/data/multiple.dck"
encoded = encode . void <$> multiParsed
encodeShakespeare = encode . void . either throw id . parse <$> shakespeare
encodeEnv = (,) <$> encoded <*> encodeShakespeare
plainExpr :: (UniqueCtx, Dickinson a) -> Dickinson a
plainExpr = fst . uncurry renameDickinson