{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -Wno-missing-signatures #-} -- for Symantic.Parser's TemplateHaskell {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE UnboxedTuples #-} {-# OPTIONS_GHC -Wno-unused-matches #-} {-# OPTIONS_GHC -Wno-unused-local-binds #-} module Brainfuck where --import qualified Data.Text.Lazy as TL import Control.Monad ((=<<)) import Criterion.Main (Benchmark, bench, bgroup, env, nf) import Data.Function (($)) import Data.Semigroup (Semigroup(..)) import Data.String (String) import Data.Text (Text) import qualified Data.Attoparsec.ByteString as AP.ByteString import qualified Data.Attoparsec.Text as AP.Text import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BSL import qualified Data.List as List import qualified Data.Text.IO as Text import qualified System.IO as IO import qualified Symantic.Parser as SP import qualified Parsers.Brainfuck.Attoparsec as AP.Brainfuck import qualified Parsers.Brainfuck.Handrolled as HR.Brainfuck import qualified Parsers.Brainfuck.SymanticParser.Grammar as SP.Brainfuck import qualified Parsers.Brainfuck.SymanticParser.AutoSplice as SP.Brainfuck.AutoSplice import qualified Parsers.Brainfuck.SymanticParser.DumpSplice as SP.Brainfuck.DumpSplice import qualified Parsers.Brainfuck.SymanticParser.PprSplice as SP.Brainfuck.PprSplice import Paths_symantic_parser inputPath inputName = getDataFileName ("parsers/Parsers/Brainfuck/inputs/"<>inputName<>".bf") benchBrainfuck inputName = [ bgroup "Text" [ env (Text.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser" $ nf $$(SP.runParser @Text SP.Brainfuck.grammar) inp , bench "Attoparsec" $ nf (AP.Text.parse AP.Brainfuck.parser) inp , bench "Handrolled" $ nf HR.Brainfuck.parser inp ] ] , bgroup "String" [ env (IO.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser" $ nf $$(SP.runParser @String SP.Brainfuck.grammar) inp ] ] , bgroup "ByteString" [ env (BS.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser.PprSplice" $ nf SP.Brainfuck.PprSplice.parserByteString inp , bench "SymanticParser.DumpSplice" $ nf SP.Brainfuck.DumpSplice.parserByteString inp , bench "SymanticParser.AutoSplice" $ nf SP.Brainfuck.AutoSplice.parserByteString inp , bench "SymanticParser" $ nf $$(SP.runParser @BS.ByteString SP.Brainfuck.grammar) inp , bench "Attoparsec" $ nf (AP.ByteString.parse AP.Brainfuck.parser) inp , bench "Handrolled" $ nf HR.Brainfuck.parser inp ] ] , bgroup "ByteStringLazy" [ env (BSL.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser" $ nf $$(SP.runParser @BSL.ByteString SP.Brainfuck.grammar) inp ] ] ] benchmark :: Benchmark benchmark = bgroup "Brainfuck" $ List.concat [ benchBrainfuck "helloworld" , benchBrainfuck "compiler" , benchBrainfuck "hanoi" ] init = SP.Brainfuck.PprSplice.dumpSplice