diff options
author | John MacFarlane <jgm@berkeley.edu> | 2019-03-28 13:51:15 -0700 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2019-03-28 13:51:15 -0700 |
commit | 7fa5fbed9e0440694e9c52a8dc83f3e4f29c8a96 (patch) | |
tree | 3015d7ef16559c3c40e6f1db2644bc5bac00565e | |
parent | b87a3efb93a7354c53117fa4ba6d43d2b5746ee9 (diff) | |
download | pandoc-7fa5fbed9e0440694e9c52a8dc83f3e4f29c8a96.tar.gz |
Use strict instead of lazy sum.
sum is lazy; replace with `foldl' (+) 0` to avoid stack
overflow in Text.Pandoc.Pretty with very long strings.
Closes #5401.
-rw-r--r-- | src/Text/Pandoc/Pretty.hs | 6 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/Shared.hs | 4 |
2 files changed, 5 insertions, 5 deletions
diff --git a/src/Text/Pandoc/Pretty.hs b/src/Text/Pandoc/Pretty.hs index 2d7a3a725..ad223274e 100644 --- a/src/Text/Pandoc/Pretty.hs +++ b/src/Text/Pandoc/Pretty.hs @@ -65,7 +65,7 @@ import Control.Monad import Control.Monad.State.Strict import Data.Char (isSpace) import Data.Foldable (toList) -import Data.List (intersperse) +import Data.List (intersperse, foldl') import Data.Sequence (Seq, ViewL (..), fromList, mapWithIndex, singleton, viewl, (<|)) import qualified Data.Sequence as Seq @@ -305,7 +305,7 @@ renderList (BreakingSpace : xs) = do let xs' = dropWhile isBreakingSpace xs let next = takeWhile isText xs' st <- get - let off = sum $ map offsetOf next + let off = foldl' (+) 0 $ map offsetOf next case lineLength st of Just l | column st + 1 + off > l -> do outp (-1) "\n" @@ -540,4 +540,4 @@ charWidth c = -- | Get real length of string, taking into account combining and double-wide -- characters. realLength :: String -> Int -realLength = sum . map charWidth +realLength = foldl' (+) 0 . map charWidth diff --git a/src/Text/Pandoc/Writers/Shared.hs b/src/Text/Pandoc/Writers/Shared.hs index 7027a9576..f4370b7bf 100644 --- a/src/Text/Pandoc/Writers/Shared.hs +++ b/src/Text/Pandoc/Writers/Shared.hs @@ -41,7 +41,7 @@ import Data.Aeson (FromJSON (..), Result (..), ToJSON (..), Value (Object), encode, fromJSON) import Data.Char (chr, ord, isSpace, isDigit) import qualified Data.HashMap.Strict as H -import Data.List (groupBy, intersperse, transpose) +import Data.List (groupBy, intersperse, transpose, foldl') import qualified Data.Map as M import Data.Maybe (isJust) import qualified Data.Text as T @@ -279,7 +279,7 @@ gridTable opts blocksToDoc headless aligns widths headers rows = do -- handleGivenWidths let handleZeroWidths = do (widthsInChars', rawHeaders', rawRows') <- handleFullWidths - if sum widthsInChars' > writerColumns opts + if foldl' (+) 0 widthsInChars' > writerColumns opts then -- use even widths handleGivenWidths (replicate numcols (1.0 / fromIntegral numcols) :: [Double]) |