diff --git a/cabal.project b/cabal.project index 2c103018..582a3256 100644 --- a/cabal.project +++ b/cabal.project @@ -8,3 +8,7 @@ packages: prettyprinter , prettyprinter-compat-annotated-wl-pprint tests: true benchmarks: true + +source-repository-package + type: git + location: https://github.com/Bodigrim/linear-builder diff --git a/prettyprinter/bench/LargeOutput.hs b/prettyprinter/bench/LargeOutput.hs index 9446cacc..5ccc5611 100644 --- a/prettyprinter/bench/LargeOutput.hs +++ b/prettyprinter/bench/LargeOutput.hs @@ -179,12 +179,12 @@ randomProgram seed size = let MkGen gen = arbitrary in gen (mkQCGen seed) size main :: IO () main = do let prog = randomProgram 1 60 - renderedProg = (renderLazy . layoutPretty defaultLayoutOptions { layoutPageWidth = Unbounded } . pretty) prog - (progLines, progWidth) = let l = TL.lines renderedProg in (length l, maximum (map TL.length l)) + renderedProg = (renderStrict . layoutPretty defaultLayoutOptions { layoutPageWidth = Unbounded } . pretty) prog + (progLines, progWidth) = let l = T.lines renderedProg in (length l, maximum (map T.length l)) putDoc ("Program size:" <+> pretty progLines <+> "lines, maximum width:" <+> pretty progWidth) - let renderWith :: (Doc ann -> SimpleDocStream ann) -> Program -> TL.Text - renderWith f = renderLazy . f . pretty + let renderWith :: (Doc ann -> SimpleDocStream ann) -> Program -> T.Text + renderWith f = renderStrict . f . pretty let _80ColumnsLayoutOptions = defaultLayoutOptions { layoutPageWidth = AvailablePerLine 80 0.5 } unboundedLayoutOptions = defaultLayoutOptions { layoutPageWidth = Unbounded } @@ -193,17 +193,13 @@ main = do defaultMain [ bgroup "80 characters, 50% ribbon" - [ bgroup "prettyprinter" - [ bench "layoutPretty" (nf (renderWith (layoutPretty _80ColumnsLayoutOptions)) prog) - , bench "layoutSmart" (nf (renderWith (layoutSmart _80ColumnsLayoutOptions)) prog) - , bench "layoutCompact" (nf (renderWith layoutCompact ) prog) - ] - , bench "ansi-wl-pprint" (nf (($ "") . WL.displayS . WL.renderPretty 0.5 80 . WL.pretty) prog) ] + [ bench "layoutPretty" (nf (renderWith (layoutPretty _80ColumnsLayoutOptions)) prog) + , bench "layoutSmart" (nf (renderWith (layoutSmart _80ColumnsLayoutOptions)) prog) + , bench "layoutCompact" (nf (renderWith layoutCompact ) prog) + ] , bgroup "Infinite/large page width" - [ bgroup "prettyprinter" - [ bench "layoutPretty" (nf (renderWith (layoutPretty unboundedLayoutOptions)) prog) - , bench "layoutSmart" (nf (renderWith (layoutSmart unboundedLayoutOptions)) prog) - , bench "layoutCompact" (nf (renderWith layoutCompact ) prog) - ] - , bench "ansi-wl-pprint" (nf (($ "") . WL.displayS . WL.renderPretty 1 (fromIntegral progWidth + 10) . WL.pretty) prog) ] + [ bench "layoutPretty" (nf (renderWith (layoutPretty unboundedLayoutOptions)) prog) + , bench "layoutSmart" (nf (renderWith (layoutSmart unboundedLayoutOptions)) prog) + , bench "layoutCompact" (nf (renderWith layoutCompact ) prog) + ] ] diff --git a/prettyprinter/prettyprinter.cabal b/prettyprinter/prettyprinter.cabal index 694a260b..feee96f6 100644 --- a/prettyprinter/prettyprinter.cabal +++ b/prettyprinter/prettyprinter.cabal @@ -68,7 +68,8 @@ library , ScopedTypeVariables build-depends: - base >= 4.5 && < 5 + base >= 4.5 && < 5, + text-builder-linear if flag(text) build-depends: text >= 1.2 @@ -170,6 +171,7 @@ test-suite testsuite benchmark fusion + buildable: False type: exitcode-stdio-1.0 hs-source-dirs: bench main-is: Fusion.hs @@ -191,6 +193,7 @@ benchmark fusion buildable: False benchmark faster-unsafe-text + buildable: False build-depends: base >= 4.5 && < 5 , prettyprinter diff --git a/prettyprinter/src/Prettyprinter/Render/Text.hs b/prettyprinter/src/Prettyprinter/Render/Text.hs index 4fcaf8fa..bb6b92e5 100644 --- a/prettyprinter/src/Prettyprinter/Render/Text.hs +++ b/prettyprinter/src/Prettyprinter/Render/Text.hs @@ -1,4 +1,7 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE LinearTypes #-} +{-# LANGUAGE UnicodeSyntax #-} +{-# LANGUAGE BangPatterns #-} #include "version-compatibility-macros.h" @@ -36,6 +39,8 @@ import Data.Semigroup import Control.Applicative #endif +import Data.Text.Builder.Linear.Buffer + -- $setup -- -- (Definitions for the doctests) @@ -70,9 +75,17 @@ renderLazy = TLB.toLazyText . go -- | @('renderStrict' sdoc)@ takes the output @sdoc@ from a rendering function -- and transforms it to strict text. renderStrict :: SimpleDocStream ann -> Text -renderStrict = TL.toStrict . renderLazy - - +renderStrict sdc = runBuffer (\b -> (go b sdc)) + where + go :: Buffer ⊸ SimpleDocStream ann -> Buffer + go !b !sbc = case sbc of + SFail -> undefined b + SEmpty -> b + SChar c rest -> go (b |>. c) rest + SText _l t rest -> go (b |> t) rest + SLine i rest -> go ((b |>. '\n') |>… i) rest + SAnnPush _ann rest -> go b rest + SAnnPop rest -> go b rest -- | @('renderIO' h sdoc)@ writes @sdoc@ to the file @h@. --