{-# LANGUAGE TupleSections #-}
{-# LANGUAGE OverloadedStrings #-}
module Text.PrettyPrint.Compact (
Doc,
module Data.Monoid, text, flush, char,
hang, hangWith, encloseSep, list, tupled, semiBraces,
(<+>), ($$), (</>), (<//>), (<$$>),
hsep, sep, hcat, vcat, cat, punctuate,
enclose, squotes, dquotes, parens, angles, braces, brackets,
lparen, rparen, langle, rangle, lbrace, rbrace, lbracket, rbracket,
squote, dquote, semi, colon, comma, space, dot, backslash, equals,
string, int, integer, float, double, rational,
bool,
renderWith,
render,
Options(..),
defaultOptions,
annotate,
) where
import Data.Monoid
import Text.PrettyPrint.Compact.Core as Text.PrettyPrint.Compact
render :: Annotation a => Doc a -> String
render :: forall a. Annotation a => Doc a -> String
render = Options a String -> ODoc a -> String
forall r a. (Monoid r, Annotation a) => Options a r -> ODoc a -> r
renderWith Options a String
forall a. Options a String
defaultOptions
defaultOptions :: Options a String
defaultOptions :: forall a. Options a String
defaultOptions = Options
{ optsAnnotate :: a -> String -> String
optsAnnotate = \a
_ String
s -> String
s
, optsPageWidth :: Int
optsPageWidth = Int
80
}
list :: Annotation a => [Doc a] -> Doc a
list :: forall a. Annotation a => [Doc a] -> Doc a
list = Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
forall a.
Annotation a =>
Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
encloseSep Doc a
forall a. Annotation a => Doc a
lbracket Doc a
forall a. Annotation a => Doc a
rbracket Doc a
forall a. Annotation a => Doc a
comma
tupled :: Annotation a => [Doc a] -> Doc a
tupled :: forall a. Annotation a => [Doc a] -> Doc a
tupled = Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
forall a.
Annotation a =>
Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
encloseSep Doc a
forall a. Annotation a => Doc a
lparen Doc a
forall a. Annotation a => Doc a
rparen Doc a
forall a. Annotation a => Doc a
comma
semiBraces :: Annotation a => [Doc a] -> Doc a
semiBraces :: forall a. Annotation a => [Doc a] -> Doc a
semiBraces = Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
forall a.
Annotation a =>
Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
encloseSep Doc a
forall a. Annotation a => Doc a
lbrace Doc a
forall a. Annotation a => Doc a
rbrace Doc a
forall a. Annotation a => Doc a
semi
encloseSep :: Annotation a => Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
encloseSep :: forall a.
Annotation a =>
Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
encloseSep Doc a
left Doc a
right Doc a
separator [Doc a]
ds
= (Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
right) (Doc a -> Doc a) -> Doc a -> Doc a
forall a b. (a -> b) -> a -> b
$ case [Doc a]
ds of
[] -> Doc a
left
[Doc a
d] -> Doc a
left Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
d
(Doc a
d:[Doc a]
ds') -> [Doc a] -> Doc a
forall a. Annotation a => [Doc a] -> Doc a
cat (Doc a
left Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
dDoc a -> [Doc a] -> [Doc a]
forall a. a -> [a] -> [a]
:(Doc a -> Doc a) -> [Doc a] -> [Doc a]
forall a b. (a -> b) -> [a] -> [b]
map (Doc a
separator Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<>) [Doc a]
ds')
punctuate :: Annotation a => Doc a -> [Doc a] -> [Doc a]
punctuate :: forall a. Annotation a => Doc a -> [Doc a] -> [Doc a]
punctuate Doc a
_p [] = []
punctuate Doc a
_p [Doc a
d] = [Doc a
d]
punctuate Doc a
p (Doc a
d:[Doc a]
ds) = (Doc a
d Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
p) Doc a -> [Doc a] -> [Doc a]
forall a. a -> [a] -> [a]
: Doc a -> [Doc a] -> [Doc a]
forall a. Annotation a => Doc a -> [Doc a] -> [Doc a]
punctuate Doc a
p [Doc a]
ds
sep :: Annotation a => [Doc a] -> Doc a
sep :: forall a. Annotation a => [Doc a] -> Doc a
sep [Doc a]
xs = String -> [(Int, Doc a)] -> Doc a
forall a. Monoid a => String -> [(Int, Doc a)] -> Doc a
groupingBy String
" " ((Doc a -> (Int, Doc a)) -> [Doc a] -> [(Int, Doc a)]
forall a b. (a -> b) -> [a] -> [b]
map (Int
0,) [Doc a]
xs)
hsep :: Annotation a => [Doc a] -> Doc a
hsep :: forall a. Annotation a => [Doc a] -> Doc a
hsep = (Doc a -> Doc a -> Doc a) -> [Doc a] -> Doc a
forall a.
Annotation a =>
(Doc a -> Doc a -> Doc a) -> [Doc a] -> Doc a
foldDoc Doc a -> Doc a -> Doc a
forall a. Annotation a => Doc a -> Doc a -> Doc a
(<+>)
cat :: Annotation a => [Doc a] -> Doc a
cat :: forall a. Annotation a => [Doc a] -> Doc a
cat [Doc a]
xs = String -> [(Int, Doc a)] -> Doc a
forall a. Monoid a => String -> [(Int, Doc a)] -> Doc a
groupingBy String
"" ((Doc a -> (Int, Doc a)) -> [Doc a] -> [(Int, Doc a)]
forall a b. (a -> b) -> [a] -> [b]
map (Int
0,) [Doc a]
xs)
hcat :: Annotation a => [Doc a] -> Doc a
hcat :: forall a. Annotation a => [Doc a] -> Doc a
hcat = (Doc a -> Doc a -> Doc a) -> [Doc a] -> Doc a
forall a.
Annotation a =>
(Doc a -> Doc a -> Doc a) -> [Doc a] -> Doc a
foldDoc Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
(<>)
vcat :: Annotation a => [Doc a] -> Doc a
vcat :: forall a. Annotation a => [Doc a] -> Doc a
vcat = (ODoc a -> ODoc a -> ODoc a) -> [ODoc a] -> ODoc a
forall a.
Annotation a =>
(Doc a -> Doc a -> Doc a) -> [Doc a] -> Doc a
foldDoc ODoc a -> ODoc a -> ODoc a
forall (d :: * -> *) a.
(Layout d, Monoid a, Semigroup (d a)) =>
d a -> d a -> d a
($$)
foldDoc :: Annotation a => (Doc a -> Doc a -> Doc a) -> [Doc a] -> Doc a
foldDoc :: forall a.
Annotation a =>
(Doc a -> Doc a -> Doc a) -> [Doc a] -> Doc a
foldDoc Doc a -> Doc a -> Doc a
_ [] = Doc a
forall a. Monoid a => a
mempty
foldDoc Doc a -> Doc a -> Doc a
f [Doc a]
ds = (Doc a -> Doc a -> Doc a) -> [Doc a] -> Doc a
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 Doc a -> Doc a -> Doc a
f [Doc a]
ds
(<+>) :: Annotation a => Doc a -> Doc a -> Doc a
Doc a
x <+> :: forall a. Annotation a => Doc a -> Doc a -> Doc a
<+> Doc a
y = Doc a
x Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
forall a. Annotation a => Doc a
space Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
y
(</>) :: Annotation a => Doc a -> Doc a -> Doc a
Doc a
x </> :: forall a. Annotation a => Doc a -> Doc a -> Doc a
</> Doc a
y = Int -> Doc a -> Doc a -> Doc a
forall a. Annotation a => Int -> Doc a -> Doc a -> Doc a
hang Int
0 Doc a
x Doc a
y
(<//>) :: Annotation a => Doc a -> Doc a -> Doc a
Doc a
x <//> :: forall a. Annotation a => Doc a -> Doc a -> Doc a
<//> Doc a
y = String -> Int -> Doc a -> Doc a -> Doc a
forall a. Annotation a => String -> Int -> Doc a -> Doc a -> Doc a
hangWith String
"" Int
0 Doc a
x Doc a
y
(<$$>) :: Annotation a => Doc a -> Doc a -> Doc a
<$$> :: forall a. Annotation a => Doc a -> Doc a -> Doc a
(<$$>) = ODoc a -> ODoc a -> ODoc a
forall (d :: * -> *) a.
(Layout d, Monoid a, Semigroup (d a)) =>
d a -> d a -> d a
($$)
squotes :: Annotation a => Doc a -> Doc a
squotes :: forall a. Annotation a => Doc a -> Doc a
squotes = Doc a -> Doc a -> Doc a -> Doc a
forall a. Annotation a => Doc a -> Doc a -> Doc a -> Doc a
enclose Doc a
forall a. Annotation a => Doc a
squote Doc a
forall a. Annotation a => Doc a
squote
dquotes :: Annotation a => Doc a -> Doc a
dquotes :: forall a. Annotation a => Doc a -> Doc a
dquotes = Doc a -> Doc a -> Doc a -> Doc a
forall a. Annotation a => Doc a -> Doc a -> Doc a -> Doc a
enclose Doc a
forall a. Annotation a => Doc a
dquote Doc a
forall a. Annotation a => Doc a
dquote
braces :: Annotation a => Doc a -> Doc a
braces :: forall a. Annotation a => Doc a -> Doc a
braces = Doc a -> Doc a -> Doc a -> Doc a
forall a. Annotation a => Doc a -> Doc a -> Doc a -> Doc a
enclose Doc a
forall a. Annotation a => Doc a
lbrace Doc a
forall a. Annotation a => Doc a
rbrace
parens :: Annotation a => Doc a -> Doc a
parens :: forall a. Annotation a => Doc a -> Doc a
parens = Doc a -> Doc a -> Doc a -> Doc a
forall a. Annotation a => Doc a -> Doc a -> Doc a -> Doc a
enclose Doc a
forall a. Annotation a => Doc a
lparen Doc a
forall a. Annotation a => Doc a
rparen
angles :: Annotation a => Doc a -> Doc a
angles :: forall a. Annotation a => Doc a -> Doc a
angles = Doc a -> Doc a -> Doc a -> Doc a
forall a. Annotation a => Doc a -> Doc a -> Doc a -> Doc a
enclose Doc a
forall a. Annotation a => Doc a
langle Doc a
forall a. Annotation a => Doc a
rangle
brackets :: Annotation a => Doc a -> Doc a
brackets :: forall a. Annotation a => Doc a -> Doc a
brackets = Doc a -> Doc a -> Doc a -> Doc a
forall a. Annotation a => Doc a -> Doc a -> Doc a -> Doc a
enclose Doc a
forall a. Annotation a => Doc a
lbracket Doc a
forall a. Annotation a => Doc a
rbracket
enclose :: Annotation a => Doc a -> Doc a -> Doc a -> Doc a
enclose :: forall a. Annotation a => Doc a -> Doc a -> Doc a -> Doc a
enclose Doc a
l Doc a
r Doc a
x = Doc a
l Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
x Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
r
char :: Annotation a => Char -> Doc a
char :: forall a. Annotation a => Char -> Doc a
char Char
x = String -> ODoc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text [Char
x]
lparen :: Annotation a => Doc a
lparen :: forall a. Annotation a => Doc a
lparen = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'('
rparen :: Annotation a => Doc a
rparen :: forall a. Annotation a => Doc a
rparen = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
')'
langle :: Annotation a => Doc a
langle :: forall a. Annotation a => Doc a
langle = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'<'
rangle :: Annotation a => Doc a
rangle :: forall a. Annotation a => Doc a
rangle = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'>'
lbrace :: Annotation a => Doc a
lbrace :: forall a. Annotation a => Doc a
lbrace = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'{'
rbrace :: Annotation a => Doc a
rbrace :: forall a. Annotation a => Doc a
rbrace = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'}'
lbracket :: Annotation a => Doc a
lbracket :: forall a. Annotation a => Doc a
lbracket = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'['
rbracket :: Annotation a => Doc a
rbracket :: forall a. Annotation a => Doc a
rbracket = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
']'
squote :: Annotation a => Doc a
squote :: forall a. Annotation a => Doc a
squote = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'\''
dquote :: Annotation a => Doc a
dquote :: forall a. Annotation a => Doc a
dquote = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'"'
semi :: Annotation a => Doc a
semi :: forall a. Annotation a => Doc a
semi = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
';'
colon :: Annotation a => Doc a
colon :: forall a. Annotation a => Doc a
colon = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
':'
comma :: Annotation a => Doc a
comma :: forall a. Annotation a => Doc a
comma = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
','
dot :: Annotation a => Doc a
dot :: forall a. Annotation a => Doc a
dot = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'.'
backslash :: Annotation a => Doc a
backslash :: forall a. Annotation a => Doc a
backslash = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'\\'
equals :: Annotation a => Doc a
equals :: forall a. Annotation a => Doc a
equals = Char -> Doc a
forall a. Annotation a => Char -> Doc a
char Char
'='
string :: Annotation a => String -> Doc a
string :: forall a. Monoid a => String -> ODoc a
string = [Doc a] -> Doc a
forall a. Annotation a => [Doc a] -> Doc a
vcat ([Doc a] -> Doc a) -> (String -> [Doc a]) -> String -> Doc a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Doc a) -> [String] -> [Doc a]
forall a b. (a -> b) -> [a] -> [b]
map String -> Doc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text ([String] -> [Doc a]) -> (String -> [String]) -> String -> [Doc a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines
bool :: Annotation a => Bool -> Doc a
bool :: forall a. Annotation a => Bool -> Doc a
bool Bool
b = String -> ODoc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text (Bool -> String
forall a. Show a => a -> String
show Bool
b)
int :: Annotation a => Int -> Doc a
int :: forall a. Annotation a => Int -> Doc a
int Int
i = String -> ODoc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text (Int -> String
forall a. Show a => a -> String
show Int
i)
integer :: Annotation a => Integer -> Doc a
integer :: forall a. Annotation a => Integer -> Doc a
integer Integer
i = String -> ODoc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text (Integer -> String
forall a. Show a => a -> String
show Integer
i)
float :: Annotation a => Float -> Doc a
float :: forall a. Annotation a => Float -> Doc a
float Float
f = String -> ODoc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text (Float -> String
forall a. Show a => a -> String
show Float
f)
double :: Annotation a => Double -> Doc a
double :: forall a. Annotation a => Double -> Doc a
double Double
d = String -> ODoc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text (Double -> String
forall a. Show a => a -> String
show Double
d)
rational :: Annotation a => Rational -> Doc a
rational :: forall a. Annotation a => Rational -> Doc a
rational Rational
r = String -> ODoc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text (Rational -> String
forall a. Show a => a -> String
show Rational
r)
hang :: Annotation a => Int -> Doc a -> Doc a -> Doc a
hang :: forall a. Annotation a => Int -> Doc a -> Doc a -> Doc a
hang = String -> Int -> Doc a -> Doc a -> Doc a
forall a. Annotation a => String -> Int -> Doc a -> Doc a -> Doc a
hangWith String
" "
hangWith :: Annotation a => String -> Int -> Doc a -> Doc a -> Doc a
hangWith :: forall a. Annotation a => String -> Int -> Doc a -> Doc a -> Doc a
hangWith String
separator Int
n Doc a
x Doc a
y = String -> [(Int, Doc a)] -> Doc a
forall a. Monoid a => String -> [(Int, Doc a)] -> Doc a
groupingBy String
separator [(Int
0,Doc a
x), (Int
n,Doc a
y)]
space :: Annotation a => Doc a
space :: forall a. Annotation a => Doc a
space = String -> ODoc a
forall a. Monoid a => String -> ODoc a
forall (d :: * -> *) a. (Layout d, Monoid a) => String -> d a
text String
" "