floskell-0.9.0: src/main/Benchmark.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Benchmark the pretty printer.
module Main where
import Control.DeepSeq
import Criterion
import Criterion.Main
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
import qualified Data.ByteString.UTF8 as UTF8
import qualified Data.Text as T
import Floskell
import Language.Haskell.Exts ( Language(Haskell2010) )
import Markdone
-- | Main benchmarks.
main :: IO ()
main = do
bytes <- S.readFile "BENCHMARK.md"
!forest <- fmap force (parse (tokenize bytes))
defaultMain [ bgroup (T.unpack $ styleName style) $
toCriterion style forest
| style <- styles
]
-- | Convert the Markdone document to Criterion benchmarks.
toCriterion :: Style -> [Markdone] -> [Benchmark]
toCriterion style = go
where
go (Section name children : next) = bgroup (S8.unpack name) (go children)
: go next
go (PlainText desc : CodeFence lang code : next) =
if lang == "haskell"
then bench (UTF8.toString desc)
(nf (either error id . reformat style
Haskell2010
defaultExtensions
(Just "BENCHMARK.md"))
code) : go next
else go next
go (PlainText{} : next) = go next
go (CodeFence{} : next) = go next
go [] = []