-- | Pretty printing with class
module GF.Text.Pretty(module GF.Text.Pretty,module PP) where
import qualified Text.PrettyPrint as PP
import Text.PrettyPrint as PP(Doc,Style(..),Mode(..),style,empty,isEmpty)

class Pretty a where
  pp :: a -> Doc
  ppList :: [a] -> Doc
  ppList = [Doc] -> Doc
forall a. Pretty a => [a] -> Doc
fsep ([Doc] -> Doc) -> ([a] -> [Doc]) -> [a] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp -- hmm

instance Pretty Doc where pp :: Doc -> Doc
pp = Doc -> Doc
forall a. a -> a
id
instance Pretty Int where pp :: Int -> Doc
pp = Int -> Doc
PP.int
instance Pretty Integer where pp :: Integer -> Doc
pp = Integer -> Doc
PP.integer
instance Pretty Float where pp :: Float -> Doc
pp = Float -> Doc
PP.float
instance Pretty Double where pp :: Double -> Doc
pp = Double -> Doc
PP.double
instance Pretty Char where pp :: Char -> Doc
pp = Char -> Doc
PP.char; ppList :: [Char] -> Doc
ppList = [Char] -> Doc
PP.text

instance Pretty a => Pretty [a] where
  pp :: [a] -> Doc
pp = [a] -> Doc
forall a. Pretty a => [a] -> Doc
ppList
  ppList :: [[a]] -> Doc
ppList = [Doc] -> Doc
forall a. Pretty a => [a] -> Doc
fsep ([Doc] -> Doc) -> ([[a]] -> [Doc]) -> [[a]] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([a] -> Doc) -> [[a]] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map [a] -> Doc
forall a. Pretty a => a -> Doc
pp -- hmm

render :: a -> [Char]
render a
x = Doc -> [Char]
PP.render (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x)
render80 :: a -> [Char]
render80 a
x = Style -> a -> [Char]
forall a. Pretty a => Style -> a -> [Char]
renderStyle Style
style{lineLength :: Int
lineLength=Int
80,ribbonsPerLine :: Float
ribbonsPerLine=Float
1} a
x
renderStyle :: Style -> a -> [Char]
renderStyle Style
s a
x = Style -> Doc -> [Char]
PP.renderStyle Style
s (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x)

infixl 5 $$,$+$
infixl 6 <>,<+>

a
x $$ :: a -> a -> Doc
$$ a
y = a -> Doc
forall a. Pretty a => a -> Doc
pp a
x Doc -> Doc -> Doc
PP.$$ a -> Doc
forall a. Pretty a => a -> Doc
pp a
y
a
x $+$ :: a -> a -> Doc
$+$ a
y = a -> Doc
forall a. Pretty a => a -> Doc
pp a
x Doc -> Doc -> Doc
PP.$+$ a -> Doc
forall a. Pretty a => a -> Doc
pp a
y
a
x <+> :: a -> a -> Doc
<+> a
y = a -> Doc
forall a. Pretty a => a -> Doc
pp a
x Doc -> Doc -> Doc
PP.<+> a -> Doc
forall a. Pretty a => a -> Doc
pp a
y
a
x <> :: a -> a -> Doc
<> a
y = a -> Doc
forall a. Pretty a => a -> Doc
pp a
x Doc -> Doc -> Doc
PP.<> a -> Doc
forall a. Pretty a => a -> Doc
pp a
y

braces :: a -> Doc
braces a
x = Doc -> Doc
PP.braces (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x)
brackets :: a -> Doc
brackets a
x = Doc -> Doc
PP.brackets (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x)
cat :: [a] -> Doc
cat [a]
xs = [Doc] -> Doc
PP.cat ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp [a]
xs)
doubleQuotes :: a -> Doc
doubleQuotes a
x = Doc -> Doc
PP.doubleQuotes (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x)
fcat :: [a] -> Doc
fcat [a]
xs = [Doc] -> Doc
PP.fcat ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp [a]
xs)
fsep :: [a] -> Doc
fsep [a]
xs = [Doc] -> Doc
PP.fsep ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp [a]
xs)
hang :: a -> Int -> a -> Doc
hang a
x Int
d a
y = Doc -> Int -> Doc -> Doc
PP.hang (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x) Int
d (a -> Doc
forall a. Pretty a => a -> Doc
pp a
y)
hcat :: [a] -> Doc
hcat [a]
xs = [Doc] -> Doc
PP.hcat ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp [a]
xs)
hsep :: [a] -> Doc
hsep [a]
xs = [Doc] -> Doc
PP.hsep ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp [a]
xs)
nest :: Int -> a -> Doc
nest Int
d a
x = Int -> Doc -> Doc
PP.nest Int
d (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x)
parens :: a -> Doc
parens a
x = Doc -> Doc
PP.parens (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x)
punctuate :: a -> [a] -> [Doc]
punctuate a
x [a]
ys = Doc -> [Doc] -> [Doc]
PP.punctuate (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x) ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp [a]
ys)
quotes :: a -> Doc
quotes a
x = Doc -> Doc
PP.quotes (a -> Doc
forall a. Pretty a => a -> Doc
pp a
x)
sep :: [a] -> Doc
sep [a]
xs = [Doc] -> Doc
PP.sep ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp [a]
xs)
vcat :: [a] -> Doc
vcat [a]
xs = [Doc] -> Doc
PP.vcat ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pp [a]
xs)