Use Control.Monad.State.Strict throughout.

This gives 20-30% speedup and reduction of memory
usage in most of the writers.
This commit is contained in:
John MacFarlane 2017-06-16 23:29:37 +02:00
parent 23f3c2d7b4
commit 9849ba7fd7
33 changed files with 34 additions and 34 deletions

View file

@ -16,7 +16,7 @@ test:
stack test --flag 'pandoc:embed_data_files' --fast --test-arguments='-j4 --hide-successes $(TESTARGS)' stack test --flag 'pandoc:embed_data_files' --fast --test-arguments='-j4 --hide-successes $(TESTARGS)'
bench: bench:
stack bench stack bench --benchmark-arguments='$(BENCHARGS)'
weigh: weigh:
stack build --flag 'pandoc:weigh-pandoc' && stack exec weigh-pandoc stack build --flag 'pandoc:weigh-pandoc' && stack exec weigh-pandoc

View file

@ -107,7 +107,7 @@ import qualified System.FilePath.Glob as IO (glob)
import qualified System.Directory as IO (getModificationTime) import qualified System.Directory as IO (getModificationTime)
import Control.Monad as M (fail) import Control.Monad as M (fail)
import Control.Monad.Reader (ReaderT) import Control.Monad.Reader (ReaderT)
import Control.Monad.State import Control.Monad.State.Strict
import Control.Monad.Except import Control.Monad.Except
import Control.Monad.Writer (WriterT) import Control.Monad.Writer (WriterT)
import Control.Monad.RWS (RWST) import Control.Monad.RWS (RWST)

View file

@ -27,4 +27,4 @@ where
import Data.Time import Data.Time
import System.Locale ( defaultTimeLocale ) import System.Locale ( defaultTimeLocale )
#endif #endif

View file

@ -77,7 +77,7 @@ module Text.Pandoc.Pretty (
) )
where where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (isSpace) import Data.Char (isSpace)
import Data.Foldable (toList) import Data.Foldable (toList)
import Data.List (intersperse) import Data.List (intersperse)

View file

@ -9,7 +9,7 @@ import Text.HTML.TagSoup.Entity (lookupEntity)
import Data.Either (rights) import Data.Either (rights)
import Data.Generics import Data.Generics
import Data.Char (isSpace) import Data.Char (isSpace)
import Control.Monad.State import Control.Monad.State.Strict
import Data.List (intersperse) import Data.List (intersperse)
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Text.TeXMath (readMathML, writeTeX) import Text.TeXMath (readMathML, writeTeX)

View file

@ -76,7 +76,7 @@ module Text.Pandoc.Readers.Docx
import Codec.Archive.Zip import Codec.Archive.Zip
import Control.Monad.Reader import Control.Monad.Reader
import Control.Monad.State import Control.Monad.State.Strict
import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy as B
import Data.Default (Default) import Data.Default (Default)
import Data.List (delete, intersect) import Data.List (delete, intersect)

View file

@ -58,7 +58,7 @@ import Codec.Archive.Zip
import Control.Applicative ((<|>)) import Control.Applicative ((<|>))
import Control.Monad.Except import Control.Monad.Except
import Control.Monad.Reader import Control.Monad.Reader
import Control.Monad.State import Control.Monad.State.Strict
import Data.Bits ((.|.)) import Data.Bits ((.|.))
import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy as B
import Data.Char (chr, isDigit, ord, readLitChar) import Data.Char (chr, isDigit, ord, readLitChar)

View file

@ -7,7 +7,7 @@ module Text.Pandoc.Readers.Docx.StyleMap ( StyleMaps(..)
, hasStyleName , hasStyleName
) where ) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (toLower) import Data.Char (toLower)
import qualified Data.Map as M import qualified Data.Map as M
import Text.Pandoc.Readers.Docx.Util import Text.Pandoc.Readers.Docx.Util

View file

@ -1,6 +1,6 @@
{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleContexts #-}
module Text.Pandoc.Readers.OPML ( readOPML ) where module Text.Pandoc.Readers.OPML ( readOPML ) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (toUpper) import Data.Char (toUpper)
import Data.Text (Text, unpack, pack) import Data.Text (Text, unpack, pack)
import Data.Default import Data.Default

View file

@ -117,7 +117,7 @@ import Text.Pandoc.MIME (MimeType)
import Text.Pandoc.Error (PandocError(..)) import Text.Pandoc.Error (PandocError(..))
import System.FilePath ( (</>) ) import System.FilePath ( (</>) )
import Data.Generics (Typeable, Data) import Data.Generics (Typeable, Data)
import qualified Control.Monad.State as S import qualified Control.Monad.State.Strict as S
import qualified Control.Exception as E import qualified Control.Exception as E
import Control.Monad (msum, unless, MonadPlus(..)) import Control.Monad (msum, unless, MonadPlus(..))
import Text.Pandoc.Pretty (charWidth) import Text.Pandoc.Pretty (charWidth)

View file

@ -37,7 +37,7 @@ that it has omitted the construct.
AsciiDoc: <http://www.methods.co.nz/asciidoc/> AsciiDoc: <http://www.methods.co.nz/asciidoc/>
-} -}
module Text.Pandoc.Writers.AsciiDoc (writeAsciiDoc) where module Text.Pandoc.Writers.AsciiDoc (writeAsciiDoc) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Aeson (Result (..), Value (String), fromJSON, toJSON) import Data.Aeson (Result (..), Value (String), fromJSON, toJSON)
import Data.Char (isPunctuation, isSpace) import Data.Char (isPunctuation, isSpace)
import Data.List (intercalate, intersperse, stripPrefix) import Data.List (intercalate, intersperse, stripPrefix)

