summaryrefslogtreecommitdiff
path: root/benchmark/benchmark-pandoc.hs
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/benchmark-pandoc.hs')
-rw-r--r--benchmark/benchmark-pandoc.hs77
1 files changed, 55 insertions, 22 deletions
diff --git a/benchmark/benchmark-pandoc.hs b/benchmark/benchmark-pandoc.hs
index e2707de20..489d5c39b 100644
--- a/benchmark/benchmark-pandoc.hs
+++ b/benchmark/benchmark-pandoc.hs
@@ -1,5 +1,6 @@
+{-# LANGUAGE TupleSections #-}
{-
-Copyright (C) 2012-2014 John MacFarlane <jgm@berkeley.edu>
+Copyright (C) 2012-2018 John MacFarlane <jgm@berkeley.edu>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -16,38 +17,70 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-}
import Text.Pandoc
+import qualified Text.Pandoc.UTF8 as UTF8
+import qualified Data.ByteString as B
import Criterion.Main
import Criterion.Types (Config(..))
+import Data.List (intersect)
import Data.Maybe (mapMaybe)
-import Debug.Trace (trace)
+import System.Environment (getArgs)
readerBench :: Pandoc
- -> (String, ReaderOptions -> String -> IO (Either PandocError Pandoc))
+ -> String
-> Maybe Benchmark
-readerBench doc (name, reader) =
- case lookup name writers of
- Just (PureStringWriter writer) ->
- let inp = writer def{ writerWrapText = WrapAuto} doc
- in return $ bench (name ++ " reader") $ nfIO $
- (fmap handleError <$> reader def{ readerSmart = True }) inp
- _ -> trace ("\nCould not find writer for " ++ name ++ "\n") Nothing
+readerBench doc name =
+ case res of
+ Right (readerFun, inp) ->
+ Just $ bench (name ++ " reader")
+ $ nf (\i -> either (error . show) id $ runPure (readerFun i))
+ inp
+ Left _ -> Nothing
+ where res = runPure $ do
+ (TextReader r, rexts)
+ <- either (fail . show) return $ getReader name
+ (TextWriter w, wexts)
+ <- either (fail . show) return $ getWriter name
+ inp <- w def{ writerWrapText = WrapAuto, writerExtensions = wexts }
+ doc
+ return (r def{ readerExtensions = rexts }, inp)
writerBench :: Pandoc
- -> (String, WriterOptions -> Pandoc -> String)
- -> Benchmark
-writerBench doc (name, writer) = bench (name ++ " writer") $ nf
- (writer def{ writerWrapText = WrapAuto }) doc
+ -> String
+ -> Maybe Benchmark
+writerBench doc name =
+ case res of
+ Right writerFun ->
+ Just $ bench (name ++ " writer")
+ $ nf (\d -> either (error . show) id $
+ runPure (writerFun d)) doc
+ _ -> Nothing
+ where res = runPure $ do
+ (TextWriter w, wexts)
+ <- either (fail . show) return $ getWriter name
+ return $ w def{ writerExtensions = wexts }
main :: IO ()
main = do
- inp <- readFile "tests/testsuite.txt"
- let opts = def{ readerSmart = True }
- let doc = handleError $ readMarkdown opts inp
- let readers' = [(n,r) | (n, StringReader r) <- readers]
+ args <- filter (\x -> take 1 x /= "-") <$> getArgs
+ print args
+ let matchReader (n, TextReader _) =
+ null args || ("reader" `elem` args && n `elem` args)
+ matchReader _ = False
+ let matchWriter (n, TextWriter _) =
+ null args || ("writer" `elem` args && n `elem` args)
+ matchWriter _ = False
+ let matchedReaders = map fst $ (filter matchReader readers
+ :: [(String, Reader PandocPure)])
+ let matchedWriters = map fst $ (filter matchWriter writers
+ :: [(String, Writer PandocPure)])
+ inp <- UTF8.toText <$> B.readFile "test/testsuite.txt"
+ let opts = def
+ let doc = either (error . show) id $ runPure $ readMarkdown opts inp
let readerBs = mapMaybe (readerBench doc)
- $ filter (\(n,_) -> n /="haddock") readers'
- let writers' = [(n,w) | (n, PureStringWriter w) <- writers]
- let writerBs = map (writerBench doc)
- $ writers'
+ $ filter (/="haddock")
+ (matchedReaders `intersect` matchedWriters)
+ -- we need the corresponding writer to generate
+ -- input for the reader
+ let writerBs = mapMaybe (writerBench doc) matchedWriters
defaultMainWith defaultConfig{ timeLimit = 6.0 }
(writerBs ++ readerBs)