module Text.PrettyPrint.Annotated.WL (
Doc(..), putDoc, hPutDoc
, char, text, nest, line, linebreak, group, softline
, softbreak, hardline, flatAlt, flatten
, annotate, noAnnotate, docMapAnn
, simpleDocMapAnn, simpleDocScanAnn
, align, hang, indent, encloseSep, list, tupled, semiBraces
, (<+>), (</>), (<//>), (<#>), (<##>)
, hsep, vsep, fillSep, sep, hcat, vcat, fillCat, cat, punctuate
, fill, fillBreak
, enclose, squotes, dquotes, parens, angles, braces, brackets
, lparen, rparen, langle, rangle, lbrace, rbrace, lbracket, rbracket
, squote, dquote, semi, colon, comma, space, dot, backslash, equals
, Pretty(..)
, SimpleDoc(..), renderPrettyDefault, renderPretty, renderCompact, renderSmart
, display, displayS, displayT, displayIO, displayDecoratedA, displayDecorated
, SpanList, displaySpans
, column, nesting, width, columns, ribbon
, mempty, (<>)
) where
import Data.Foldable hiding (fold)
import Data.Traversable
import Data.Int
import Data.Word
import Data.Bifunctor
import Data.Functor.Identity
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Builder as TL
import Data.List.NonEmpty (NonEmpty)
import Numeric.Natural (Natural)
import Control.Applicative
import Data.Sequence (Seq)
import Data.Semigroup
import System.IO (Handle,hPutStr,stdout)
import Control.DeepSeq (NFData)
import GHC.Generics (Generic)
import Data.String (IsString(..))
infixr 5 </>, <//>, <#>, <##>
infixr 6 <+>
list :: Foldable f => f (Doc a) -> Doc a
list :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
list = forall (f :: * -> *) a.
Foldable f =>
Doc a -> Doc a -> Doc a -> f (Doc a) -> Doc a
encloseSep forall a. Doc a
lbracket forall a. Doc a
rbracket forall a. Doc a
comma
tupled :: Foldable f => f (Doc a) -> Doc a
tupled :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
tupled = forall (f :: * -> *) a.
Foldable f =>
Doc a -> Doc a -> Doc a -> f (Doc a) -> Doc a
encloseSep forall a. Doc a
lparen forall a. Doc a
rparen forall a. Doc a
comma
(<+>) :: Doc a -> Doc a -> Doc a
Doc a
x <+> :: forall a. Doc a -> Doc a -> Doc a
<+> Doc a
y = Doc a
x forall a. Semigroup a => a -> a -> a
<> forall a. Doc a
space forall a. Semigroup a => a -> a -> a
<> Doc a
y
semiBraces :: Foldable f => f (Doc a) -> Doc a
semiBraces :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
semiBraces = forall (f :: * -> *) a.
Foldable f =>
Doc a -> Doc a -> Doc a -> f (Doc a) -> Doc a
encloseSep forall a. Doc a
lbrace forall a. Doc a
rbrace forall a. Doc a
semi
encloseSep :: Foldable f => Doc a -> Doc a -> Doc a -> f (Doc a) -> Doc a
encloseSep :: forall (f :: * -> *) a.
Foldable f =>
Doc a -> Doc a -> Doc a -> f (Doc a) -> Doc a
encloseSep Doc a
left Doc a
right Doc a
sp f (Doc a)
ds0
= case forall (t :: * -> *) a. Foldable t => t a -> [a]
toList f (Doc a)
ds0 of
[] -> Doc a
left forall a. Semigroup a => a -> a -> a
<> Doc a
right
[Doc a
d] -> Doc a
left forall a. Semigroup a => a -> a -> a
<> Doc a
d forall a. Semigroup a => a -> a -> a
<> Doc a
right
[Doc a]
ds -> forall a. Doc a -> Doc a
group forall a b. (a -> b) -> a -> b
$ forall a. Doc a -> Doc a
align forall a b. (a -> b) -> a -> b
$ Doc a
left'
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
vcat (forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Semigroup a => a -> a -> a
(<>) (forall a. Monoid a => a
mempty forall a. a -> [a] -> [a]
: forall a. a -> [a]
repeat (Doc a
sp forall a. Semigroup a => a -> a -> a
<> forall a. Doc a
space)) [Doc a]
ds)
forall a. Semigroup a => a -> a -> a
<> Doc a
right'
where left' :: Doc a
left' = Doc a
left forall a. Semigroup a => a -> a -> a
<> forall a. Doc a -> Doc a -> Doc a
flatAlt forall a. Doc a
space forall a. Monoid a => a
mempty
right' :: Doc a
right' = forall a. Doc a -> Doc a -> Doc a
flatAlt forall a. Doc a
space forall a. Monoid a => a
mempty forall a. Semigroup a => a -> a -> a
<> Doc a
right
punctuate :: Traversable f => Doc a -> f (Doc a) -> f (Doc a)
punctuate :: forall (f :: * -> *) a.
Traversable f =>
Doc a -> f (Doc a) -> f (Doc a)
punctuate Doc a
p f (Doc a)
xs = forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL (\(Doc a
d:[Doc a]
ds) Doc a
_ -> ([Doc a]
ds, if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Doc a]
ds then Doc a
d else Doc a
d forall a. Semigroup a => a -> a -> a
<> Doc a
p)) (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList f (Doc a)
xs) f (Doc a)
xs
sep :: Foldable f => f (Doc a) -> Doc a
sep :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
sep = forall a. Doc a -> Doc a
group forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
vsep
fillSep :: Foldable f => f (Doc a) -> Doc a
fillSep :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
fillSep = forall (f :: * -> *) a.
Foldable f =>
(Doc a -> Doc a -> Doc a) -> f (Doc a) -> Doc a
fold forall a. Doc a -> Doc a -> Doc a
(</>)
hsep :: Foldable f => f (Doc a) -> Doc a
hsep :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
hsep = forall (f :: * -> *) a.
Foldable f =>
(Doc a -> Doc a -> Doc a) -> f (Doc a) -> Doc a
fold forall a. Doc a -> Doc a -> Doc a
(<+>)
vsep :: Foldable f => f (Doc a) -> Doc a
vsep :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
vsep = forall (f :: * -> *) a.
Foldable f =>
(Doc a -> Doc a -> Doc a) -> f (Doc a) -> Doc a
fold forall a. Doc a -> Doc a -> Doc a
(<#>)
cat :: Foldable f => f (Doc a) -> Doc a
cat :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
cat = forall a. Doc a -> Doc a
group forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
vcat
fillCat :: Foldable f => f (Doc a) -> Doc a
fillCat :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
fillCat = forall (f :: * -> *) a.
Foldable f =>
(Doc a -> Doc a -> Doc a) -> f (Doc a) -> Doc a
fold forall a. Doc a -> Doc a -> Doc a
(<//>)
hcat :: Foldable f => f (Doc a) -> Doc a
hcat :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
hcat = forall (f :: * -> *) a.
Foldable f =>
(Doc a -> Doc a -> Doc a) -> f (Doc a) -> Doc a
fold forall a. Semigroup a => a -> a -> a
(<>)
vcat :: Foldable f => f (Doc a) -> Doc a
vcat :: forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
vcat = forall (f :: * -> *) a.
Foldable f =>
(Doc a -> Doc a -> Doc a) -> f (Doc a) -> Doc a
fold forall a. Doc a -> Doc a -> Doc a
(<##>)
fold :: Foldable f => (Doc a -> Doc a -> Doc a) -> f (Doc a) -> Doc a
fold :: forall (f :: * -> *) a.
Foldable f =>
(Doc a -> Doc a -> Doc a) -> f (Doc a) -> Doc a
fold Doc a -> Doc a -> Doc a
f f (Doc a)
xs | forall (t :: * -> *) a. Foldable t => t a -> Bool
null f (Doc a)
xs = forall a. Monoid a => a
mempty
| Bool
otherwise = forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 Doc a -> Doc a -> Doc a
f f (Doc a)
xs
instance Semigroup (Doc a) where
<> :: Doc a -> Doc a -> Doc a
(<>) = forall a. Doc a -> Doc a -> Doc a
Cat
instance Monoid (Doc a) where
mappend :: Doc a -> Doc a -> Doc a
mappend = forall a. Doc a -> Doc a -> Doc a
Cat
mempty :: Doc a
mempty = forall a. Doc a
Empty
mconcat :: [Doc a] -> Doc a
mconcat = forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
hcat
(</>) :: Doc a -> Doc a -> Doc a
Doc a
x </> :: forall a. Doc a -> Doc a -> Doc a
</> Doc a
y = Doc a
x forall a. Semigroup a => a -> a -> a
<> forall a. Doc a
softline forall a. Semigroup a => a -> a -> a
<> Doc a
y
(<//>) :: Doc a -> Doc a -> Doc a
Doc a
x <//> :: forall a. Doc a -> Doc a -> Doc a
<//> Doc a
y = Doc a
x forall a. Semigroup a => a -> a -> a
<> forall a. Doc a
softbreak forall a. Semigroup a => a -> a -> a
<> Doc a
y
(<#>) :: Doc a -> Doc a -> Doc a
Doc a
x <#> :: forall a. Doc a -> Doc a -> Doc a
<#> Doc a
y = Doc a
x forall a. Semigroup a => a -> a -> a
<> forall a. Doc a
line forall a. Semigroup a => a -> a -> a
<> Doc a
y
(<##>) :: Doc a -> Doc a -> Doc a
Doc a
x <##> :: forall a. Doc a -> Doc a -> Doc a
<##> Doc a
y = Doc a
x forall a. Semigroup a => a -> a -> a
<> forall a. Doc a
linebreak forall a. Semigroup a => a -> a -> a
<> Doc a
y
softline :: Doc a
softline :: forall a. Doc a
softline = forall a. Doc a -> Doc a
group forall a. Doc a
line
softbreak :: Doc a
softbreak :: forall a. Doc a
softbreak = forall a. Doc a -> Doc a
group forall a. Doc a
linebreak
squotes :: Doc a -> Doc a
squotes :: forall a. Doc a -> Doc a
squotes = forall a. Doc a -> Doc a -> Doc a -> Doc a
enclose forall a. Doc a
squote forall a. Doc a
squote
dquotes :: Doc a -> Doc a
dquotes :: forall a. Doc a -> Doc a
dquotes = forall a. Doc a -> Doc a -> Doc a -> Doc a
enclose forall a. Doc a
dquote forall a. Doc a
dquote
braces :: Doc a -> Doc a
braces :: forall a. Doc a -> Doc a
braces = forall a. Doc a -> Doc a -> Doc a -> Doc a
enclose forall a. Doc a
lbrace forall a. Doc a
rbrace
parens :: Doc a -> Doc a
parens :: forall a. Doc a -> Doc a
parens = forall a. Doc a -> Doc a -> Doc a -> Doc a
enclose forall a. Doc a
lparen forall a. Doc a
rparen
angles :: Doc a -> Doc a
angles :: forall a. Doc a -> Doc a
angles = forall a. Doc a -> Doc a -> Doc a -> Doc a
enclose forall a. Doc a
langle forall a. Doc a
rangle
brackets :: Doc a -> Doc a
brackets :: forall a. Doc a -> Doc a
brackets = forall a. Doc a -> Doc a -> Doc a -> Doc a
enclose forall a. Doc a
lbracket forall a. Doc a
rbracket
enclose :: Doc a -> Doc a -> Doc a -> Doc a
enclose :: forall a. Doc a -> Doc a -> Doc a -> Doc a
enclose Doc a
l Doc a
r Doc a
x = Doc a
l forall a. Semigroup a => a -> a -> a
<> Doc a
x forall a. Semigroup a => a -> a -> a
<> Doc a
r
lparen :: Doc a
lparen :: forall a. Doc a
lparen = forall a. Char -> Doc a
char Char
'('
rparen :: Doc a
rparen :: forall a. Doc a
rparen = forall a. Char -> Doc a
char Char
')'
langle :: Doc a
langle :: forall a. Doc a
langle = forall a. Char -> Doc a
char Char
'<'
rangle :: Doc a
rangle :: forall a. Doc a
rangle = forall a. Char -> Doc a
char Char
'>'
lbrace :: Doc a
lbrace :: forall a. Doc a
lbrace = forall a. Char -> Doc a
char Char
'{'
rbrace :: Doc a
rbrace :: forall a. Doc a
rbrace = forall a. Char -> Doc a
char Char
'}'
lbracket :: Doc a
lbracket :: forall a. Doc a
lbracket = forall a. Char -> Doc a
char Char
'['
rbracket :: Doc a
rbracket :: forall a. Doc a
rbracket = forall a. Char -> Doc a
char Char
']'
squote :: Doc a
squote :: forall a. Doc a
squote = forall a. Char -> Doc a
char Char
'\''
dquote :: Doc a
dquote :: forall a. Doc a
dquote = forall a. Char -> Doc a
char Char
'"'
semi :: Doc a
semi :: forall a. Doc a
semi = forall a. Char -> Doc a
char Char
';'
colon :: Doc a
colon :: forall a. Doc a
colon = forall a. Char -> Doc a
char Char
':'
comma :: Doc a
comma :: forall a. Doc a
comma = forall a. Char -> Doc a
char Char
','
space :: Doc a
space :: forall a. Doc a
space = forall a. Char -> Doc a
char Char
' '
dot :: Doc a
dot :: forall a. Doc a
dot = forall a. Char -> Doc a
char Char
'.'
backslash :: Doc a
backslash :: forall a. Doc a
backslash = forall a. Char -> Doc a
char Char
'\\'
equals :: Doc a
equals :: forall a. Doc a
equals = forall a. Char -> Doc a
char Char
'='
docMapAnn :: (a -> Doc a' -> Doc a') -> Doc a -> Doc a'
docMapAnn :: forall a a'. (a -> Doc a' -> Doc a') -> Doc a -> Doc a'
docMapAnn a -> Doc a' -> Doc a'
an = Doc a -> Doc a'
go
where
go :: Doc a -> Doc a'
go Doc a
Empty = forall a. Doc a
Empty
go (Char Char
x) = forall a. Char -> Doc a
Char Char
x
go (Text Int
i String
s) = forall a. Int -> String -> Doc a
Text Int
i String
s
go Doc a
Line = forall a. Doc a
Line
go (FlatAlt Doc a
l Doc a
r) = forall a. Doc a -> Doc a -> Doc a
FlatAlt (Doc a -> Doc a'
go Doc a
l) (Doc a -> Doc a'
go Doc a
r)
go (Cat Doc a
l Doc a
r) = forall a. Doc a -> Doc a -> Doc a
Cat (Doc a -> Doc a'
go Doc a
l) (Doc a -> Doc a'
go Doc a
r)
go (Nest Int
i Doc a
d) = forall a. Int -> Doc a -> Doc a
Nest Int
i (Doc a -> Doc a'
go Doc a
d)
go (Union Doc a
l Doc a
r) = forall a. Doc a -> Doc a -> Doc a
Union (Doc a -> Doc a'
go Doc a
l) (Doc a -> Doc a'
go Doc a
r)
go (Annotate a
a Doc a
d) = a -> Doc a' -> Doc a'
an a
a (Doc a -> Doc a'
go Doc a
d)
go (Column Int -> Doc a
f) = forall a. (Int -> Doc a) -> Doc a
Column (Doc a -> Doc a'
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Doc a
f)
go (Nesting Int -> Doc a
k) = forall a. (Int -> Doc a) -> Doc a
Nesting (Doc a -> Doc a'
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Doc a
k)
go (Columns Maybe Int -> Doc a
k) = forall a. (Maybe Int -> Doc a) -> Doc a
Columns (Doc a -> Doc a'
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Int -> Doc a
k)
go (Ribbon Maybe Int -> Doc a
k) = forall a. (Maybe Int -> Doc a) -> Doc a
Ribbon (Doc a -> Doc a'
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Int -> Doc a
k)
instance IsString (Doc a) where
fromString :: String -> Doc a
fromString = forall a b. Pretty a => a -> Doc b
pretty
class Pretty a where
pretty :: a -> Doc b
prettyList :: [a] -> Doc b
prettyList = forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
list forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a b. Pretty a => a -> Doc b
pretty
default pretty :: Show a => a -> Doc b
pretty = forall a. String -> Doc a
text forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> String
show
instance Pretty (Doc a) where
pretty :: forall b. Doc a -> Doc b
pretty = forall a b. Doc a -> Doc b
noAnnotate
instance Pretty a => Pretty [a] where
pretty :: forall b. [a] -> Doc b
pretty = forall a b. Pretty a => [a] -> Doc b
prettyList
instance Pretty T.Text where
pretty :: forall b. Text -> Doc b
pretty = forall a b. Pretty a => a -> Doc b
pretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
instance Pretty TL.Text where
pretty :: forall b. Text -> Doc b
pretty = forall a b. Pretty a => a -> Doc b
pretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
TL.unpack
instance Pretty () where
pretty :: forall b. () -> Doc b
pretty () = forall a. String -> Doc a
text String
"()"
instance Pretty Char where
pretty :: forall a. Char -> Doc a
pretty = forall a. Char -> Doc a
char
prettyList :: forall a. String -> Doc a
prettyList String
"" = forall a. Monoid a => a
mempty
prettyList (Char
'\n':String
s) = forall a. Doc a
line forall a. Semigroup a => a -> a -> a
<> forall a b. Pretty a => [a] -> Doc b
prettyList String
s
prettyList String
s = let (String
xs,String
ys) = forall a. (a -> Bool) -> [a] -> ([a], [a])
span (forall a. Eq a => a -> a -> Bool
/=Char
'\n') String
s in forall a. String -> Doc a
text String
xs forall a. Semigroup a => a -> a -> a
<> forall a b. Pretty a => [a] -> Doc b
prettyList String
ys
instance Pretty a => Pretty (Seq a) where
pretty :: forall b. Seq a -> Doc b
pretty = forall a b. Pretty a => [a] -> Doc b
prettyList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> [a]
toList
instance Pretty a => Pretty (NonEmpty a) where
pretty :: forall b. NonEmpty a -> Doc b
pretty = forall a b. Pretty a => [a] -> Doc b
prettyList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> [a]
toList
instance (Pretty a, Pretty b) => Pretty (a,b) where
pretty :: forall b. (a, b) -> Doc b
pretty (a
x, b
y) = forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
tupled [forall a b. Pretty a => a -> Doc b
pretty a
x, forall a b. Pretty a => a -> Doc b
pretty b
y]
instance (Pretty a, Pretty b, Pretty c) => Pretty (a,b,c) where
pretty :: forall b. (a, b, c) -> Doc b
pretty (a
x, b
y, c
z) = forall (f :: * -> *) a. Foldable f => f (Doc a) -> Doc a
tupled [forall a b. Pretty a => a -> Doc b
pretty a
x, forall a b. Pretty a => a -> Doc b
pretty b
y, forall a b. Pretty a => a -> Doc b
pretty c
z]
instance Pretty a => Pretty (Maybe a) where
pretty :: forall b. Maybe a -> Doc b
pretty = forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty forall a b. Pretty a => a -> Doc b
pretty
instance Pretty Bool
instance Pretty Int
instance Pretty Int8
instance Pretty Int16
instance Pretty Int32
instance Pretty Int64
instance Pretty Word
instance Pretty Word8
instance Pretty Word16
instance Pretty Word32
instance Pretty Word64
instance Pretty Integer
instance Pretty Natural
instance Pretty Float
instance Pretty Double
instance Pretty Rational
fillBreak :: Int -> Doc a -> Doc a
fillBreak :: forall a. Int -> Doc a -> Doc a
fillBreak Int
f Doc a
x = forall a. Doc a -> (Int -> Doc a) -> Doc a
width Doc a
x forall a b. (a -> b) -> a -> b
$ \Int
w ->
if Int
w forall a. Ord a => a -> a -> Bool
> Int
f then forall a. Int -> Doc a -> Doc a
nest Int
f forall a. Doc a
linebreak
else forall a. String -> Doc a
text (Int -> String
spaces (Int
f forall a. Num a => a -> a -> a
- Int
w))
fill :: Int -> Doc a -> Doc a
fill :: forall a. Int -> Doc a -> Doc a
fill Int
f Doc a
d = forall a. Doc a -> (Int -> Doc a) -> Doc a
width Doc a
d forall a b. (a -> b) -> a -> b
$ \Int
w ->
if Int
w forall a. Ord a => a -> a -> Bool
>= Int
f
then forall a. Monoid a => a
mempty
else forall a. String -> Doc a
text (Int -> String
spaces (Int
f forall a. Num a => a -> a -> a
- Int
w))
width :: Doc a -> (Int -> Doc a) -> Doc a
width :: forall a. Doc a -> (Int -> Doc a) -> Doc a
width Doc a
d Int -> Doc a
f = forall a. (Int -> Doc a) -> Doc a
column (\Int
k1 -> Doc a
d forall a. Semigroup a => a -> a -> a
<> forall a. (Int -> Doc a) -> Doc a
column (\Int
k2 -> Int -> Doc a
f (Int
k2 forall a. Num a => a -> a -> a
- Int
k1)))
indent :: Int -> Doc a -> Doc a
indent :: forall a. Int -> Doc a -> Doc a
indent Int
i Doc a
d = forall a. Int -> Doc a -> Doc a
hang Int
i (forall a. String -> Doc a
text (Int -> String
spaces Int
i) forall a. Semigroup a => a -> a -> a
<> Doc a
d)
hang :: Int -> Doc a -> Doc a
hang :: forall a. Int -> Doc a -> Doc a
hang Int
i Doc a
d = forall a. Doc a -> Doc a
align (forall a. Int -> Doc a -> Doc a
nest Int
i Doc a
d)
align :: Doc a -> Doc a
align :: forall a. Doc a -> Doc a
align Doc a
d = forall a. (Int -> Doc a) -> Doc a
column forall a b. (a -> b) -> a -> b
$ \Int
k ->
forall a. (Int -> Doc a) -> Doc a
nesting forall a b. (a -> b) -> a -> b
$ \Int
i -> forall a. Int -> Doc a -> Doc a
nest (Int
k forall a. Num a => a -> a -> a
- Int
i) Doc a
d
data Doc a
= Empty
| Char {-# UNPACK #-} !Char
| Text {-# UNPACK #-} !Int String
| Line
| FlatAlt (Doc a) (Doc a)
| Cat (Doc a) (Doc a)
| Nest {-# UNPACK #-} !Int (Doc a)
| Union (Doc a) (Doc a)
| Annotate a (Doc a)
| Column (Int -> Doc a)
| Nesting (Int -> Doc a)
| Columns (Maybe Int -> Doc a)
| Ribbon (Maybe Int -> Doc a)
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Doc a) x -> Doc a
forall a x. Doc a -> Rep (Doc a) x
$cto :: forall a x. Rep (Doc a) x -> Doc a
$cfrom :: forall a x. Doc a -> Rep (Doc a) x
Generic, forall a b. a -> Doc b -> Doc a
forall a b. (a -> b) -> Doc a -> Doc b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Doc b -> Doc a
$c<$ :: forall a b. a -> Doc b -> Doc a
fmap :: forall a b. (a -> b) -> Doc a -> Doc b
$cfmap :: forall a b. (a -> b) -> Doc a -> Doc b
Functor)
instance NFData a => NFData (Doc a)
annotate :: a -> Doc a -> Doc a
annotate :: forall a. a -> Doc a -> Doc a
annotate = forall a. a -> Doc a -> Doc a
Annotate
noAnnotate :: Doc a -> Doc a'
noAnnotate :: forall a b. Doc a -> Doc b
noAnnotate = forall a a'. (a -> Doc a' -> Doc a') -> Doc a -> Doc a'
docMapAnn forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> a
const forall a. a -> a
id
data SimpleDoc a
= SEmpty
| SChar {-# UNPACK #-} !Char (SimpleDoc a)
| SText {-# UNPACK #-} !Int String (SimpleDoc a)
| SLine {-# UNPACK #-} !Int (SimpleDoc a)
| SPushAnn a (SimpleDoc a)
| SPopAnn a (SimpleDoc a)
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (SimpleDoc a) x -> SimpleDoc a
forall a x. SimpleDoc a -> Rep (SimpleDoc a) x
$cto :: forall a x. Rep (SimpleDoc a) x -> SimpleDoc a
$cfrom :: forall a x. SimpleDoc a -> Rep (SimpleDoc a) x
Generic, forall a b. a -> SimpleDoc b -> SimpleDoc a
forall a b. (a -> b) -> SimpleDoc a -> SimpleDoc b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> SimpleDoc b -> SimpleDoc a
$c<$ :: forall a b. a -> SimpleDoc b -> SimpleDoc a
fmap :: forall a b. (a -> b) -> SimpleDoc a -> SimpleDoc b
$cfmap :: forall a b. (a -> b) -> SimpleDoc a -> SimpleDoc b
Functor, forall a. Eq a => a -> SimpleDoc a -> Bool
forall a. Num a => SimpleDoc a -> a
forall a. Ord a => SimpleDoc a -> a
forall m. Monoid m => SimpleDoc m -> m
forall a. SimpleDoc a -> Bool
forall a. SimpleDoc a -> Int
forall a. SimpleDoc a -> [a]
forall a. (a -> a -> a) -> SimpleDoc a -> a
forall m a. Monoid m => (a -> m) -> SimpleDoc a -> m
forall b a. (b -> a -> b) -> b -> SimpleDoc a -> b
forall a b. (a -> b -> b) -> b -> SimpleDoc a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: forall a. Num a => SimpleDoc a -> a
$cproduct :: forall a. Num a => SimpleDoc a -> a
sum :: forall a. Num a => SimpleDoc a -> a
$csum :: forall a. Num a => SimpleDoc a -> a
minimum :: forall a. Ord a => SimpleDoc a -> a
$cminimum :: forall a. Ord a => SimpleDoc a -> a
maximum :: forall a. Ord a => SimpleDoc a -> a
$cmaximum :: forall a. Ord a => SimpleDoc a -> a
elem :: forall a. Eq a => a -> SimpleDoc a -> Bool
$celem :: forall a. Eq a => a -> SimpleDoc a -> Bool
length :: forall a. SimpleDoc a -> Int
$clength :: forall a. SimpleDoc a -> Int
null :: forall a. SimpleDoc a -> Bool
$cnull :: forall a. SimpleDoc a -> Bool
toList :: forall a. SimpleDoc a -> [a]
$ctoList :: forall a. SimpleDoc a -> [a]
foldl1 :: forall a. (a -> a -> a) -> SimpleDoc a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> SimpleDoc a -> a
foldr1 :: forall a. (a -> a -> a) -> SimpleDoc a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> SimpleDoc a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> SimpleDoc a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> SimpleDoc a -> b
foldl :: forall b a. (b -> a -> b) -> b -> SimpleDoc a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> SimpleDoc a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> SimpleDoc a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> SimpleDoc a -> b
foldr :: forall a b. (a -> b -> b) -> b -> SimpleDoc a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> SimpleDoc a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> SimpleDoc a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> SimpleDoc a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> SimpleDoc a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> SimpleDoc a -> m
fold :: forall m. Monoid m => SimpleDoc m -> m
$cfold :: forall m. Monoid m => SimpleDoc m -> m
Foldable, Functor SimpleDoc
Foldable SimpleDoc
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
SimpleDoc (m a) -> m (SimpleDoc a)
forall (f :: * -> *) a.
Applicative f =>
SimpleDoc (f a) -> f (SimpleDoc a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SimpleDoc a -> m (SimpleDoc b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SimpleDoc a -> f (SimpleDoc b)
sequence :: forall (m :: * -> *) a.
Monad m =>
SimpleDoc (m a) -> m (SimpleDoc a)
$csequence :: forall (m :: * -> *) a.
Monad m =>
SimpleDoc (m a) -> m (SimpleDoc a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SimpleDoc a -> m (SimpleDoc b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SimpleDoc a -> m (SimpleDoc b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
SimpleDoc (f a) -> f (SimpleDoc a)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
SimpleDoc (f a) -> f (SimpleDoc a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SimpleDoc a -> f (SimpleDoc b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SimpleDoc a -> f (SimpleDoc b)
Traversable)
instance NFData a => NFData (SimpleDoc a)
char :: Char -> Doc a
char :: forall a. Char -> Doc a
char Char
'\n' = forall a. Doc a
line
char Char
c = forall a. Char -> Doc a
Char Char
c
text :: String -> Doc a
text :: forall a. String -> Doc a
text String
"" = forall a. Doc a
Empty
text String
s = forall a. Int -> String -> Doc a
Text (forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s) String
s
line :: Doc a
line :: forall a. Doc a
line = forall a. Doc a -> Doc a -> Doc a
FlatAlt forall a. Doc a
Line forall a. Doc a
space
linebreak :: Doc a
linebreak :: forall a. Doc a
linebreak = forall a. Doc a -> Doc a -> Doc a
FlatAlt forall a. Doc a
Line forall a. Monoid a => a
mempty
hardline :: Doc a
hardline :: forall a. Doc a
hardline = forall a. Doc a
Line
nest :: Int -> Doc a -> Doc a
nest :: forall a. Int -> Doc a -> Doc a
nest = forall a. Int -> Doc a -> Doc a
Nest
column, nesting :: (Int -> Doc a) -> Doc a
column :: forall a. (Int -> Doc a) -> Doc a
column = forall a. (Int -> Doc a) -> Doc a
Column
nesting :: forall a. (Int -> Doc a) -> Doc a
nesting = forall a. (Int -> Doc a) -> Doc a
Nesting
columns :: (Maybe Int -> Doc a) -> Doc a
columns :: forall a. (Maybe Int -> Doc a) -> Doc a
columns = forall a. (Maybe Int -> Doc a) -> Doc a
Columns
ribbon :: (Maybe Int -> Doc a) -> Doc a
ribbon :: forall a. (Maybe Int -> Doc a) -> Doc a
ribbon = forall a. (Maybe Int -> Doc a) -> Doc a
Ribbon
group :: Doc a -> Doc a
group :: forall a. Doc a -> Doc a
group Doc a
x = forall a. Doc a -> Doc a -> Doc a
Union (forall a. Doc a -> Doc a
flatten Doc a
x) Doc a
x
flatAlt :: Doc a -> Doc a -> Doc a
flatAlt :: forall a. Doc a -> Doc a -> Doc a
flatAlt = forall a. Doc a -> Doc a -> Doc a
FlatAlt
flatten :: Doc a -> Doc a
flatten :: forall a. Doc a -> Doc a
flatten (FlatAlt Doc a
_ Doc a
y) = Doc a
y
flatten (Cat Doc a
x Doc a
y) = forall a. Doc a -> Doc a -> Doc a
Cat (forall a. Doc a -> Doc a
flatten Doc a
x) (forall a. Doc a -> Doc a
flatten Doc a
y)
flatten (Nest Int
i Doc a
x) = forall a. Int -> Doc a -> Doc a
Nest Int
i (forall a. Doc a -> Doc a
flatten Doc a
x)
flatten (Union Doc a
x Doc a
_) = forall a. Doc a -> Doc a
flatten Doc a
x
flatten (Annotate a
a Doc a
x) = forall a. a -> Doc a -> Doc a
Annotate a
a (forall a. Doc a -> Doc a
flatten Doc a
x)
flatten (Column Int -> Doc a
f) = forall a. (Int -> Doc a) -> Doc a
Column (forall a. Doc a -> Doc a
flatten forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Doc a
f)
flatten (Nesting Int -> Doc a
f) = forall a. (Int -> Doc a) -> Doc a
Nesting (forall a. Doc a -> Doc a
flatten forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Doc a
f)
flatten (Columns Maybe Int -> Doc a
f) = forall a. (Maybe Int -> Doc a) -> Doc a
Columns (forall a. Doc a -> Doc a
flatten forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Int -> Doc a
f)
flatten (Ribbon Maybe Int -> Doc a
f) = forall a. (Maybe Int -> Doc a) -> Doc a
Ribbon (forall a. Doc a -> Doc a
flatten forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Int -> Doc a
f)
flatten a :: Doc a
a@Empty{} = Doc a
a
flatten a :: Doc a
a@Char{} = Doc a
a
flatten a :: Doc a
a@Text{} = Doc a
a
flatten a :: Doc a
a@Line{} = Doc a
a
data Docs a e
= Nil
| Cons {-# UNPACK #-} !Int (Doc a) (Docs a e)
renderPretty :: Float -> Int -> Doc a -> SimpleDoc a
renderPretty :: forall a. Float -> Int -> Doc a -> SimpleDoc a
renderPretty = forall a.
(Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a)
-> Float -> Int -> Doc a -> SimpleDoc a
renderFits forall a.
Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a
nicest1
renderPrettyDefault :: Doc a -> SimpleDoc a
renderPrettyDefault :: forall a. Doc a -> SimpleDoc a
renderPrettyDefault = forall a. Float -> Int -> Doc a -> SimpleDoc a
renderPretty Float
0.4 Int
100
renderSmart :: Int -> Doc a -> SimpleDoc a
renderSmart :: forall a. Int -> Doc a -> SimpleDoc a
renderSmart = forall a.
(Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a)
-> Float -> Int -> Doc a -> SimpleDoc a
renderFits forall a.
Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a
nicestR Float
1.0
renderFits :: (Int -> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a
-> SimpleDoc a)
-> Float -> Int -> Doc a -> SimpleDoc a
renderFits :: forall a.
(Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a)
-> Float -> Int -> Doc a -> SimpleDoc a
renderFits Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a
nicest Float
rfrac Int
w Doc a
x
= forall {e}.
Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
0 Int
0 (\Int
_ Int
_ -> forall a. SimpleDoc a
SEmpty) (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
0 Doc a
x forall a e. Docs a e
Nil)
where
r :: Int
r = forall a. Ord a => a -> a -> a
max Int
0 (forall a. Ord a => a -> a -> a
min Int
w (forall a b. (RealFrac a, Integral b) => a -> b
round (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w forall a. Num a => a -> a -> a
* Float
rfrac)))
best :: Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z Docs a e
Nil = Int -> Int -> SimpleDoc a
z Int
n Int
k
best Int
n Int
k Int -> Int -> SimpleDoc a
z (Cons Int
i Doc a
d Docs a e
ds) =
case Doc a
d of
Doc a
Empty -> Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z Docs a e
ds
Char Char
c -> let k' :: Int
k' = Int
kforall a. Num a => a -> a -> a
+Int
1 in seq :: forall a b. a -> b -> b
seq Int
k' (forall a. Char -> SimpleDoc a -> SimpleDoc a
SChar Char
c (Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k' Int -> Int -> SimpleDoc a
z Docs a e
ds))
Text Int
l String
s -> let k' :: Int
k' = Int
kforall a. Num a => a -> a -> a
+Int
l in seq :: forall a b. a -> b -> b
seq Int
k' (forall a. Int -> String -> SimpleDoc a -> SimpleDoc a
SText Int
l String
s (Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k' Int -> Int -> SimpleDoc a
z Docs a e
ds))
Doc a
Line -> forall a. Int -> SimpleDoc a -> SimpleDoc a
SLine Int
i (Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
i Int
i Int -> Int -> SimpleDoc a
z Docs a e
ds)
FlatAlt Doc a
l Doc a
_ -> Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i Doc a
l Docs a e
ds)
Cat Doc a
x' Doc a
y -> Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i Doc a
x' (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i Doc a
y Docs a e
ds))
Nest Int
j Doc a
x' -> let i' :: Int
i' = Int
iforall a. Num a => a -> a -> a
+Int
j in seq :: forall a b. a -> b -> b
seq Int
i' (Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i' Doc a
x' Docs a e
ds))
Annotate a
a Doc a
d' -> let z' :: Int -> Int -> SimpleDoc a
z' Int
n' Int
k' = forall a. a -> SimpleDoc a -> SimpleDoc a
SPopAnn a
a forall a b. (a -> b) -> a -> b
$ Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n' Int
k' Int -> Int -> SimpleDoc a
z Docs a e
ds
in forall a. a -> SimpleDoc a -> SimpleDoc a
SPushAnn a
a (Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z' (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i Doc a
d' forall a e. Docs a e
Nil))
Union Doc a
p Doc a
q -> Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a
nicest Int
n Int
k Int
w Int
r (Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i Doc a
p Docs a e
ds))
(Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i Doc a
q Docs a e
ds))
Column Int -> Doc a
f -> Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i (Int -> Doc a
f Int
k) Docs a e
ds)
Nesting Int -> Doc a
f -> Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i (Int -> Doc a
f Int
i) Docs a e
ds)
Columns Maybe Int -> Doc a
f -> Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i (Maybe Int -> Doc a
f forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Int
w) Docs a e
ds)
Ribbon Maybe Int -> Doc a
f -> Int
-> Int -> (Int -> Int -> SimpleDoc a) -> Docs a e -> SimpleDoc a
best Int
n Int
k Int -> Int -> SimpleDoc a
z (forall a e. Int -> Doc a -> Docs a e -> Docs a e
Cons Int
i (Maybe Int -> Doc a
f forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Int
r) Docs a e
ds)
nicest1 :: Int -> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a
nicest1 :: forall a.
Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a
nicest1 Int
n Int
k Int
p Int
r SimpleDoc a
x' SimpleDoc a
y | forall {t} {a}. t -> Int -> SimpleDoc a -> Bool
fits (forall a. Ord a => a -> a -> a
min Int
n Int
k) Int
wid SimpleDoc a
x' = SimpleDoc a
x'
| Bool
otherwise = SimpleDoc a
y
where wid :: Int
wid = forall a. Ord a => a -> a -> a
min (Int
p forall a. Num a => a -> a -> a
- Int
k) (Int
r forall a. Num a => a -> a -> a
- Int
k forall a. Num a => a -> a -> a
+ Int
n)
fits :: t -> Int -> SimpleDoc a -> Bool
fits t
_ Int
w SimpleDoc a
_ | Int
w forall a. Ord a => a -> a -> Bool
< Int
0 = Bool
False
fits t
_ Int
_ SimpleDoc a
SEmpty = Bool
True
fits t
m Int
w (SChar Char
_ SimpleDoc a
x) = t -> Int -> SimpleDoc a -> Bool
fits t
m (Int
w forall a. Num a => a -> a -> a
- Int
1) SimpleDoc a
x
fits t
m Int
w (SText Int
l String
_ SimpleDoc a
x) = t -> Int -> SimpleDoc a -> Bool
fits t
m (Int
w forall a. Num a => a -> a -> a
- Int
l) SimpleDoc a
x
fits t
_ Int
_ (SLine Int
_ SimpleDoc a
_) = Bool
True
fits t
m Int
w (SPushAnn a
_ SimpleDoc a
x) = t -> Int -> SimpleDoc a -> Bool
fits t
m Int
w SimpleDoc a
x
fits t
m Int
w (SPopAnn a
_ SimpleDoc a
x) = t -> Int -> SimpleDoc a -> Bool
fits t
m Int
w SimpleDoc a
x
nicestR :: Int -> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a
nicestR :: forall a.
Int
-> Int -> Int -> Int -> SimpleDoc a -> SimpleDoc a -> SimpleDoc a
nicestR Int
n Int
k Int
p Int
r SimpleDoc a
x' SimpleDoc a
y =
if forall {a}. Int -> Int -> SimpleDoc a -> Double
fits (forall a. Ord a => a -> a -> a
min Int
n Int
k) Int
wid SimpleDoc a
x' forall a. Ord a => a -> a -> Bool
<= forall {a}. Int -> Int -> SimpleDoc a -> Double
fits (forall a. Ord a => a -> a -> a
min Int
n Int
k) Int
wid SimpleDoc a
y then SimpleDoc a
x' else SimpleDoc a
y
where wid :: Int
wid = forall a. Ord a => a -> a -> a
min (Int
p forall a. Num a => a -> a -> a
- Int
k) (Int
r forall a. Num a => a -> a -> a
- Int
k forall a. Num a => a -> a -> a
+ Int
n)
inf :: Double
inf = Double
1.0forall a. Fractional a => a -> a -> a
/Double
0 :: Double
fits :: Int -> Int -> SimpleDoc a -> Double
fits Int
_ Int
w SimpleDoc a
_ | Int
w forall a. Ord a => a -> a -> Bool
< Int
0 = Double
inf
fits Int
_ Int
_ SimpleDoc a
SEmpty = Double
0
fits Int
m Int
w (SChar Char
_ SimpleDoc a
x) = Int -> Int -> SimpleDoc a -> Double
fits Int
m (Int
w forall a. Num a => a -> a -> a
- Int
1) SimpleDoc a
x
fits Int
m Int
w (SText Int
l String
_ SimpleDoc a
x) = Int -> Int -> SimpleDoc a -> Double
fits Int
m (Int
w forall a. Num a => a -> a -> a
- Int
l) SimpleDoc a
x
fits Int
m Int
_ (SLine Int
i SimpleDoc a
x) | Int
m forall a. Ord a => a -> a -> Bool
< Int
i = Double
1 forall a. Num a => a -> a -> a
+ Int -> Int -> SimpleDoc a -> Double
fits Int
m (Int
p forall a. Num a => a -> a -> a
- Int
i) SimpleDoc a
x
| Bool
otherwise = Double
0
fits Int
m Int
w (SPushAnn a
_ SimpleDoc a
x) = Int -> Int -> SimpleDoc a -> Double
fits Int
m Int
w SimpleDoc a
x
fits Int
m Int
w (SPopAnn a
_ SimpleDoc a
x) = Int -> Int -> SimpleDoc a -> Double
fits Int
m Int
w SimpleDoc a
x
renderCompact :: Doc a -> SimpleDoc a
renderCompact :: forall a. Doc a -> SimpleDoc a
renderCompact Doc a
x
= forall {a}. SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan forall a. SimpleDoc a
SEmpty Int
0 [Doc a
x]
where
scan :: SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
_ [] = SimpleDoc a
z
scan SimpleDoc a
z Int
k (Doc a
d:[Doc a]
ds) =
case Doc a
d of
Doc a
Empty -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k [Doc a]
ds
Char Char
c -> let k' :: Int
k' = Int
kforall a. Num a => a -> a -> a
+Int
1 in seq :: forall a b. a -> b -> b
seq Int
k' (forall a. Char -> SimpleDoc a -> SimpleDoc a
SChar Char
c (SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k' [Doc a]
ds))
Text Int
l String
s -> let k' :: Int
k' = Int
kforall a. Num a => a -> a -> a
+Int
l in seq :: forall a b. a -> b -> b
seq Int
k' (forall a. Int -> String -> SimpleDoc a -> SimpleDoc a
SText Int
l String
s (SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k' [Doc a]
ds))
Annotate a
a Doc a
d' -> forall a. a -> SimpleDoc a -> SimpleDoc a
SPushAnn a
a (SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan (forall a. a -> SimpleDoc a -> SimpleDoc a
SPopAnn a
a forall a b. (a -> b) -> a -> b
$ SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k [Doc a]
ds) Int
k [Doc a
d'])
Doc a
Line -> forall a. Int -> SimpleDoc a -> SimpleDoc a
SLine Int
0 (SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
0 [Doc a]
ds)
FlatAlt Doc a
y Doc a
_ -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k (Doc a
yforall a. a -> [a] -> [a]
:[Doc a]
ds)
Cat Doc a
y Doc a
z' -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k (Doc a
yforall a. a -> [a] -> [a]
:Doc a
z'forall a. a -> [a] -> [a]
:[Doc a]
ds)
Nest Int
_ Doc a
y -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k (Doc a
yforall a. a -> [a] -> [a]
:[Doc a]
ds)
Union Doc a
_ Doc a
y -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k (Doc a
yforall a. a -> [a] -> [a]
:[Doc a]
ds)
Column Int -> Doc a
f -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k (Int -> Doc a
f Int
kforall a. a -> [a] -> [a]
:[Doc a]
ds)
Nesting Int -> Doc a
f -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k (Int -> Doc a
f Int
0forall a. a -> [a] -> [a]
:[Doc a]
ds)
Columns Maybe Int -> Doc a
f -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k (Maybe Int -> Doc a
f forall a. Maybe a
Nothingforall a. a -> [a] -> [a]
:[Doc a]
ds)
Ribbon Maybe Int -> Doc a
f -> SimpleDoc a -> Int -> [Doc a] -> SimpleDoc a
scan SimpleDoc a
z Int
k (Maybe Int -> Doc a
f forall a. Maybe a
Nothingforall a. a -> [a] -> [a]
:[Doc a]
ds)
simpleDocMapAnn :: (r -> a -> r)
-> (r -> a -> r)
-> (r -> SimpleDoc a' -> SimpleDoc a')
-> (r -> SimpleDoc a' -> SimpleDoc a')
-> r
-> SimpleDoc a -> SimpleDoc a'
simpleDocMapAnn :: forall r a a'.
(r -> a -> r)
-> (r -> a -> r)
-> (r -> SimpleDoc a' -> SimpleDoc a')
-> (r -> SimpleDoc a' -> SimpleDoc a')
-> r
-> SimpleDoc a
-> SimpleDoc a'
simpleDocMapAnn r -> a -> r
upPush r -> a -> r
upPop r -> SimpleDoc a' -> SimpleDoc a'
push r -> SimpleDoc a' -> SimpleDoc a'
pop = r -> SimpleDoc a -> SimpleDoc a'
go
where
go :: r -> SimpleDoc a -> SimpleDoc a'
go r
_ SimpleDoc a
SEmpty = forall a. SimpleDoc a
SEmpty
go r
r (SChar Char
c SimpleDoc a
x) = forall a. Char -> SimpleDoc a -> SimpleDoc a
SChar Char
c (r -> SimpleDoc a -> SimpleDoc a'
go r
r SimpleDoc a
x)
go r
r (SText Int
l String
s SimpleDoc a
x) = forall a. Int -> String -> SimpleDoc a -> SimpleDoc a
SText Int
l String
s (r -> SimpleDoc a -> SimpleDoc a'
go r
r SimpleDoc a
x)
go r
r (SLine Int
i SimpleDoc a
x) = forall a. Int -> SimpleDoc a -> SimpleDoc a
SLine Int
i (r -> SimpleDoc a -> SimpleDoc a'
go r
r SimpleDoc a
x)
go r
r (SPushAnn a
a SimpleDoc a
x) = let r' :: r
r' = r -> a -> r
upPush r
r a
a in r -> SimpleDoc a' -> SimpleDoc a'
push r
r' forall a b. (a -> b) -> a -> b
$ r -> SimpleDoc a -> SimpleDoc a'
go r
r' SimpleDoc a
x
go r
r (SPopAnn a
a SimpleDoc a
x) = let r' :: r
r' = r -> a -> r
upPop r
r a
a in r -> SimpleDoc a' -> SimpleDoc a'
pop r
r' forall a b. (a -> b) -> a -> b
$ r -> SimpleDoc a -> SimpleDoc a'
go r
r' SimpleDoc a
x
simpleDocScanAnn :: (r -> a -> r)
-> r
-> SimpleDoc a
-> SimpleDoc r
simpleDocScanAnn :: forall r a. (r -> a -> r) -> r -> SimpleDoc a -> SimpleDoc r
simpleDocScanAnn r -> a -> r
f r
r0 = forall r a a'.
(r -> a -> r)
-> (r -> a -> r)
-> (r -> SimpleDoc a' -> SimpleDoc a')
-> (r -> SimpleDoc a' -> SimpleDoc a')
-> r
-> SimpleDoc a
-> SimpleDoc a'
simpleDocMapAnn [r] -> a -> [r]
merge forall {a} {p}. [a] -> p -> [a]
pop (forall a. a -> SimpleDoc a -> SimpleDoc a
SPushAnn forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head) (forall a. a -> SimpleDoc a -> SimpleDoc a
SPopAnn forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head) [r
r0]
where merge :: [r] -> a -> [r]
merge rs :: [r]
rs@(r
r:[r]
_) a
x = r -> a -> r
f r
r a
x forall a. a -> [a] -> [a]
: [r]
rs
merge [] a
_ = forall a. HasCallStack => String -> a
error String
"Stack underflow"
pop :: [a] -> p -> [a]
pop (a
_:[a]
rs) p
_ = [a]
rs
pop [] p
_ = forall a. HasCallStack => String -> a
error String
"Stack underflow"
displayDecoratedA :: (Applicative f, Monoid o)
=> (a -> f o)
-> (a -> f o)
-> (String -> f o)
-> SimpleDoc a
-> f o
displayDecoratedA :: forall (f :: * -> *) o a.
(Applicative f, Monoid o) =>
(a -> f o) -> (a -> f o) -> (String -> f o) -> SimpleDoc a -> f o
displayDecoratedA a -> f o
push a -> f o
pop String -> f o
str = SimpleDoc a -> f o
go
where
go :: SimpleDoc a -> f o
go SimpleDoc a
SEmpty = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Monoid a => a
mempty
go (SChar Char
c SimpleDoc a
x) = String -> f o
str (forall (f :: * -> *) a. Applicative f => a -> f a
pure Char
c) f o -> f o -> f o
<++> SimpleDoc a -> f o
go SimpleDoc a
x
go (SText Int
_ String
s SimpleDoc a
x) = String -> f o
str String
s f o -> f o -> f o
<++> SimpleDoc a -> f o
go SimpleDoc a
x
go (SLine Int
i SimpleDoc a
x) = String -> f o
str (Char
'\n'forall a. a -> [a] -> [a]
:Int -> String
spaces Int
i) f o -> f o -> f o
<++> SimpleDoc a -> f o
go SimpleDoc a
x
go (SPushAnn a
a SimpleDoc a
x) = a -> f o
push a
a f o -> f o -> f o
<++> SimpleDoc a -> f o
go SimpleDoc a
x
go (SPopAnn a
a SimpleDoc a
x) = a -> f o
pop a
a f o -> f o -> f o
<++> SimpleDoc a -> f o
go SimpleDoc a
x
<++> :: f o -> f o -> f o
(<++>) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Monoid a => a -> a -> a
mappend
{-# SPECIALIZE displayDecoratedA :: Monoid o => (a -> Identity o) -> (a -> Identity o) -> (String -> Identity o) -> SimpleDoc a -> Identity o #-}
{-# SPECIALIZE displayDecoratedA :: Monoid o => (a -> (o -> o)) -> (a -> (o -> o)) -> (String -> (o -> o)) -> SimpleDoc a -> (o -> o) #-}
displayDecorated :: Monoid o
=> (a -> o)
-> (a -> o)
-> (String -> o)
-> SimpleDoc a
-> o
displayDecorated :: forall o a.
Monoid o =>
(a -> o) -> (a -> o) -> (String -> o) -> SimpleDoc a -> o
displayDecorated a -> o
push a -> o
pop String -> o
str = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall (f :: * -> *) o a.
(Applicative f, Monoid o) =>
(a -> f o) -> (a -> f o) -> (String -> f o) -> SimpleDoc a -> f o
displayDecoratedA (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> o
push) (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> o
pop) (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> o
str)
displayIO :: Handle -> SimpleDoc a -> IO ()
displayIO :: forall a. Handle -> SimpleDoc a -> IO ()
displayIO Handle
handle = forall (f :: * -> *) o a.
(Applicative f, Monoid o) =>
(a -> f o) -> (a -> f o) -> (String -> f o) -> SimpleDoc a -> f o
displayDecoratedA forall {b}. b -> IO ()
cpu forall {b}. b -> IO ()
cpu (Handle -> String -> IO ()
hPutStr Handle
handle)
where cpu :: b -> IO ()
cpu = forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
displayS :: SimpleDoc a -> ShowS
displayS :: forall a. SimpleDoc a -> ShowS
displayS = forall (f :: * -> *) o a.
(Applicative f, Monoid o) =>
(a -> f o) -> (a -> f o) -> (String -> f o) -> SimpleDoc a -> f o
displayDecoratedA forall {b} {a}. b -> a -> a
ci forall {b} {a}. b -> a -> a
ci forall a. [a] -> [a] -> [a]
(++)
where ci :: b -> a -> a
ci = forall a b. a -> b -> a
const forall a. a -> a
id
display :: SimpleDoc a -> String
display :: forall a. SimpleDoc a -> String
display = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. SimpleDoc a -> ShowS
displayS String
""
displayT :: SimpleDoc a -> TL.Text
displayT :: forall a. SimpleDoc a -> Text
displayT = Builder -> Text
TL.toLazyText forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall o a.
Monoid o =>
(a -> o) -> (a -> o) -> (String -> o) -> SimpleDoc a -> o
displayDecorated forall {b}. b -> Builder
cm forall {b}. b -> Builder
cm String -> Builder
TL.fromString
where cm :: b -> Builder
cm = forall a b. a -> b -> a
const forall a. Monoid a => a
mempty
type SpanList a = [(Int, Int, a)]
displaySpans :: Monoid o => (String -> o) -> SimpleDoc a -> (o, SpanList a)
displaySpans :: forall o a.
Monoid o =>
(String -> o) -> SimpleDoc a -> (o, SpanList a)
displaySpans String -> o
str = forall {c}. Int -> [Int] -> SimpleDoc c -> (o, [(Int, Int, c)])
go Int
0 []
where
go :: Int -> [Int] -> SimpleDoc c -> (o, [(Int, Int, c)])
go Int
_ [] SimpleDoc c
SEmpty = (forall a. Monoid a => a
mempty, [])
go Int
i [Int]
stk (SChar Char
c SimpleDoc c
x) = forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (forall a. Monoid a => a -> a -> a
mappend forall a b. (a -> b) -> a -> b
$ String -> o
str forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Applicative f => a -> f a
pure Char
c) forall a b. (a -> b) -> a -> b
$ Int -> [Int] -> SimpleDoc c -> (o, [(Int, Int, c)])
go (Int
iforall a. Num a => a -> a -> a
+Int
1) [Int]
stk SimpleDoc c
x
go Int
i [Int]
stk (SText Int
l String
s SimpleDoc c
x) = forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (forall a. Monoid a => a -> a -> a
mappend forall a b. (a -> b) -> a -> b
$ String -> o
str String
s) forall a b. (a -> b) -> a -> b
$ Int -> [Int] -> SimpleDoc c -> (o, [(Int, Int, c)])
go (Int
i forall a. Num a => a -> a -> a
+ Int
l) [Int]
stk SimpleDoc c
x
go Int
i [Int]
stk (SLine Int
ind SimpleDoc c
x) = forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (forall a. Monoid a => a -> a -> a
mappend forall a b. (a -> b) -> a -> b
$ String -> o
str forall a b. (a -> b) -> a -> b
$ Char
'\n'forall a. a -> [a] -> [a]
:Int -> String
spaces Int
ind) forall a b. (a -> b) -> a -> b
$ Int -> [Int] -> SimpleDoc c -> (o, [(Int, Int, c)])
go (Int
1forall a. Num a => a -> a -> a
+Int
iforall a. Num a => a -> a -> a
+Int
ind) [Int]
stk SimpleDoc c
x
go Int
i [Int]
stk (SPushAnn c
_ SimpleDoc c
x) = Int -> [Int] -> SimpleDoc c -> (o, [(Int, Int, c)])
go Int
i (Int
iforall a. a -> [a] -> [a]
:[Int]
stk) SimpleDoc c
x
go Int
i (Int
start:[Int]
stk) (SPopAnn c
ann SimpleDoc c
x) = forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second ((Int
start, Int
iforall a. Num a => a -> a -> a
-Int
start, c
ann)forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> [Int] -> SimpleDoc c -> (o, [(Int, Int, c)])
go Int
i [Int]
stk SimpleDoc c
x
go Int
_ [Int]
_ SimpleDoc c
SEmpty = forall a. HasCallStack => String -> a
error String
"Stack not empty"
go Int
_ [] (SPopAnn c
_ SimpleDoc c
_) = forall a. HasCallStack => String -> a
error String
"Stack underflow"
instance Show (Doc a) where
showsPrec :: Int -> Doc a -> ShowS
showsPrec Int
_ = forall a. SimpleDoc a -> ShowS
displayS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Doc a -> SimpleDoc a
renderPrettyDefault
putDoc :: Doc a -> IO ()
putDoc :: forall a. Doc a -> IO ()
putDoc = forall a. Handle -> Doc a -> IO ()
hPutDoc Handle
stdout
hPutDoc :: Handle -> Doc a -> IO ()
hPutDoc :: forall a. Handle -> Doc a -> IO ()
hPutDoc Handle
handle = forall a. Handle -> SimpleDoc a -> IO ()
displayIO Handle
handle forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Doc a -> SimpleDoc a
renderPrettyDefault
spaces :: Int -> String
spaces :: Int -> String
spaces Int
n | Int
n forall a. Ord a => a -> a -> Bool
<= Int
0 = String
""
| Bool
otherwise = forall a. Int -> a -> [a]
replicate Int
n Char
' '