Use Control.Monad.State.Strict throughout.
This gives 20-30% speedup and reduction of memory
usage in most of the writers.
commit9849ba7fd744f529f063e0802a18fa18c8433eeb
authorJohn MacFarlane <jgm@berkeley.edu>
dateFri 16 Jun 2017, 23:29 (9 years ago)
parent23f3c2d
Makefile+1−1
@@ -16,7 +16,7 @@ test:
1616 stack test --flag 'pandoc:embed_data_files' --fast --test-arguments='-j4 --hide-successes $(TESTARGS)'
1717
1818bench:
19− stack bench
19+ stack bench --benchmark-arguments='$(BENCHARGS)'
2020
2121weigh:
2222 stack build --flag 'pandoc:weigh-pandoc' && stack exec weigh-pandoc
src/Text/Pandoc/Class.hs+1−1
@@ -107,7 +107,7 @@ import qualified System.FilePath.Glob as IO (glob)
107107import qualified System.Directory as IO (getModificationTime)
108108import Control.Monad as M (fail)
109109import Control.Monad.Reader (ReaderT)
110−import Control.Monad.State
110+import Control.Monad.State.Strict
111111import Control.Monad.Except
112112import Control.Monad.Writer (WriterT)
113113import Control.Monad.RWS (RWST)
src/Text/Pandoc/Compat/Time.hs+1−1
@@ -27,4 +27,4 @@ where
2727import Data.Time
2828import System.Locale ( defaultTimeLocale )
2929
30−#endif
30+#endif
src/Text/Pandoc/Pretty.hs+1−1
@@ -77,7 +77,7 @@ module Text.Pandoc.Pretty (
7777 )
7878
7979where
80−import Control.Monad.State
80+import Control.Monad.State.Strict
8181import Data.Char (isSpace)
8282import Data.Foldable (toList)
8383import Data.List (intersperse)
src/Text/Pandoc/Readers/DocBook.hs+1−1
@@ -9,7 +9,7 @@ import Text.HTML.TagSoup.Entity (lookupEntity)
99import Data.Either (rights)
1010import Data.Generics
1111import Data.Char (isSpace)
12−import Control.Monad.State
12+import Control.Monad.State.Strict
1313import Data.List (intersperse)
1414import Data.Maybe (fromMaybe)
1515import Text.TeXMath (readMathML, writeTeX)
src/Text/Pandoc/Readers/Docx.hs+1−1
@@ -76,7 +76,7 @@ module Text.Pandoc.Readers.Docx
7676
7777import Codec.Archive.Zip
7878import Control.Monad.Reader
79−import Control.Monad.State
79+import Control.Monad.State.Strict
8080import qualified Data.ByteString.Lazy as B
8181import Data.Default (Default)
8282import Data.List (delete, intersect)
src/Text/Pandoc/Readers/Docx/Parse.hs+1−1
@@ -58,7 +58,7 @@ import Codec.Archive.Zip
5858import Control.Applicative ((<|>))
5959import Control.Monad.Except
6060import Control.Monad.Reader
61−import Control.Monad.State
61+import Control.Monad.State.Strict
6262import Data.Bits ((.|.))
6363import qualified Data.ByteString.Lazy as B
6464import Data.Char (chr, isDigit, ord, readLitChar)
src/Text/Pandoc/Readers/Docx/StyleMap.hs+1−1
@@ -7,7 +7,7 @@ module Text.Pandoc.Readers.Docx.StyleMap ( StyleMaps(..)
77 , hasStyleName
88 ) where
99
10−import Control.Monad.State
10+import Control.Monad.State.Strict
1111import Data.Char (toLower)
1212import qualified Data.Map as M
1313import Text.Pandoc.Readers.Docx.Util
src/Text/Pandoc/Readers/OPML.hs+1−1
@@ -1,6 +1,6 @@
11{-# LANGUAGE FlexibleContexts #-}
22module Text.Pandoc.Readers.OPML ( readOPML ) where
3−import Control.Monad.State
3+import Control.Monad.State.Strict
44import Data.Char (toUpper)
55import Data.Text (Text, unpack, pack)
66import Data.Default
src/Text/Pandoc/Shared.hs+1−1
@@ -117,7 +117,7 @@ import Text.Pandoc.MIME (MimeType)
117117import Text.Pandoc.Error (PandocError(..))
118118import System.FilePath ( (</>) )
119119import Data.Generics (Typeable, Data)
120−import qualified Control.Monad.State as S
120+import qualified Control.Monad.State.Strict as S
121121import qualified Control.Exception as E
122122import Control.Monad (msum, unless, MonadPlus(..))
123123import Text.Pandoc.Pretty (charWidth)
src/Text/Pandoc/Writers/AsciiDoc.hs+1−1
@@ -37,7 +37,7 @@ that it has omitted the construct.
3737AsciiDoc: <http://www.methods.co.nz/asciidoc/>
3838-}
3939module Text.Pandoc.Writers.AsciiDoc (writeAsciiDoc) where
40−import Control.Monad.State
40+import Control.Monad.State.Strict
4141import Data.Aeson (Result (..), Value (String), fromJSON, toJSON)
4242import Data.Char (isPunctuation, isSpace)
4343import Data.List (intercalate, intersperse, stripPrefix)
src/Text/Pandoc/Writers/CommonMark.hs+1−1
@@ -32,7 +32,7 @@ CommonMark: <http://commonmark.org>
3232module Text.Pandoc.Writers.CommonMark (writeCommonMark) where
3333
3434import CMark
35−import Control.Monad.State (State, get, modify, runState)
35+import Control.Monad.State.Strict (State, get, modify, runState)
3636import Data.Foldable (foldrM)
3737import Data.Text (Text)
3838import qualified Data.Text as T
src/Text/Pandoc/Writers/ConTeXt.hs+1−1
@@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2929Conversion of 'Pandoc' format into ConTeXt.
3030-}
3131module Text.Pandoc.Writers.ConTeXt ( writeConTeXt ) where
32−import Control.Monad.State
32+import Control.Monad.State.Strict
3333import Data.Char (ord)
3434import Data.List (intercalate, intersperse)
3535import Data.Maybe (catMaybes)
src/Text/Pandoc/Writers/Docx.hs+1−1
@@ -37,7 +37,7 @@ import Codec.Archive.Zip
3737import Control.Applicative ((<|>))
3838import Control.Monad.Except (catchError)
3939import Control.Monad.Reader
40−import Control.Monad.State
40+import Control.Monad.State.Strict
4141import qualified Data.ByteString as B
4242import qualified Data.ByteString.Lazy as BL
4343import qualified Data.ByteString.Lazy.Char8 as BL8
src/Text/Pandoc/Writers/DokuWiki.hs+1−1
@@ -41,7 +41,7 @@ DokuWiki: <https://www.dokuwiki.org/dokuwiki>
4141module Text.Pandoc.Writers.DokuWiki ( writeDokuWiki ) where
4242import Control.Monad (zipWithM)
4343import Control.Monad.Reader (ReaderT, ask, local, runReaderT)
44−import Control.Monad.State (StateT, evalStateT, gets, modify)
44+import Control.Monad.State.Strict (StateT, evalStateT, gets, modify)
4545import Data.Default (Default (..))
4646import Data.List (intercalate, intersect, isPrefixOf, transpose)
4747import Data.Text (Text, pack)
src/Text/Pandoc/Writers/EPUB.hs+1−1
@@ -36,7 +36,7 @@ import Codec.Archive.Zip (Entry, addEntryToArchive, eRelativePath, emptyArchive,
3636 fromArchive, fromEntry, toEntry)
3737import Control.Monad (mplus, when, zipWithM)
3838import Control.Monad.Except (catchError, throwError)
39−import Control.Monad.State (State, StateT, evalState, evalStateT, get, gets,
39+import Control.Monad.State.Strict (State, StateT, evalState, evalStateT, get, gets,
4040 lift, modify, put)
4141import qualified Data.ByteString.Lazy as B
4242import qualified Data.ByteString.Lazy.Char8 as B8
src/Text/Pandoc/Writers/FB2.hs+2−2
@@ -38,8 +38,8 @@ FictionBook is an XML-based e-book format. For more information see:
3838module Text.Pandoc.Writers.FB2 (writeFB2) where
3939
4040import Control.Monad.Except (catchError, throwError)
41−import Control.Monad.State (StateT, evalStateT, get, lift, modify)
42−import Control.Monad.State (liftM)
41+import Control.Monad.State.Strict (StateT, evalStateT, get, lift, modify)
42+import Control.Monad.State.Strict (liftM)
4343import Data.ByteString.Base64 (encode)
4444import qualified Data.ByteString.Char8 as B8
4545import Data.Char (isAscii, isControl, isSpace, toLower)
src/Text/Pandoc/Writers/HTML.hs+1−1
@@ -43,7 +43,7 @@ module Text.Pandoc.Writers.HTML (
4343 writeDZSlides,
4444 writeRevealJs
4545 ) where
46−import Control.Monad.State
46+import Control.Monad.State.Strict
4747import Data.Char (ord, toLower)
4848import Data.Text (Text)
4949import qualified Data.Text.Lazy as TL
src/Text/Pandoc/Writers/Haddock.hs+1−1
@@ -33,7 +33,7 @@ Conversion of 'Pandoc' documents to haddock markup.
3333Haddock: <http://www.haskell.org/haddock/doc/html/>
3434-}
3535module Text.Pandoc.Writers.Haddock (writeHaddock) where
36−import Control.Monad.State
36+import Control.Monad.State.Strict
3737import Data.Default
3838import Data.Text (Text)
3939import Data.List (intersperse, transpose)
src/Text/Pandoc/Writers/ICML.hs+1−1
@@ -17,7 +17,7 @@ into InDesign with File -> Place.
1717-}
1818module Text.Pandoc.Writers.ICML (writeICML) where
1919import Control.Monad.Except (catchError)
20−import Control.Monad.State
20+import Control.Monad.State.Strict
2121import Data.List (intersperse, isInfixOf, isPrefixOf, stripPrefix)
2222import qualified Data.Set as Set
2323import Data.Text as Text (breakOnAll, pack)
src/Text/Pandoc/Writers/LaTeX.hs+1−1
@@ -35,7 +35,7 @@ module Text.Pandoc.Writers.LaTeX (
3535 , writeBeamer
3636 ) where
3737import Control.Applicative ((<|>))
38−import Control.Monad.State
38+import Control.Monad.State.Strict
3939import Data.Aeson (FromJSON, object, (.=))
4040import Data.Char (isAlphaNum, isAscii, isDigit, isLetter, isPunctuation, ord,
4141 toLower)
src/Text/Pandoc/Writers/Man.hs+1−1
@@ -31,7 +31,7 @@ Conversion of 'Pandoc' documents to groff man page format.
3131-}
3232module Text.Pandoc.Writers.Man ( writeMan) where
3333import Control.Monad.Except (throwError)
34−import Control.Monad.State
34+import Control.Monad.State.Strict
3535import Data.List (intercalate, intersperse, stripPrefix, sort)
3636import qualified Data.Map as Map
3737import Data.Maybe (fromMaybe)
src/Text/Pandoc/Writers/Markdown.hs+1−1
@@ -35,7 +35,7 @@ Markdown: <http://daringfireball.net/projects/markdown/>
3535-}
3636module Text.Pandoc.Writers.Markdown (writeMarkdown, writePlain) where
3737import Control.Monad.Reader
38−import Control.Monad.State
38+import Control.Monad.State.Strict
3939import Data.Char (chr, isPunctuation, isSpace, ord)
4040import Data.Default
4141import qualified Data.HashMap.Strict as H
src/Text/Pandoc/Writers/MediaWiki.hs+1−1
@@ -31,7 +31,7 @@ MediaWiki: <http://www.mediawiki.org/wiki/MediaWiki>
3131-}
3232module Text.Pandoc.Writers.MediaWiki ( writeMediaWiki ) where
3333import Control.Monad.Reader
34−import Control.Monad.State
34+import Control.Monad.State.Strict
3535import Data.List (intercalate)
3636import qualified Data.Set as Set
3737import Data.Text (Text, pack)
src/Text/Pandoc/Writers/Ms.hs+1−1
@@ -52,7 +52,7 @@ import Text.Pandoc.Pretty
5252import Text.Pandoc.Class (PandocMonad, report)
5353import Text.Pandoc.ImageSize
5454import Text.Pandoc.Logging
55−import Control.Monad.State
55+import Control.Monad.State.Strict
5656import Data.Char ( isLower, isUpper, toUpper )
5757import Text.TeXMath (writeEqn)
5858import System.FilePath (takeExtension)
src/Text/Pandoc/Writers/Muse.hs+1−1
@@ -42,7 +42,7 @@ However, @\<literal style="html">@ tag is used for HTML raw blocks
4242even though it is supported only in Emacs Muse.
4343-}
4444module Text.Pandoc.Writers.Muse (writeMuse) where
45−import Control.Monad.State
45+import Control.Monad.State.Strict
4646import Data.Text (Text)
4747import Data.List (intersperse, transpose, isInfixOf)
4848import System.FilePath (takeExtension)
src/Text/Pandoc/Writers/ODT.hs+1−1
@@ -31,7 +31,7 @@ Conversion of 'Pandoc' documents to ODT.
3131module Text.Pandoc.Writers.ODT ( writeODT ) where
3232import Codec.Archive.Zip
3333import Control.Monad.Except (catchError)
34−import Control.Monad.State
34+import Control.Monad.State.Strict
3535import qualified Data.ByteString.Lazy as B
3636import Data.List (isPrefixOf)
3737import Data.Maybe (fromMaybe)
src/Text/Pandoc/Writers/OpenDocument.hs+1−1
@@ -33,7 +33,7 @@ Conversion of 'Pandoc' documents to OpenDocument XML.
3333-}
3434module Text.Pandoc.Writers.OpenDocument ( writeOpenDocument ) where
3535import Control.Arrow ((***), (>>>))
36−import Control.Monad.State hiding (when)
36+import Control.Monad.State.Strict hiding (when)
3737import Data.Char (chr)
3838import Data.List (sortBy)
3939import Data.Text (Text)
src/Text/Pandoc/Writers/Org.hs+1−1
@@ -35,7 +35,7 @@ Conversion of 'Pandoc' documents to Emacs Org-Mode.
3535Org-Mode: <http://orgmode.org>
3636-}
3737module Text.Pandoc.Writers.Org (writeOrg) where
38−import Control.Monad.State
38+import Control.Monad.State.Strict
3939import Data.Char (isAlphaNum, toLower)
4040import Data.Text (Text)
4141import Data.List (intersect, intersperse, isPrefixOf, partition, transpose)
src/Text/Pandoc/Writers/RST.hs+1−1
@@ -31,7 +31,7 @@ Conversion of 'Pandoc' documents to reStructuredText.
3131reStructuredText: <http://docutils.sourceforge.net/rst.html>
3232-}
3333module Text.Pandoc.Writers.RST ( writeRST ) where
34−import Control.Monad.State
34+import Control.Monad.State.Strict
3535import Data.Char (isSpace, toLower)
3636import Data.List (isPrefixOf, stripPrefix)
3737import Data.Maybe (fromMaybe)
src/Text/Pandoc/Writers/Texinfo.hs+1−1
@@ -32,7 +32,7 @@ Conversion of 'Pandoc' format into Texinfo.
3232-}
3333module Text.Pandoc.Writers.Texinfo ( writeTexinfo ) where
3434import Control.Monad.Except (throwError)
35−import Control.Monad.State
35+import Control.Monad.State.Strict
3636import Data.Char (chr, ord)
3737import Data.List (maximumBy, transpose)
3838import Data.Ord (comparing)
src/Text/Pandoc/Writers/Textile.hs+1−1
@@ -30,7 +30,7 @@ Conversion of 'Pandoc' documents to Textile markup.
3030Textile: <http://thresholdstate.com/articles/4312/the-textile-reference-manual>
3131-}
3232module Text.Pandoc.Writers.Textile ( writeTextile ) where
33−import Control.Monad.State
33+import Control.Monad.State.Strict
3434import Data.Char (isSpace)
3535import Data.List (intercalate)
3636import Data.Text (Text, pack)
src/Text/Pandoc/Writers/ZimWiki.hs+1−1
@@ -33,7 +33,7 @@ http://zim-wiki.org/manual/Help/Wiki_Syntax.html
3333
3434module Text.Pandoc.Writers.ZimWiki ( writeZimWiki ) where
3535import Control.Monad (zipWithM)
36−import Control.Monad.State (StateT, evalStateT, gets, modify)
36+import Control.Monad.State.Strict (StateT, evalStateT, gets, modify)
3737import Data.Default (Default (..))
3838import Data.List (intercalate, isInfixOf, isPrefixOf, transpose)
3939import qualified Data.Map as Map