    -- | Frequently useful definitions for working with general prettyprinters.
    module Prettyprinter.Util (
        module Prettyprinter.Util
    ) where

    import           Data.Text                             (Text)
    import qualified Data.Text                             as T
    import           Prettyprinter.Render.Text
    import           Prelude                               hiding (words)
    import           System.IO

    import Prettyprinter

    -- | Split an input into word-sized 'Doc's.
    --
    -- >>> putDoc (tupled (words "Lorem ipsum dolor"))
    -- (Lorem, ipsum, dolor)
    words :: Text -> [Doc ann]
    words :: forall ann. Text -> [Doc ann]
    words = (Text -> Doc ann) -> [Text] -> [Doc ann]
    forall a b. (a -> b) -> [a] -> [b]
    map Text -> Doc ann
    forall ann. Text -> Doc ann
    forall a ann. Pretty a => a -> Doc ann
    pretty ([Text] -> [Doc ann]) -> (Text -> [Text]) -> Text -> [Doc ann]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Text -> [Text]
    T.words

    -- | Insert soft linebreaks between words, so that text is broken into multiple
    -- lines when it exceeds the available width.
    --
    -- >>> putDocW 32 (reflow "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.")
    -- Lorem ipsum dolor sit amet,
    -- consectetur adipisicing elit,
    -- sed do eiusmod tempor incididunt
    -- ut labore et dolore magna
    -- aliqua.
    --
    -- @
    -- 'reflow' = 'fillSep' . 'words'
    -- @
    reflow :: Text -> Doc ann
    reflow :: forall ann. Text -> Doc ann
    reflow = [Doc ann] -> Doc ann
    forall ann. [Doc ann] -> Doc ann
    fillSep ([Doc ann] -> Doc ann) -> (Text -> [Doc ann]) -> Text -> Doc ann
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Text -> [Doc ann]
    forall ann. Text -> [Doc ann]
    words

    -- | Render a document with a certain width. Useful for quick-and-dirty testing
    -- of layout behaviour. Used heavily in the doctests of this package, for
    -- example.
    --
    -- >>> let doc = reflow "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
    -- >>> putDocW 20 doc
    -- Lorem ipsum dolor
    -- sit amet,
    -- consectetur
    -- adipisicing elit
    -- >>> putDocW 30 doc
    -- Lorem ipsum dolor sit amet,
    -- consectetur adipisicing elit
    putDocW :: Int -> Doc ann -> IO ()
    putDocW :: forall ann. Int -> Doc ann -> IO ()
    putDocW Int
    w Doc ann
    doc = Handle -> SimpleDocStream Any -> IO ()
    forall ann. Handle -> SimpleDocStream ann -> IO ()
    renderIO Handle
    System.IO.stdout (LayoutOptions -> Doc Any -> SimpleDocStream Any
    forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
    layoutPretty LayoutOptions
    layoutOptions (Doc ann -> Doc Any
    forall ann xxx. Doc ann -> Doc xxx
    unAnnotate Doc ann
    doc))
      where
        layoutOptions :: LayoutOptions
    layoutOptions = LayoutOptions { layoutPageWidth :: PageWidth
    layoutPageWidth = Int -> Double -> PageWidth
    AvailablePerLine Int
    w Double
    1 }

    -- $setup
    --
    -- (Definitions for the doctests)
    --
    -- >>> :set -XOverloadedStrings