{-# language NoMonomorphismRestriction #-}

module TPDB.Pretty

( Doc, Pretty (..)
, render, renderWide, renderCompact, renderPretty
, displayIO
, fsep, sep, hsep, vsep, vcat, hcat
, parens, brackets, angles, braces, enclose
, encloseSep, punctuate, comma, nest, list, tupled
  , module Data.Monoid, empty
, text
, (<+>), ($$)
, indent, nest, hang
)

where

import Data.Text.Prettyprint.Doc
  ( Doc, Pretty(..), comma
  , punctuate, encloseSep, align, parens, braces, angles, brackets, nest, enclose
  , list, tupled
  , indent, nest, hang
  )
import qualified Data.Text.Prettyprint.Doc as D
import qualified Data.Text.Prettyprint.Doc.Render.Text as T

import Data.String ( fromString )
import Data.Monoid (mempty, (<>))

empty :: Doc ann 
empty :: Doc ann
empty = Doc ann
forall a. Monoid a => a
mempty

-- class Pretty a where pretty :: a -> Doc

Doc ann
x $$ :: Doc ann -> Doc ann -> Doc ann
$$ Doc ann
y = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
D.vcat [Doc ann
x,Doc ann
y]
Doc ann
x <+> :: Doc ann -> Doc ann -> Doc ann
<+> Doc ann
y = Doc ann
x Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
D.<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align Doc ann
y
vcat :: [Doc ann] -> Doc ann
vcat = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann)
-> ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
D.vcat
hcat :: [Doc ann] -> Doc ann
hcat = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann)
-> ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
D.hcat
vsep :: [Doc ann] -> Doc ann
vsep = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann)
-> ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
D.vsep
hsep :: [Doc ann] -> Doc ann
hsep = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann)
-> ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
D.hsep
fsep :: [Doc ann] -> Doc ann
fsep = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann)
-> ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
D.fillSep
sep :: [Doc ann] -> Doc ann
sep = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann)
-> ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
D.sep

render :: Doc ann -> Text
render = SimpleDocStream ann -> Text
forall ann. SimpleDocStream ann -> Text
T.renderLazy (SimpleDocStream ann -> Text)
-> (Doc ann -> SimpleDocStream ann) -> Doc ann -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> SimpleDocStream ann
forall ann. Doc ann -> SimpleDocStream ann
renderPretty

renderPretty :: Doc ann -> SimpleDocStream ann
renderPretty = LayoutOptions -> Doc ann -> SimpleDocStream ann
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
D.layoutPretty LayoutOptions
D.defaultLayoutOptions
renderCompact :: Doc ann1 -> SimpleDocStream ann2
renderCompact = Doc ann1 -> SimpleDocStream ann2
forall ann1 ann2. Doc ann1 -> SimpleDocStream ann2
D.layoutCompact
renderWide :: Doc ann -> SimpleDocStream ann
renderWide = LayoutOptions -> Doc ann -> SimpleDocStream ann
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
D.layoutSmart (LayoutOptions -> Doc ann -> SimpleDocStream ann)
-> LayoutOptions -> Doc ann -> SimpleDocStream ann
forall a b. (a -> b) -> a -> b
$ LayoutOptions :: PageWidth -> LayoutOptions
D.LayoutOptions { layoutPageWidth :: PageWidth
D.layoutPageWidth = PageWidth
D.Unbounded }
displayIO :: Handle -> SimpleDocStream ann -> IO ()
displayIO = Handle -> SimpleDocStream ann -> IO ()
forall ann. Handle -> SimpleDocStream ann -> IO ()
T.renderIO


text :: String -> D.Doc ann
text :: String -> Doc ann
text = String -> Doc ann
forall a. IsString a => String -> a
fromString

instance ( Pretty a, Pretty b, Pretty c, Pretty d ) => Pretty (a,b,c,d) where
    pretty :: (a, b, c, d) -> Doc ann
pretty (a
x,b
y,c
z,d
u) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
fsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [ a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
x, b -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty b
y, c -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty c
z, d -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty d
u ]

-- | WARNING: there is  instance Pretty a => Pretty (Maybe a) in the back-end
-- but its spec is "Ignore Nothings, print Just contents"

instance ( Pretty a, Pretty b ) => Pretty (Either a b) where
    pretty :: Either a b -> Doc ann
pretty (Left a
x) = String -> Doc ann
forall ann. String -> Doc ann
text String
"Left" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
x)
    pretty (Right b
x) = String -> Doc ann
forall ann. String -> Doc ann
text String
"Right" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (b -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty b
x)