{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -Wno-missing-signatures #-} 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 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 Parsers.Brainfuck.Attoparsec as AP.Brainfuck import qualified Parsers.Brainfuck.Handrolled as HR.Brainfuck import qualified Parsers.Brainfuck.SymanticParser as SP.Brainfuck 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.Brainfuck.parserText 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.Brainfuck.parserString inp ] ] , bgroup "ByteString" [ env (BS.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser" $ nf SP.Brainfuck.parserByteString 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.Brainfuck.parserByteStringLazy inp ] ] ] benchmark :: Benchmark benchmark = bgroup "Brainfuck" $ List.concat [ benchBrainfuck "compiler" , benchBrainfuck "hanoi" ]