View file

@ -32,7 +32,7 @@ CommonMark: <http://commonmark.org>
module Text.Pandoc.Writers.CommonMark (writeCommonMark) where module Text.Pandoc.Writers.CommonMark (writeCommonMark) where
import CMark import CMark
import Control.Monad.State (State, get, modify, runState) import Control.Monad.State.Strict (State, get, modify, runState)
import Data.Foldable (foldrM) import Data.Foldable (foldrM)
import Data.Text (Text) import Data.Text (Text)
import qualified Data.Text as T import qualified Data.Text as T

View file

@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Conversion of 'Pandoc' format into ConTeXt. Conversion of 'Pandoc' format into ConTeXt.
-} -}
module Text.Pandoc.Writers.ConTeXt ( writeConTeXt ) where module Text.Pandoc.Writers.ConTeXt ( writeConTeXt ) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (ord) import Data.Char (ord)
import Data.List (intercalate, intersperse) import Data.List (intercalate, intersperse)
import Data.Maybe (catMaybes) import Data.Maybe (catMaybes)

View file

@ -37,7 +37,7 @@ import Codec.Archive.Zip
import Control.Applicative ((<|>)) import Control.Applicative ((<|>))
import Control.Monad.Except (catchError) import Control.Monad.Except (catchError)
import Control.Monad.Reader import Control.Monad.Reader
import Control.Monad.State import Control.Monad.State.Strict
import qualified Data.ByteString as B import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Char8 as BL8 import qualified Data.ByteString.Lazy.Char8 as BL8

View file

@ -41,7 +41,7 @@ DokuWiki: <https://www.dokuwiki.org/dokuwiki>
module Text.Pandoc.Writers.DokuWiki ( writeDokuWiki ) where module Text.Pandoc.Writers.DokuWiki ( writeDokuWiki ) where
import Control.Monad (zipWithM) import Control.Monad (zipWithM)
import Control.Monad.Reader (ReaderT, ask, local, runReaderT) import Control.Monad.Reader (ReaderT, ask, local, runReaderT)
import Control.Monad.State (StateT, evalStateT, gets, modify) import Control.Monad.State.Strict (StateT, evalStateT, gets, modify)
import Data.Default (Default (..)) import Data.Default (Default (..))
import Data.List (intercalate, intersect, isPrefixOf, transpose) import Data.List (intercalate, intersect, isPrefixOf, transpose)
import Data.Text (Text, pack) import Data.Text (Text, pack)

View file

@ -36,7 +36,7 @@ import Codec.Archive.Zip (Entry, addEntryToArchive, eRelativePath, emptyArchive,
fromArchive, fromEntry, toEntry) fromArchive, fromEntry, toEntry)
import Control.Monad (mplus, when, zipWithM) import Control.Monad (mplus, when, zipWithM)
import Control.Monad.Except (catchError, throwError) import Control.Monad.Except (catchError, throwError)
import Control.Monad.State (State, StateT, evalState, evalStateT, get, gets, import Control.Monad.State.Strict (State, StateT, evalState, evalStateT, get, gets,
lift, modify, put) lift, modify, put)
import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.Lazy.Char8 as B8 import qualified Data.ByteString.Lazy.Char8 as B8

View file

@ -38,8 +38,8 @@ FictionBook is an XML-based e-book format. For more information see:
module Text.Pandoc.Writers.FB2 (writeFB2) where module Text.Pandoc.Writers.FB2 (writeFB2) where
import Control.Monad.Except (catchError, throwError) import Control.Monad.Except (catchError, throwError)
import Control.Monad.State (StateT, evalStateT, get, lift, modify) import Control.Monad.State.Strict (StateT, evalStateT, get, lift, modify)
import Control.Monad.State (liftM) import Control.Monad.State.Strict (liftM)
import Data.ByteString.Base64 (encode) import Data.ByteString.Base64 (encode)
import qualified Data.ByteString.Char8 as B8 import qualified Data.ByteString.Char8 as B8
import Data.Char (isAscii, isControl, isSpace, toLower) import Data.Char (isAscii, isControl, isSpace, toLower)

