{-# LANGUAGE Trustworthy #-}
module ReWire.Pretty
      ( ($$), text, int, empty, P.Pretty (pretty), P.Doc
      , prettyPrint, prettyPrint'
      , fastPrint, fastPrint'
      , TextShow (showt, showb, showbPrec), fromString, fromText
      , genericShowbPrec, P.space, P.angles, P.dot, P.line, P.softline
      , (P.<>), (P.<+>), P.nest, P.defaultLayoutOptions, P.layoutSmart, P.renderStrict
      , P.vsep, P.hsep, P.parens, P.braces, P.punctuate, P.comma, P.squote, P.dquote, P.dquotes, P.tupled
      , P.brackets, FromGeneric (..), P.semi, P.colon, P.hcat, P.align, braced
      ) where

import Prelude hiding ((<>), lines, unlines)

import qualified Prettyprinter as P
import qualified Prettyprinter.Render.Text as P
import Data.Text (Text)
import TextShow (TextShow (showt, showb, showbPrec), fromString, fromText)
import TextShow.Generic (genericShowbPrec, FromGeneric (..))

($$) :: P.Doc ann -> P.Doc ann -> P.Doc ann
Doc ann
a $$ :: forall ann. Doc ann -> Doc ann -> Doc ann
$$ Doc ann
b = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
P.vsep [Doc ann
a, Doc ann
b]

infixl 5 $$

text :: Text -> P.Doc ann
text :: forall ann. Text -> Doc ann
text = Text -> Doc ann
forall ann. Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
P.pretty

int :: Int -> P.Doc ann
int :: forall ann. Int -> Doc ann
int = Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
P.pretty

empty :: P.Doc ann
empty :: forall ann. Doc ann
empty = Doc ann
forall ann. Doc ann
P.emptyDoc

braced :: [P.Doc ann] -> P.Doc ann
braced :: forall ann. [Doc ann] -> Doc ann
braced = Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
P.encloseSep Doc ann
forall ann. Doc ann
P.lbrace Doc ann
forall ann. Doc ann
P.rbrace (Doc ann
forall ann. Doc ann
P.comma Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
P.<> Doc ann
forall ann. Doc ann
P.space)

layoutOptions :: P.LayoutOptions
layoutOptions :: LayoutOptions
layoutOptions = LayoutOptions
P.defaultLayoutOptions { P.layoutPageWidth = P.AvailablePerLine 120 1.0 }

prettyPrint :: P.Pretty a => a -> Text
prettyPrint :: forall a. Pretty a => a -> Text
prettyPrint = Doc (ZonkAny 0) -> Text
forall ann. Doc ann -> Text
prettyPrint' (Doc (ZonkAny 0) -> Text) -> (a -> Doc (ZonkAny 0)) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Doc (ZonkAny 0)
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
P.pretty

prettyPrint' :: P.Doc ann -> Text
prettyPrint' :: forall ann. Doc ann -> Text
prettyPrint' = SimpleDocStream ann -> Text
forall ann. SimpleDocStream ann -> Text
P.renderStrict (SimpleDocStream ann -> Text)
-> (Doc ann -> SimpleDocStream ann) -> Doc ann -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LayoutOptions -> Doc ann -> SimpleDocStream ann
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
P.layoutSmart LayoutOptions
layoutOptions

fastPrint :: P.Pretty a => a -> Text
fastPrint :: forall a. Pretty a => a -> Text
fastPrint = Doc (ZonkAny 1) -> Text
forall ann. Doc ann -> Text
fastPrint' (Doc (ZonkAny 1) -> Text) -> (a -> Doc (ZonkAny 1)) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Doc (ZonkAny 1)
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
P.pretty

-- | Performance-wise, in theory: P.layoutCompact > P.layoutPretty > P.layoutSmart
fastPrint' :: P.Doc ann -> Text
fastPrint' :: forall ann. Doc ann -> Text
fastPrint' = SimpleDocStream ann -> Text
forall ann. SimpleDocStream ann -> Text
P.renderStrict (SimpleDocStream ann -> Text)
-> (Doc ann -> SimpleDocStream ann) -> Doc ann -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LayoutOptions -> Doc ann -> SimpleDocStream ann
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
P.layoutPretty LayoutOptions
layoutOptions