packages feed

language-dickinson-1.1.0.2: src/Data/Text/Prettyprint/Doc/Ext.hs

{-# LANGUAGE OverloadedStrings #-}

module Data.Text.Prettyprint.Doc.Ext ( prettyText
                                     , prettyLazyText
                                     , smartDickinson
                                     , dickinsonText
                                     , dickinsonLazyText
                                     , intercalate
                                     , hardSep
                                     , prettyDumpBinds
                                     -- * Debug class
                                     , Debug (..)
                                     -- * Operators
                                     , (<#>)
                                     , (<:>)
                                     , (<^>)
                                     , (<#*>)
                                     ) where

import qualified Data.IntMap               as IM
import           Data.List                 (intersperse)
import           Data.Semigroup            ((<>))
import qualified Data.Text                 as T
import qualified Data.Text.Lazy            as TL
import           Prettyprinter             (Doc, LayoutOptions (LayoutOptions), PageWidth (AvailablePerLine),
                                            Pretty (pretty), SimpleDocStream, concatWith, flatAlt, hardline, indent,
                                            layoutSmart, softline, vsep, (<+>))
import           Prettyprinter.Render.Text (renderLazy, renderStrict)

infixr 6 <#>
infixr 6 <:>
infixr 6 <^>

class Debug a where
    debug :: a -> Doc b

(<#>) :: Doc a -> Doc a -> Doc a
(<#>) x y = x <> hardline <> y

(<:>) :: Doc a -> Doc a -> Doc a
(<:>) x y = x <> softline <> y

(<#*>) :: Doc a -> Doc a -> Doc a
(<#*>) x y = x <> hardline <> indent 2 y

(<^>) :: Doc a -> Doc a -> Doc a
(<^>) x y = flatAlt (x <> hardline <> indent 2 y) (x <+> y)

prettyDumpBinds :: Pretty b => IM.IntMap b -> Doc a
prettyDumpBinds b = vsep (prettyBind <$> IM.toList b)

prettyBind :: Pretty b => (Int, b) -> Doc a
prettyBind (i, j) = pretty i <+> "→" <+> pretty j

hardSep :: [Doc ann] -> Doc ann
hardSep = concatWith (<#>)

intercalate :: Doc a -> [Doc a] -> Doc a
intercalate x = mconcat . intersperse x

dickinsonLayoutOptions :: LayoutOptions
dickinsonLayoutOptions = LayoutOptions (AvailablePerLine 160 0.8)

-- TODO: use layoutCompact for errors?

smartDickinson :: Doc a -> SimpleDocStream a
smartDickinson = layoutSmart dickinsonLayoutOptions

dickinsonText :: Doc a -> T.Text
dickinsonText = renderStrict . smartDickinson

dickinsonLazyText :: Doc a -> TL.Text
dickinsonLazyText = renderLazy . smartDickinson

prettyText :: Pretty a => a -> T.Text
prettyText = dickinsonText . pretty

prettyLazyText :: Pretty a => a -> TL.Text
prettyLazyText = dickinsonLazyText . pretty