View file

@ -43,7 +43,7 @@ module Text.Pandoc.Writers.HTML (
writeDZSlides, writeDZSlides,
writeRevealJs writeRevealJs
) where ) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (ord, toLower) import Data.Char (ord, toLower)
import Data.Text (Text) import Data.Text (Text)
import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy as TL

View file

@ -33,7 +33,7 @@ Conversion of 'Pandoc' documents to haddock markup.
Haddock: <http://www.haskell.org/haddock/doc/html/> Haddock: <http://www.haskell.org/haddock/doc/html/>
-} -}
module Text.Pandoc.Writers.Haddock (writeHaddock) where module Text.Pandoc.Writers.Haddock (writeHaddock) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Default import Data.Default
import Data.Text (Text) import Data.Text (Text)
import Data.List (intersperse, transpose) import Data.List (intersperse, transpose)

View file

@ -17,7 +17,7 @@ into InDesign with File -> Place.
-} -}
module Text.Pandoc.Writers.ICML (writeICML) where module Text.Pandoc.Writers.ICML (writeICML) where
import Control.Monad.Except (catchError) import Control.Monad.Except (catchError)
import Control.Monad.State import Control.Monad.State.Strict
import Data.List (intersperse, isInfixOf, isPrefixOf, stripPrefix) import Data.List (intersperse, isInfixOf, isPrefixOf, stripPrefix)
import qualified Data.Set as Set import qualified Data.Set as Set
import Data.Text as Text (breakOnAll, pack) import Data.Text as Text (breakOnAll, pack)

View file

@ -35,7 +35,7 @@ module Text.Pandoc.Writers.LaTeX (
, writeBeamer , writeBeamer
) where ) where
import Control.Applicative ((<|>)) import Control.Applicative ((<|>))
import Control.Monad.State import Control.Monad.State.Strict
import Data.Aeson (FromJSON, object, (.=)) import Data.Aeson (FromJSON, object, (.=))
import Data.Char (isAlphaNum, isAscii, isDigit, isLetter, isPunctuation, ord, import Data.Char (isAlphaNum, isAscii, isDigit, isLetter, isPunctuation, ord,
toLower) toLower)

View file

@ -31,7 +31,7 @@ Conversion of 'Pandoc' documents to groff man page format.
-} -}
module Text.Pandoc.Writers.Man ( writeMan) where module Text.Pandoc.Writers.Man ( writeMan) where
import Control.Monad.Except (throwError) import Control.Monad.Except (throwError)
import Control.Monad.State import Control.Monad.State.Strict
import Data.List (intercalate, intersperse, stripPrefix, sort) import Data.List (intercalate, intersperse, stripPrefix, sort)
import qualified Data.Map as Map import qualified Data.Map as Map
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)

View file

@ -35,7 +35,7 @@ Markdown: <http://daringfireball.net/projects/markdown/>
-} -}
module Text.Pandoc.Writers.Markdown (writeMarkdown, writePlain) where module Text.Pandoc.Writers.Markdown (writeMarkdown, writePlain) where
import Control.Monad.Reader import Control.Monad.Reader
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (chr, isPunctuation, isSpace, ord) import Data.Char (chr, isPunctuation, isSpace, ord)
import Data.Default import Data.Default
import qualified Data.HashMap.Strict as H import qualified Data.HashMap.Strict as H

View file

@ -31,7 +31,7 @@ MediaWiki: <http://www.mediawiki.org/wiki/MediaWiki>
-} -}
module Text.Pandoc.Writers.MediaWiki ( writeMediaWiki ) where module Text.Pandoc.Writers.MediaWiki ( writeMediaWiki ) where
import Control.Monad.Reader import Control.Monad.Reader
import Control.Monad.State import Control.Monad.State.Strict
import Data.List (intercalate) import Data.List (intercalate)
import qualified Data.Set as Set import qualified Data.Set as Set
import Data.Text (Text, pack) import Data.Text (Text, pack)

View file

@ -52,7 +52,7 @@ import Text.Pandoc.Pretty
import Text.Pandoc.Class (PandocMonad, report) import Text.Pandoc.Class (PandocMonad, report)
import Text.Pandoc.ImageSize import Text.Pandoc.ImageSize
import Text.Pandoc.Logging import Text.Pandoc.Logging
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char ( isLower, isUpper, toUpper ) import Data.Char ( isLower, isUpper, toUpper )
import Text.TeXMath (writeEqn) import Text.TeXMath (writeEqn)
import System.FilePath (takeExtension) import System.FilePath (takeExtension)

View file

@ -42,7 +42,7 @@ However, @\<literal style="html">@ tag is used for HTML raw blocks
even though it is supported only in Emacs Muse. even though it is supported only in Emacs Muse.
-} -}
module Text.Pandoc.Writers.Muse (writeMuse) where module Text.Pandoc.Writers.Muse (writeMuse) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Text (Text) import Data.Text (Text)
import Data.List (intersperse, transpose, isInfixOf) import Data.List (intersperse, transpose, isInfixOf)
import System.FilePath (takeExtension) import System.FilePath (takeExtension)

View file

@ -31,7 +31,7 @@ Conversion of 'Pandoc' documents to ODT.
module Text.Pandoc.Writers.ODT ( writeODT ) where module Text.Pandoc.Writers.ODT ( writeODT ) where
import Codec.Archive.Zip import Codec.Archive.Zip
import Control.Monad.Except (catchError) import Control.Monad.Except (catchError)
import Control.Monad.State import Control.Monad.State.Strict
import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy as B
import Data.List (isPrefixOf) import Data.List (isPrefixOf)
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)

View file

@ -33,7 +33,7 @@ Conversion of 'Pandoc' documents to OpenDocument XML.
-} -}
module Text.Pandoc.Writers.OpenDocument ( writeOpenDocument ) where module Text.Pandoc.Writers.OpenDocument ( writeOpenDocument ) where
import Control.Arrow ((***), (>>>)) import Control.Arrow ((***), (>>>))
import Control.Monad.State hiding (when) import Control.Monad.State.Strict hiding (when)
import Data.Char (chr) import Data.Char (chr)
import Data.List (sortBy) import Data.List (sortBy)
import Data.Text (Text) import Data.Text (Text)

View file

@ -35,7 +35,7 @@ Conversion of 'Pandoc' documents to Emacs Org-Mode.
Org-Mode: <http://orgmode.org> Org-Mode: <http://orgmode.org>
-} -}
module Text.Pandoc.Writers.Org (writeOrg) where module Text.Pandoc.Writers.Org (writeOrg) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (isAlphaNum, toLower) import Data.Char (isAlphaNum, toLower)
import Data.Text (Text) import Data.Text (Text)
import Data.List (intersect, intersperse, isPrefixOf, partition, transpose) import Data.List (intersect, intersperse, isPrefixOf, partition, transpose)

View file

@ -31,7 +31,7 @@ Conversion of 'Pandoc' documents to reStructuredText.
reStructuredText: <http://docutils.sourceforge.net/rst.html> reStructuredText: <http://docutils.sourceforge.net/rst.html>
-} -}
module Text.Pandoc.Writers.RST ( writeRST ) where module Text.Pandoc.Writers.RST ( writeRST ) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (isSpace, toLower) import Data.Char (isSpace, toLower)
import Data.List (isPrefixOf, stripPrefix) import Data.List (isPrefixOf, stripPrefix)
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)

View file

@ -32,7 +32,7 @@ Conversion of 'Pandoc' format into Texinfo.
-} -}
module Text.Pandoc.Writers.Texinfo ( writeTexinfo ) where module Text.Pandoc.Writers.Texinfo ( writeTexinfo ) where
import Control.Monad.Except (throwError) import Control.Monad.Except (throwError)
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (chr, ord) import Data.Char (chr, ord)
import Data.List (maximumBy, transpose) import Data.List (maximumBy, transpose)
import Data.Ord (comparing) import Data.Ord (comparing)

View file

@ -30,7 +30,7 @@ Conversion of 'Pandoc' documents to Textile markup.
Textile: <http://thresholdstate.com/articles/4312/the-textile-reference-manual> Textile: <http://thresholdstate.com/articles/4312/the-textile-reference-manual>
-} -}
module Text.Pandoc.Writers.Textile ( writeTextile ) where module Text.Pandoc.Writers.Textile ( writeTextile ) where
import Control.Monad.State import Control.Monad.State.Strict
import Data.Char (isSpace) import Data.Char (isSpace)
import Data.List (intercalate) import Data.List (intercalate)
import Data.Text (Text, pack) import Data.Text (Text, pack)

View file

@ -33,7 +33,7 @@ http://zim-wiki.org/manual/Help/Wiki_Syntax.html
module Text.Pandoc.Writers.ZimWiki ( writeZimWiki ) where module Text.Pandoc.Writers.ZimWiki ( writeZimWiki ) where
import Control.Monad (zipWithM) import Control.Monad (zipWithM)
import Control.Monad.State (StateT, evalStateT, gets, modify) import Control.Monad.State.Strict (StateT, evalStateT, gets, modify)
import Data.Default (Default (..)) import Data.Default (Default (..))
import Data.List (intercalate, isInfixOf, isPrefixOf, transpose) import Data.List (intercalate, isInfixOf, isPrefixOf, transpose)
import qualified Data.Map as Map import qualified Data.Map as Map