{-# OPTIONS_HADDOCK not-home #-}
{-# LANGUAGE BangPatterns #-}
#if __GLASGOW_HASKELL__ >= 701
{-# LANGUAGE Safe #-}
{-# LANGUAGE DeriveGeneric #-}
#endif
#ifndef TESTING
module Text.PrettyPrint.Annotated.HughesPJ (
Doc, TextDetails(..), AnnotDetails(..),
char, text, ptext, sizedText, zeroWidthText,
int, integer, float, double, rational,
semi, comma, colon, space, equals,
lparen, rparen, lbrack, rbrack, lbrace, rbrace,
parens, brackets, braces, quotes, doubleQuotes,
maybeParens, maybeBrackets, maybeBraces, maybeQuotes, maybeDoubleQuotes,
empty,
(<>), (<+>), hcat, hsep,
($$), ($+$), vcat,
sep, cat,
fsep, fcat,
nest,
hang, punctuate,
annotate,
isEmpty,
first, reduceDoc,
render,
renderSpans, Span(..),
renderDecorated,
renderDecoratedM,
Style(..),
style,
renderStyle,
Mode(..),
fullRender,
fullRenderAnn
) where
#endif
import Control.DeepSeq ( NFData(rnf) )
import Data.Function ( on )
#if __GLASGOW_HASKELL__ >= 803
import Prelude hiding ( (<>) )
#endif
#if __GLASGOW_HASKELL__ >= 800
import qualified Data.Semigroup as Semi ( Semigroup((<>)) )
#elif __GLASGOW_HASKELL__ < 709
import Data.Monoid ( Monoid(mempty, mappend) )
#endif
import Data.String ( IsString(fromString) )
import GHC.Generics
infixl 6 <>
infixl 6 <+>
infixl 5 $$, $+$
data Doc a
= Empty
| NilAbove (Doc a)
| TextBeside !(AnnotDetails a) (Doc a)
| Nest {-# UNPACK #-} !Int (Doc a)
| Union (Doc a) (Doc a)
| NoDoc
| Beside (Doc a) Bool (Doc a)
| Above (Doc a) Bool (Doc a)
#if __GLASGOW_HASKELL__ >= 701
deriving ((forall x. Doc a -> Rep (Doc a) x)
-> (forall x. Rep (Doc a) x -> Doc a) -> Generic (Doc a)
forall x. Rep (Doc a) x -> Doc a
forall x. Doc a -> Rep (Doc a) x
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)
#endif
type RDoc = Doc
data AnnotDetails a = AnnotStart
| NoAnnot !TextDetails {-# UNPACK #-} !Int
| AnnotEnd a
deriving (Int -> AnnotDetails a -> ShowS
[AnnotDetails a] -> ShowS
AnnotDetails a -> String
(Int -> AnnotDetails a -> ShowS)
-> (AnnotDetails a -> String)
-> ([AnnotDetails a] -> ShowS)
-> Show (AnnotDetails a)
forall a. Show a => Int -> AnnotDetails a -> ShowS
forall a. Show a => [AnnotDetails a] -> ShowS
forall a. Show a => AnnotDetails a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AnnotDetails a] -> ShowS
$cshowList :: forall a. Show a => [AnnotDetails a] -> ShowS
show :: AnnotDetails a -> String
$cshow :: forall a. Show a => AnnotDetails a -> String
showsPrec :: Int -> AnnotDetails a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> AnnotDetails a -> ShowS
Show,AnnotDetails a -> AnnotDetails a -> Bool
(AnnotDetails a -> AnnotDetails a -> Bool)
-> (AnnotDetails a -> AnnotDetails a -> Bool)
-> Eq (AnnotDetails a)
forall a. Eq a => AnnotDetails a -> AnnotDetails a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AnnotDetails a -> AnnotDetails a -> Bool
$c/= :: forall a. Eq a => AnnotDetails a -> AnnotDetails a -> Bool
== :: AnnotDetails a -> AnnotDetails a -> Bool
$c== :: forall a. Eq a => AnnotDetails a -> AnnotDetails a -> Bool
Eq)
instance Functor AnnotDetails where
fmap :: (a -> b) -> AnnotDetails a -> AnnotDetails b
fmap _ AnnotStart = AnnotDetails b
forall a. AnnotDetails a
AnnotStart
fmap _ (NoAnnot d :: TextDetails
d i :: Int
i) = TextDetails -> Int -> AnnotDetails b
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot TextDetails
d Int
i
fmap f :: a -> b
f (AnnotEnd a :: a
a) = b -> AnnotDetails b
forall a. a -> AnnotDetails a
AnnotEnd (a -> b
f a
a)
annotSize :: AnnotDetails a -> Int
annotSize :: AnnotDetails a -> Int
annotSize (NoAnnot _ l :: Int
l) = Int
l
annotSize _ = 0
data TextDetails = Chr {-# UNPACK #-} !Char
| Str String
| PStr String
#if __GLASGOW_HASKELL__ >= 701
deriving (Int -> TextDetails -> ShowS
[TextDetails] -> ShowS
TextDetails -> String
(Int -> TextDetails -> ShowS)
-> (TextDetails -> String)
-> ([TextDetails] -> ShowS)
-> Show TextDetails
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TextDetails] -> ShowS
$cshowList :: [TextDetails] -> ShowS
show :: TextDetails -> String
$cshow :: TextDetails -> String
showsPrec :: Int -> TextDetails -> ShowS
$cshowsPrec :: Int -> TextDetails -> ShowS
Show, TextDetails -> TextDetails -> Bool
(TextDetails -> TextDetails -> Bool)
-> (TextDetails -> TextDetails -> Bool) -> Eq TextDetails
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TextDetails -> TextDetails -> Bool
$c/= :: TextDetails -> TextDetails -> Bool
== :: TextDetails -> TextDetails -> Bool
$c== :: TextDetails -> TextDetails -> Bool
Eq, (forall x. TextDetails -> Rep TextDetails x)
-> (forall x. Rep TextDetails x -> TextDetails)
-> Generic TextDetails
forall x. Rep TextDetails x -> TextDetails
forall x. TextDetails -> Rep TextDetails x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TextDetails x -> TextDetails
$cfrom :: forall x. TextDetails -> Rep TextDetails x
Generic)
#endif
#if __GLASGOW_HASKELL__ >= 800
instance Semi.Semigroup (Doc a) where
#ifndef TESTING
<> :: Doc a -> Doc a -> Doc a
(<>) = Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
(Text.PrettyPrint.Annotated.HughesPJ.<>)
#else
(<>) = (PrettyTestVersion.<>)
#endif
instance Monoid (Doc a) where
mempty :: Doc a
mempty = Doc a
forall a. Doc a
empty
mappend :: Doc a -> Doc a -> Doc a
mappend = Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
(Semi.<>)
#else
instance Monoid (Doc a) where
mempty = empty
mappend = (<>)
#endif
instance IsString (Doc a) where
fromString :: String -> Doc a
fromString = String -> Doc a
forall a. String -> Doc a
text
instance Show (Doc a) where
showsPrec :: Int -> Doc a -> ShowS
showsPrec _ doc :: Doc a
doc cont :: String
cont = Mode
-> Int
-> Float
-> (TextDetails -> ShowS)
-> String
-> Doc a
-> String
forall a b.
Mode -> Int -> Float -> (TextDetails -> a -> a) -> a -> Doc b -> a
fullRender (Style -> Mode
mode Style
style) (Style -> Int
lineLength Style
style)
(Style -> Float
ribbonsPerLine Style
style)
TextDetails -> ShowS
txtPrinter String
cont Doc a
doc
instance Eq (Doc a) where
== :: Doc a -> Doc a -> Bool
(==) = String -> String -> Bool
forall a. Eq a => a -> a -> Bool
(==) (String -> String -> Bool)
-> (Doc a -> String) -> Doc a -> Doc a -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Doc a -> String
forall a. Doc a -> String
render
instance Functor Doc where
fmap :: (a -> b) -> Doc a -> Doc b
fmap _ Empty = Doc b
forall a. Doc a
Empty
fmap f :: a -> b
f (NilAbove d :: Doc a
d) = Doc b -> Doc b
forall a. Doc a -> Doc a
NilAbove ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
d)
fmap f :: a -> b
f (TextBeside td :: AnnotDetails a
td d :: Doc a
d) = AnnotDetails b -> Doc b -> Doc b
forall a. AnnotDetails a -> Doc a -> Doc a
TextBeside ((a -> b) -> AnnotDetails a -> AnnotDetails b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f AnnotDetails a
td) ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
d)
fmap f :: a -> b
f (Nest k :: Int
k d :: Doc a
d) = Int -> Doc b -> Doc b
forall a. Int -> Doc a -> Doc a
Nest Int
k ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
d)
fmap f :: a -> b
f (Union ur :: Doc a
ur ul :: Doc a
ul) = Doc b -> Doc b -> Doc b
forall a. Doc a -> Doc a -> Doc a
Union ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
ur) ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
ul)
fmap _ NoDoc = Doc b
forall a. Doc a
NoDoc
fmap f :: a -> b
f (Beside ld :: Doc a
ld s :: Bool
s rd :: Doc a
rd) = Doc b -> Bool -> Doc b -> Doc b
forall a. Doc a -> Bool -> Doc a -> Doc a
Beside ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
ld) Bool
s ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
rd)
fmap f :: a -> b
f (Above ud :: Doc a
ud s :: Bool
s ld :: Doc a
ld) = Doc b -> Bool -> Doc b -> Doc b
forall a. Doc a -> Bool -> Doc a -> Doc a
Above ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
ud) Bool
s ((a -> b) -> Doc a -> Doc b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Doc a
ld)
instance NFData a => NFData (Doc a) where
rnf :: Doc a -> ()
rnf Empty = ()
rnf (NilAbove d :: Doc a
d) = Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
d
rnf (TextBeside td :: AnnotDetails a
td d :: Doc a
d) = AnnotDetails a -> ()
forall a. NFData a => a -> ()
rnf AnnotDetails a
td () -> () -> ()
forall a b. a -> b -> b
`seq` Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
d
rnf (Nest k :: Int
k d :: Doc a
d) = Int -> ()
forall a. NFData a => a -> ()
rnf Int
k () -> () -> ()
forall a b. a -> b -> b
`seq` Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
d
rnf (Union ur :: Doc a
ur ul :: Doc a
ul) = Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
ur () -> () -> ()
forall a b. a -> b -> b
`seq` Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
ul
rnf NoDoc = ()
rnf (Beside ld :: Doc a
ld s :: Bool
s rd :: Doc a
rd) = Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
ld () -> () -> ()
forall a b. a -> b -> b
`seq` Bool -> ()
forall a. NFData a => a -> ()
rnf Bool
s () -> () -> ()
forall a b. a -> b -> b
`seq` Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
rd
rnf (Above ud :: Doc a
ud s :: Bool
s ld :: Doc a
ld) = Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
ud () -> () -> ()
forall a b. a -> b -> b
`seq` Bool -> ()
forall a. NFData a => a -> ()
rnf Bool
s () -> () -> ()
forall a b. a -> b -> b
`seq` Doc a -> ()
forall a. NFData a => a -> ()
rnf Doc a
ld
instance NFData a => NFData (AnnotDetails a) where
rnf :: AnnotDetails a -> ()
rnf AnnotStart = ()
rnf (NoAnnot d :: TextDetails
d sl :: Int
sl) = TextDetails -> ()
forall a. NFData a => a -> ()
rnf TextDetails
d () -> () -> ()
forall a b. a -> b -> b
`seq` Int -> ()
forall a. NFData a => a -> ()
rnf Int
sl
rnf (AnnotEnd a :: a
a) = a -> ()
forall a. NFData a => a -> ()
rnf a
a
instance NFData TextDetails where
rnf :: TextDetails -> ()
rnf (Chr c :: Char
c) = Char -> ()
forall a. NFData a => a -> ()
rnf Char
c
rnf (Str str :: String
str) = String -> ()
forall a. NFData a => a -> ()
rnf String
str
rnf (PStr str :: String
str) = String -> ()
forall a. NFData a => a -> ()
rnf String
str
annotate :: a -> Doc a -> Doc a
annotate :: a -> Doc a -> Doc a
annotate a :: a
a d :: Doc a
d = AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
TextBeside AnnotDetails a
forall a. AnnotDetails a
AnnotStart
(Doc a -> Doc a) -> Doc a -> Doc a
forall a b. (a -> b) -> a -> b
$ Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
d) Bool
False
(Doc a -> Doc a) -> Doc a -> Doc a
forall a b. (a -> b) -> a -> b
$ AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
TextBeside (a -> AnnotDetails a
forall a. a -> AnnotDetails a
AnnotEnd a
a) Doc a
forall a. Doc a
Empty
char :: Char -> Doc a
char :: Char -> Doc a
char c :: Char
c = AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ (TextDetails -> Int -> AnnotDetails a
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (Char -> TextDetails
Chr Char
c) 1) Doc a
forall a. Doc a
Empty
text :: String -> Doc a
text :: String -> Doc a
text s :: String
s = case String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s of {sl :: Int
sl -> AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ (TextDetails -> Int -> AnnotDetails a
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (String -> TextDetails
Str String
s) Int
sl) Doc a
forall a. Doc a
Empty}
ptext :: String -> Doc a
ptext :: String -> Doc a
ptext s :: String
s = case String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s of {sl :: Int
sl -> AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ (TextDetails -> Int -> AnnotDetails a
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (String -> TextDetails
PStr String
s) Int
sl) Doc a
forall a. Doc a
Empty}
sizedText :: Int -> String -> Doc a
sizedText :: Int -> String -> Doc a
sizedText l :: Int
l s :: String
s = AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ (TextDetails -> Int -> AnnotDetails a
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (String -> TextDetails
Str String
s) Int
l) Doc a
forall a. Doc a
Empty
zeroWidthText :: String -> Doc a
zeroWidthText :: String -> Doc a
zeroWidthText = Int -> String -> Doc a
forall a. Int -> String -> Doc a
sizedText 0
empty :: Doc a
empty :: Doc a
empty = Doc a
forall a. Doc a
Empty
isEmpty :: Doc a -> Bool
isEmpty :: Doc a -> Bool
isEmpty Empty = Bool
True
isEmpty _ = Bool
False
indent :: Int -> String
indent :: Int -> String
indent !Int
n = Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
n ' '
semi :: Doc a
comma :: Doc a
colon :: Doc a
space :: Doc a
equals :: Doc a
lparen :: Doc a
rparen :: Doc a
lbrack :: Doc a
rbrack :: Doc a
lbrace :: Doc a
rbrace :: Doc a
semi :: Doc a
semi = Char -> Doc a
forall a. Char -> Doc a
char ';'
comma :: Doc a
comma = Char -> Doc a
forall a. Char -> Doc a
char ','
colon :: Doc a
colon = Char -> Doc a
forall a. Char -> Doc a
char ':'
space :: Doc a
space = Char -> Doc a
forall a. Char -> Doc a
char ' '
equals :: Doc a
equals = Char -> Doc a
forall a. Char -> Doc a
char '='
lparen :: Doc a
lparen = Char -> Doc a
forall a. Char -> Doc a
char '('
rparen :: Doc a
rparen = Char -> Doc a
forall a. Char -> Doc a
char ')'
lbrack :: Doc a
lbrack = Char -> Doc a
forall a. Char -> Doc a
char '['
rbrack :: Doc a
rbrack = Char -> Doc a
forall a. Char -> Doc a
char ']'
lbrace :: Doc a
lbrace = Char -> Doc a
forall a. Char -> Doc a
char '{'
rbrace :: Doc a
rbrace = Char -> Doc a
forall a. Char -> Doc a
char '}'
spaceText, nlText :: AnnotDetails a
spaceText :: AnnotDetails a
spaceText = TextDetails -> Int -> AnnotDetails a
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (Char -> TextDetails
Chr ' ') 1
nlText :: AnnotDetails a
nlText = TextDetails -> Int -> AnnotDetails a
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (Char -> TextDetails
Chr '\n') 1
int :: Int -> Doc a
integer :: Integer -> Doc a
float :: Float -> Doc a
double :: Double -> Doc a
rational :: Rational -> Doc a
int :: Int -> Doc a
int n :: Int
n = String -> Doc a
forall a. String -> Doc a
text (Int -> String
forall a. Show a => a -> String
show Int
n)
integer :: Integer -> Doc a
integer n :: Integer
n = String -> Doc a
forall a. String -> Doc a
text (Integer -> String
forall a. Show a => a -> String
show Integer
n)
float :: Float -> Doc a
float n :: Float
n = String -> Doc a
forall a. String -> Doc a
text (Float -> String
forall a. Show a => a -> String
show Float
n)
double :: Double -> Doc a
double n :: Double
n = String -> Doc a
forall a. String -> Doc a
text (Double -> String
forall a. Show a => a -> String
show Double
n)
rational :: Rational -> Doc a
rational n :: Rational
n = String -> Doc a
forall a. String -> Doc a
text (Rational -> String
forall a. Show a => a -> String
show Rational
n)
parens :: Doc a -> Doc a
brackets :: Doc a -> Doc a
braces :: Doc a -> Doc a
quotes :: Doc a -> Doc a
doubleQuotes :: Doc a -> Doc a
quotes :: Doc a -> Doc a
quotes p :: Doc a
p = Char -> Doc a
forall a. Char -> Doc a
char '\'' Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Doc a
p Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Char -> Doc a
forall a. Char -> Doc a
char '\''
doubleQuotes :: Doc a -> Doc a
doubleQuotes p :: Doc a
p = Char -> Doc a
forall a. Char -> Doc a
char '"' Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Doc a
p Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Char -> Doc a
forall a. Char -> Doc a
char '"'
parens :: Doc a -> Doc a
parens p :: Doc a
p = Char -> Doc a
forall a. Char -> Doc a
char '(' Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Doc a
p Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Char -> Doc a
forall a. Char -> Doc a
char ')'
brackets :: Doc a -> Doc a
brackets p :: Doc a
p = Char -> Doc a
forall a. Char -> Doc a
char '[' Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Doc a
p Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Char -> Doc a
forall a. Char -> Doc a
char ']'
braces :: Doc a -> Doc a
braces p :: Doc a
p = Char -> Doc a
forall a. Char -> Doc a
char '{' Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Doc a
p Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Char -> Doc a
forall a. Char -> Doc a
char '}'
maybeParens :: Bool -> Doc a -> Doc a
maybeParens :: Bool -> Doc a -> Doc a
maybeParens False = Doc a -> Doc a
forall a. a -> a
id
maybeParens True = Doc a -> Doc a
forall a. Doc a -> Doc a
parens
maybeBrackets :: Bool -> Doc a -> Doc a
maybeBrackets :: Bool -> Doc a -> Doc a
maybeBrackets False = Doc a -> Doc a
forall a. a -> a
id
maybeBrackets True = Doc a -> Doc a
forall a. Doc a -> Doc a
brackets
maybeBraces :: Bool -> Doc a -> Doc a
maybeBraces :: Bool -> Doc a -> Doc a
maybeBraces False = Doc a -> Doc a
forall a. a -> a
id
maybeBraces True = Doc a -> Doc a
forall a. Doc a -> Doc a
braces
maybeQuotes :: Bool -> Doc a -> Doc a
maybeQuotes :: Bool -> Doc a -> Doc a
maybeQuotes False = Doc a -> Doc a
forall a. a -> a
id
maybeQuotes True = Doc a -> Doc a
forall a. Doc a -> Doc a
quotes
maybeDoubleQuotes :: Bool -> Doc a -> Doc a
maybeDoubleQuotes :: Bool -> Doc a -> Doc a
maybeDoubleQuotes False = Doc a -> Doc a
forall a. a -> a
id
maybeDoubleQuotes True = Doc a -> Doc a
forall a. Doc a -> Doc a
doubleQuotes
reduceDoc :: Doc a -> RDoc a
reduceDoc :: Doc a -> Doc a
reduceDoc (Beside p :: Doc a
p g :: Bool
g q :: Doc a
q) = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
p Bool
g (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
q)
reduceDoc (Above p :: Doc a
p g :: Bool
g q :: Doc a
q) = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
above Doc a
p Bool
g (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
q)
reduceDoc p :: Doc a
p = Doc a
p
hcat :: [Doc a] -> Doc a
hcat :: [Doc a] -> Doc a
hcat = (IsEmpty, Doc a) -> Doc a
forall a b. (a, b) -> b
snd ((IsEmpty, Doc a) -> Doc a)
-> ([Doc a] -> (IsEmpty, Doc a)) -> [Doc a] -> Doc a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc a -> (IsEmpty, Doc a)
forall a. Doc a -> (IsEmpty, Doc a)
reduceHoriz (Doc a -> (IsEmpty, Doc a))
-> ([Doc a] -> Doc a) -> [Doc a] -> (IsEmpty, Doc a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Doc a -> Doc a -> Doc a) -> Doc a -> [Doc a] -> Doc a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\p :: Doc a
p q :: Doc a
q -> Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
Beside Doc a
p Bool
False Doc a
q) Doc a
forall a. Doc a
empty
hsep :: [Doc a] -> Doc a
hsep :: [Doc a] -> Doc a
hsep = (IsEmpty, Doc a) -> Doc a
forall a b. (a, b) -> b
snd ((IsEmpty, Doc a) -> Doc a)
-> ([Doc a] -> (IsEmpty, Doc a)) -> [Doc a] -> Doc a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc a -> (IsEmpty, Doc a)
forall a. Doc a -> (IsEmpty, Doc a)
reduceHoriz (Doc a -> (IsEmpty, Doc a))
-> ([Doc a] -> Doc a) -> [Doc a] -> (IsEmpty, Doc a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Doc a -> Doc a -> Doc a) -> Doc a -> [Doc a] -> Doc a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\p :: Doc a
p q :: Doc a
q -> Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
Beside Doc a
p Bool
True Doc a
q) Doc a
forall a. Doc a
empty
vcat :: [Doc a] -> Doc a
vcat :: [Doc a] -> Doc a
vcat = (IsEmpty, Doc a) -> Doc a
forall a b. (a, b) -> b
snd ((IsEmpty, Doc a) -> Doc a)
-> ([Doc a] -> (IsEmpty, Doc a)) -> [Doc a] -> Doc a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc a -> (IsEmpty, Doc a)
forall a. Doc a -> (IsEmpty, Doc a)
reduceVert (Doc a -> (IsEmpty, Doc a))
-> ([Doc a] -> Doc a) -> [Doc a] -> (IsEmpty, Doc a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Doc a -> Doc a -> Doc a) -> Doc a -> [Doc a] -> Doc a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\p :: Doc a
p q :: Doc a
q -> Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
Above Doc a
p Bool
False Doc a
q) Doc a
forall a. Doc a
empty
nest :: Int -> Doc a -> Doc a
nest :: Int -> Doc a -> Doc a
nest k :: Int
k p :: Doc a
p = Int -> Doc a -> Doc a
forall a. Int -> Doc a -> Doc a
mkNest Int
k (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
p)
hang :: Doc a -> Int -> Doc a -> Doc a
hang :: Doc a -> Int -> Doc a -> Doc a
hang d1 :: Doc a
d1 n :: Int
n d2 :: Doc a
d2 = [Doc a] -> Doc a
forall a. [Doc a] -> Doc a
sep [Doc a
d1, Int -> Doc a -> Doc a
forall a. Int -> Doc a -> Doc a
nest Int
n Doc a
d2]
punctuate :: Doc a -> [Doc a] -> [Doc a]
punctuate :: Doc a -> [Doc a] -> [Doc a]
punctuate _ [] = []
punctuate p :: Doc a
p (x :: Doc a
x:xs :: [Doc a]
xs) = Doc a -> [Doc a] -> [Doc a]
go Doc a
x [Doc a]
xs
where go :: Doc a -> [Doc a] -> [Doc a]
go y :: Doc a
y [] = [Doc a
y]
go y :: Doc a
y (z :: Doc a
z:zs :: [Doc a]
zs) = (Doc a
y Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
<> Doc a
p) Doc a -> [Doc a] -> [Doc a]
forall a. a -> [a] -> [a]
: Doc a -> [Doc a] -> [Doc a]
go Doc a
z [Doc a]
zs
mkNest :: Int -> Doc a -> Doc a
mkNest :: Int -> Doc a -> Doc a
mkNest k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = Doc a
forall a. HasCallStack => a
undefined
mkNest k :: Int
k (Nest k1 :: Int
k1 p :: Doc a
p) = Int -> Doc a -> Doc a
forall a. Int -> Doc a -> Doc a
mkNest (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
k1) Doc a
p
mkNest _ NoDoc = Doc a
forall a. Doc a
NoDoc
mkNest _ Empty = Doc a
forall a. Doc a
Empty
mkNest 0 p :: Doc a
p = Doc a
p
mkNest k :: Int
k p :: Doc a
p = Int -> Doc a -> Doc a
forall a. Int -> Doc a -> Doc a
nest_ Int
k Doc a
p
mkUnion :: Doc a -> Doc a -> Doc a
mkUnion :: Doc a -> Doc a -> Doc a
mkUnion Empty _ = Doc a
forall a. Doc a
Empty
mkUnion p :: Doc a
p q :: Doc a
q = Doc a
p Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
`union_` Doc a
q
data IsEmpty = IsEmpty | NotEmpty
reduceHoriz :: Doc a -> (IsEmpty, Doc a)
reduceHoriz :: Doc a -> (IsEmpty, Doc a)
reduceHoriz (Beside p :: Doc a
p g :: Bool
g q :: Doc a
q) = (Doc a -> Bool -> Doc a -> Doc a)
-> Doc a -> Bool -> (IsEmpty, Doc a) -> (IsEmpty, Doc a)
forall a.
(Doc a -> Bool -> Doc a -> Doc a)
-> Doc a -> Bool -> (IsEmpty, Doc a) -> (IsEmpty, Doc a)
eliminateEmpty Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
Beside ((IsEmpty, Doc a) -> Doc a
forall a b. (a, b) -> b
snd (Doc a -> (IsEmpty, Doc a)
forall a. Doc a -> (IsEmpty, Doc a)
reduceHoriz Doc a
p)) Bool
g (Doc a -> (IsEmpty, Doc a)
forall a. Doc a -> (IsEmpty, Doc a)
reduceHoriz Doc a
q)
reduceHoriz doc :: Doc a
doc = (IsEmpty
NotEmpty, Doc a
doc)
reduceVert :: Doc a -> (IsEmpty, Doc a)
reduceVert :: Doc a -> (IsEmpty, Doc a)
reduceVert (Above p :: Doc a
p g :: Bool
g q :: Doc a
q) = (Doc a -> Bool -> Doc a -> Doc a)
-> Doc a -> Bool -> (IsEmpty, Doc a) -> (IsEmpty, Doc a)
forall a.
(Doc a -> Bool -> Doc a -> Doc a)
-> Doc a -> Bool -> (IsEmpty, Doc a) -> (IsEmpty, Doc a)
eliminateEmpty Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
Above ((IsEmpty, Doc a) -> Doc a
forall a b. (a, b) -> b
snd (Doc a -> (IsEmpty, Doc a)
forall a. Doc a -> (IsEmpty, Doc a)
reduceVert Doc a
p)) Bool
g (Doc a -> (IsEmpty, Doc a)
forall a. Doc a -> (IsEmpty, Doc a)
reduceVert Doc a
q)
reduceVert doc :: Doc a
doc = (IsEmpty
NotEmpty, Doc a
doc)
{-# INLINE eliminateEmpty #-}
eliminateEmpty ::
(Doc a -> Bool -> Doc a -> Doc a) ->
Doc a -> Bool -> (IsEmpty, Doc a) -> (IsEmpty, Doc a)
eliminateEmpty :: (Doc a -> Bool -> Doc a -> Doc a)
-> Doc a -> Bool -> (IsEmpty, Doc a) -> (IsEmpty, Doc a)
eliminateEmpty _ Empty _ q :: (IsEmpty, Doc a)
q = (IsEmpty, Doc a)
q
eliminateEmpty cons :: Doc a -> Bool -> Doc a -> Doc a
cons p :: Doc a
p g :: Bool
g q :: (IsEmpty, Doc a)
q =
(IsEmpty
NotEmpty,
case (IsEmpty, Doc a)
q of
(NotEmpty, q' :: Doc a
q') -> Doc a -> Bool -> Doc a -> Doc a
cons Doc a
p Bool
g Doc a
q'
(IsEmpty, _) -> Doc a
p)
nilAbove_ :: RDoc a -> RDoc a
nilAbove_ :: RDoc a -> RDoc a
nilAbove_ = RDoc a -> RDoc a
forall a. Doc a -> Doc a
NilAbove
textBeside_ :: AnnotDetails a -> RDoc a -> RDoc a
textBeside_ :: AnnotDetails a -> RDoc a -> RDoc a
textBeside_ = AnnotDetails a -> RDoc a -> RDoc a
forall a. AnnotDetails a -> Doc a -> Doc a
TextBeside
nest_ :: Int -> RDoc a -> RDoc a
nest_ :: Int -> RDoc a -> RDoc a
nest_ = Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
Nest
union_ :: RDoc a -> RDoc a -> RDoc a
union_ :: RDoc a -> RDoc a -> RDoc a
union_ = RDoc a -> RDoc a -> RDoc a
forall a. Doc a -> Doc a -> Doc a
Union
($$) :: Doc a -> Doc a -> Doc a
p :: Doc a
p $$ :: Doc a -> Doc a -> Doc a
$$ q :: Doc a
q = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
above_ Doc a
p Bool
False Doc a
q
($+$) :: Doc a -> Doc a -> Doc a
p :: Doc a
p $+$ :: Doc a -> Doc a -> Doc a
$+$ q :: Doc a
q = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
above_ Doc a
p Bool
True Doc a
q
above_ :: Doc a -> Bool -> Doc a -> Doc a
above_ :: Doc a -> Bool -> Doc a -> Doc a
above_ p :: Doc a
p _ Empty = Doc a
p
above_ Empty _ q :: Doc a
q = Doc a
q
above_ p :: Doc a
p g :: Bool
g q :: Doc a
q = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
Above Doc a
p Bool
g Doc a
q
above :: Doc a -> Bool -> RDoc a -> RDoc a
above :: Doc a -> Bool -> Doc a -> Doc a
above (Above p :: Doc a
p g1 :: Bool
g1 q1 :: Doc a
q1) g2 :: Bool
g2 q2 :: Doc a
q2 = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
above Doc a
p Bool
g1 (Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
above Doc a
q1 Bool
g2 Doc a
q2)
above p :: Doc a
p@(Beside{}) g :: Bool
g q :: Doc a
q = Doc a -> Bool -> Int -> Doc a -> Doc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
p) Bool
g 0 (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
q)
above p :: Doc a
p g :: Bool
g q :: Doc a
q = Doc a -> Bool -> Int -> Doc a -> Doc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest Doc a
p Bool
g 0 (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
q)
aboveNest :: RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest :: RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest _ _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = RDoc a
forall a. HasCallStack => a
undefined
aboveNest NoDoc _ _ _ = RDoc a
forall a. Doc a
NoDoc
aboveNest (p1 :: RDoc a
p1 `Union` p2 :: RDoc a
p2) g :: Bool
g k :: Int
k q :: RDoc a
q = RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
p1 Bool
g Int
k RDoc a
q RDoc a -> RDoc a -> RDoc a
forall a. Doc a -> Doc a -> Doc a
`union_`
RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
p2 Bool
g Int
k RDoc a
q
aboveNest Empty _ k :: Int
k q :: RDoc a
q = Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
mkNest Int
k RDoc a
q
aboveNest (Nest k1 :: Int
k1 p :: RDoc a
p) g :: Bool
g k :: Int
k q :: RDoc a
q = Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
nest_ Int
k1 (RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
p Bool
g (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k1) RDoc a
q)
aboveNest (NilAbove p :: RDoc a
p) g :: Bool
g k :: Int
k q :: RDoc a
q = RDoc a -> RDoc a
forall a. Doc a -> Doc a
nilAbove_ (RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
p Bool
g Int
k RDoc a
q)
aboveNest (TextBeside s :: AnnotDetails a
s p :: RDoc a
p) g :: Bool
g k :: Int
k q :: RDoc a
q = AnnotDetails a -> RDoc a -> RDoc a
forall a. AnnotDetails a -> Doc a -> Doc a
TextBeside AnnotDetails a
s RDoc a
rest
where
!k1 :: Int
k1 = Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- AnnotDetails a -> Int
forall a. AnnotDetails a -> Int
annotSize AnnotDetails a
s
rest :: RDoc a
rest = case RDoc a
p of
Empty -> Bool -> Int -> RDoc a -> RDoc a
forall a. Bool -> Int -> RDoc a -> RDoc a
nilAboveNest Bool
g Int
k1 RDoc a
q
_ -> RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
p Bool
g Int
k1 RDoc a
q
aboveNest (Above {}) _ _ _ = String -> RDoc a
forall a. HasCallStack => String -> a
error "aboveNest Above"
aboveNest (Beside {}) _ _ _ = String -> RDoc a
forall a. HasCallStack => String -> a
error "aboveNest Beside"
nilAboveNest :: Bool -> Int -> RDoc a -> RDoc a
nilAboveNest :: Bool -> Int -> RDoc a -> RDoc a
nilAboveNest _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = RDoc a
forall a. HasCallStack => a
undefined
nilAboveNest _ _ Empty = RDoc a
forall a. Doc a
Empty
nilAboveNest g :: Bool
g k :: Int
k (Nest k1 :: Int
k1 q :: RDoc a
q) = Bool -> Int -> RDoc a -> RDoc a
forall a. Bool -> Int -> RDoc a -> RDoc a
nilAboveNest Bool
g (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
k1) RDoc a
q
nilAboveNest g :: Bool
g k :: Int
k q :: RDoc a
q | Bool -> Bool
not Bool
g Bool -> Bool -> Bool
&& Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0
= AnnotDetails a -> RDoc a -> RDoc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ (TextDetails -> Int -> AnnotDetails a
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (String -> TextDetails
Str (Int -> String
indent Int
k)) Int
k) RDoc a
q
| Bool
otherwise
= RDoc a -> RDoc a
forall a. Doc a -> Doc a
nilAbove_ (Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
mkNest Int
k RDoc a
q)
(<>) :: Doc a -> Doc a -> Doc a
p :: Doc a
p <> :: Doc a -> Doc a -> Doc a
<> q :: Doc a
q = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside_ Doc a
p Bool
False Doc a
q
(<+>) :: Doc a -> Doc a -> Doc a
p :: Doc a
p <+> :: Doc a -> Doc a -> Doc a
<+> q :: Doc a
q = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside_ Doc a
p Bool
True Doc a
q
beside_ :: Doc a -> Bool -> Doc a -> Doc a
beside_ :: Doc a -> Bool -> Doc a -> Doc a
beside_ p :: Doc a
p _ Empty = Doc a
p
beside_ Empty _ q :: Doc a
q = Doc a
q
beside_ p :: Doc a
p g :: Bool
g q :: Doc a
q = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
Beside Doc a
p Bool
g Doc a
q
beside :: Doc a -> Bool -> RDoc a -> RDoc a
beside :: Doc a -> Bool -> Doc a -> Doc a
beside NoDoc _ _ = Doc a
forall a. Doc a
NoDoc
beside (p1 :: Doc a
p1 `Union` p2 :: Doc a
p2) g :: Bool
g q :: Doc a
q = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
p1 Bool
g Doc a
q Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
`union_` Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
p2 Bool
g Doc a
q
beside Empty _ q :: Doc a
q = Doc a
q
beside (Nest k :: Int
k p :: Doc a
p) g :: Bool
g q :: Doc a
q = Int -> Doc a -> Doc a
forall a. Int -> Doc a -> Doc a
nest_ Int
k (Doc a -> Doc a) -> Doc a -> Doc a
forall a b. (a -> b) -> a -> b
$! Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
p Bool
g Doc a
q
beside p :: Doc a
p@(Beside p1 :: Doc a
p1 g1 :: Bool
g1 q1 :: Doc a
q1) g2 :: Bool
g2 q2 :: Doc a
q2
| Bool
g1 Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
g2 = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
p1 Bool
g1 (Doc a -> Doc a) -> Doc a -> Doc a
forall a b. (a -> b) -> a -> b
$! Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
q1 Bool
g2 Doc a
q2
| Bool
otherwise = Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
p) Bool
g2 Doc a
q2
beside p :: Doc a
p@(Above{}) g :: Bool
g q :: Doc a
q = let !d :: Doc a
d = Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
p in Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
d Bool
g Doc a
q
beside (NilAbove p :: Doc a
p) g :: Bool
g q :: Doc a
q = Doc a -> Doc a
forall a. Doc a -> Doc a
nilAbove_ (Doc a -> Doc a) -> Doc a -> Doc a
forall a b. (a -> b) -> a -> b
$! Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
p Bool
g Doc a
q
beside (TextBeside t :: AnnotDetails a
t p :: Doc a
p) g :: Bool
g q :: Doc a
q = AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
TextBeside AnnotDetails a
t Doc a
rest
where
rest :: Doc a
rest = case Doc a
p of
Empty -> Bool -> Doc a -> Doc a
forall a. Bool -> RDoc a -> RDoc a
nilBeside Bool
g Doc a
q
_ -> Doc a -> Bool -> Doc a -> Doc a
forall a. Doc a -> Bool -> Doc a -> Doc a
beside Doc a
p Bool
g Doc a
q
nilBeside :: Bool -> RDoc a -> RDoc a
nilBeside :: Bool -> RDoc a -> RDoc a
nilBeside _ Empty = RDoc a
forall a. Doc a
Empty
nilBeside g :: Bool
g (Nest _ p :: RDoc a
p) = Bool -> RDoc a -> RDoc a
forall a. Bool -> RDoc a -> RDoc a
nilBeside Bool
g RDoc a
p
nilBeside g :: Bool
g p :: RDoc a
p | Bool
g = AnnotDetails a -> RDoc a -> RDoc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ AnnotDetails a
forall a. AnnotDetails a
spaceText RDoc a
p
| Bool
otherwise = RDoc a
p
sep :: [Doc a] -> Doc a
sep :: [Doc a] -> Doc a
sep = Bool -> [Doc a] -> Doc a
forall a. Bool -> [Doc a] -> Doc a
sepX Bool
True
cat :: [Doc a] -> Doc a
cat :: [Doc a] -> Doc a
cat = Bool -> [Doc a] -> Doc a
forall a. Bool -> [Doc a] -> Doc a
sepX Bool
False
sepX :: Bool -> [Doc a] -> Doc a
sepX :: Bool -> [Doc a] -> Doc a
sepX _ [] = Doc a
forall a. Doc a
empty
sepX x :: Bool
x (p :: Doc a
p:ps :: [Doc a]
ps) = Bool -> Doc a -> Int -> [Doc a] -> Doc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
sep1 Bool
x (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
p) 0 [Doc a]
ps
sep1 :: Bool -> RDoc a -> Int -> [Doc a] -> RDoc a
sep1 :: Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
sep1 _ _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = RDoc a
forall a. HasCallStack => a
undefined
sep1 _ NoDoc _ _ = RDoc a
forall a. Doc a
NoDoc
sep1 g :: Bool
g (p :: RDoc a
p `Union` q :: RDoc a
q) k :: Int
k ys :: [RDoc a]
ys = Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
sep1 Bool
g RDoc a
p Int
k [RDoc a]
ys RDoc a -> RDoc a -> RDoc a
forall a. Doc a -> Doc a -> Doc a
`union_`
RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
q Bool
False Int
k (RDoc a -> RDoc a
forall a. Doc a -> Doc a
reduceDoc ([RDoc a] -> RDoc a
forall a. [Doc a] -> Doc a
vcat [RDoc a]
ys))
sep1 g :: Bool
g Empty k :: Int
k ys :: [RDoc a]
ys = Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
mkNest Int
k (Bool -> [RDoc a] -> RDoc a
forall a. Bool -> [Doc a] -> Doc a
sepX Bool
g [RDoc a]
ys)
sep1 g :: Bool
g (Nest n :: Int
n p :: RDoc a
p) k :: Int
k ys :: [RDoc a]
ys = Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
nest_ Int
n (Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
sep1 Bool
g RDoc a
p (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) [RDoc a]
ys)
sep1 _ (NilAbove p :: RDoc a
p) k :: Int
k ys :: [RDoc a]
ys = RDoc a -> RDoc a
forall a. Doc a -> Doc a
nilAbove_
(RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
p Bool
False Int
k (RDoc a -> RDoc a
forall a. Doc a -> Doc a
reduceDoc ([RDoc a] -> RDoc a
forall a. [Doc a] -> Doc a
vcat [RDoc a]
ys)))
sep1 g :: Bool
g (TextBeside s :: AnnotDetails a
s p :: RDoc a
p) k :: Int
k ys :: [RDoc a]
ys = AnnotDetails a -> RDoc a -> RDoc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ AnnotDetails a
s (Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
sepNB Bool
g RDoc a
p (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- AnnotDetails a -> Int
forall a. AnnotDetails a -> Int
annotSize AnnotDetails a
s) [RDoc a]
ys)
sep1 _ (Above {}) _ _ = String -> RDoc a
forall a. HasCallStack => String -> a
error "sep1 Above"
sep1 _ (Beside {}) _ _ = String -> RDoc a
forall a. HasCallStack => String -> a
error "sep1 Beside"
sepNB :: Bool -> Doc a -> Int -> [Doc a] -> Doc a
sepNB :: Bool -> Doc a -> Int -> [Doc a] -> Doc a
sepNB g :: Bool
g (Nest _ p :: Doc a
p) k :: Int
k ys :: [Doc a]
ys
= Bool -> Doc a -> Int -> [Doc a] -> Doc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
sepNB Bool
g Doc a
p Int
k [Doc a]
ys
sepNB g :: Bool
g Empty k :: Int
k ys :: [Doc a]
ys
= Doc a -> Doc a
forall a. Doc a -> Doc a
oneLiner (Bool -> Doc a -> Doc a
forall a. Bool -> RDoc a -> RDoc a
nilBeside Bool
g (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
rest)) Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
`mkUnion`
Bool -> Int -> Doc a -> Doc a
forall a. Bool -> Int -> RDoc a -> RDoc a
nilAboveNest Bool
False Int
k (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc ([Doc a] -> Doc a
forall a. [Doc a] -> Doc a
vcat [Doc a]
ys))
where
rest :: Doc a
rest | Bool
g = [Doc a] -> Doc a
forall a. [Doc a] -> Doc a
hsep [Doc a]
ys
| Bool
otherwise = [Doc a] -> Doc a
forall a. [Doc a] -> Doc a
hcat [Doc a]
ys
sepNB g :: Bool
g p :: Doc a
p k :: Int
k ys :: [Doc a]
ys
= Bool -> Doc a -> Int -> [Doc a] -> Doc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
sep1 Bool
g Doc a
p Int
k [Doc a]
ys
fcat :: [Doc a] -> Doc a
fcat :: [Doc a] -> Doc a
fcat = Bool -> [Doc a] -> Doc a
forall a. Bool -> [Doc a] -> Doc a
fill Bool
False
fsep :: [Doc a] -> Doc a
fsep :: [Doc a] -> Doc a
fsep = Bool -> [Doc a] -> Doc a
forall a. Bool -> [Doc a] -> Doc a
fill Bool
True
fill :: Bool -> [Doc a] -> RDoc a
fill :: Bool -> [Doc a] -> Doc a
fill _ [] = Doc a
forall a. Doc a
empty
fill g :: Bool
g (p :: Doc a
p:ps :: [Doc a]
ps) = Bool -> Doc a -> Int -> [Doc a] -> Doc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fill1 Bool
g (Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc Doc a
p) 0 [Doc a]
ps
fill1 :: Bool -> RDoc a -> Int -> [Doc a] -> Doc a
fill1 :: Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fill1 _ _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = RDoc a
forall a. HasCallStack => a
undefined
fill1 _ NoDoc _ _ = RDoc a
forall a. Doc a
NoDoc
fill1 g :: Bool
g (p :: RDoc a
p `Union` q :: RDoc a
q) k :: Int
k ys :: [RDoc a]
ys = Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fill1 Bool
g RDoc a
p Int
k [RDoc a]
ys RDoc a -> RDoc a -> RDoc a
forall a. Doc a -> Doc a -> Doc a
`union_`
RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
q Bool
False Int
k (Bool -> [RDoc a] -> RDoc a
forall a. Bool -> [Doc a] -> Doc a
fill Bool
g [RDoc a]
ys)
fill1 g :: Bool
g Empty k :: Int
k ys :: [RDoc a]
ys = Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
mkNest Int
k (Bool -> [RDoc a] -> RDoc a
forall a. Bool -> [Doc a] -> Doc a
fill Bool
g [RDoc a]
ys)
fill1 g :: Bool
g (Nest n :: Int
n p :: RDoc a
p) k :: Int
k ys :: [RDoc a]
ys = Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
nest_ Int
n (Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fill1 Bool
g RDoc a
p (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) [RDoc a]
ys)
fill1 g :: Bool
g (NilAbove p :: RDoc a
p) k :: Int
k ys :: [RDoc a]
ys = RDoc a -> RDoc a
forall a. Doc a -> Doc a
nilAbove_ (RDoc a -> Bool -> Int -> RDoc a -> RDoc a
forall a. RDoc a -> Bool -> Int -> RDoc a -> RDoc a
aboveNest RDoc a
p Bool
False Int
k (Bool -> [RDoc a] -> RDoc a
forall a. Bool -> [Doc a] -> Doc a
fill Bool
g [RDoc a]
ys))
fill1 g :: Bool
g (TextBeside s :: AnnotDetails a
s p :: RDoc a
p) k :: Int
k ys :: [RDoc a]
ys = AnnotDetails a -> RDoc a -> RDoc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ AnnotDetails a
s (Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fillNB Bool
g RDoc a
p (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- AnnotDetails a -> Int
forall a. AnnotDetails a -> Int
annotSize AnnotDetails a
s) [RDoc a]
ys)
fill1 _ (Above {}) _ _ = String -> RDoc a
forall a. HasCallStack => String -> a
error "fill1 Above"
fill1 _ (Beside {}) _ _ = String -> RDoc a
forall a. HasCallStack => String -> a
error "fill1 Beside"
fillNB :: Bool -> Doc a -> Int -> [Doc a] -> Doc a
fillNB :: Bool -> Doc a -> Int -> [Doc a] -> Doc a
fillNB _ _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = Doc a
forall a. HasCallStack => a
undefined
fillNB g :: Bool
g (Nest _ p :: Doc a
p) k :: Int
k ys :: [Doc a]
ys = Bool -> Doc a -> Int -> [Doc a] -> Doc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fillNB Bool
g Doc a
p Int
k [Doc a]
ys
fillNB _ Empty _ [] = Doc a
forall a. Doc a
Empty
fillNB g :: Bool
g Empty k :: Int
k (Empty:ys :: [Doc a]
ys) = Bool -> Doc a -> Int -> [Doc a] -> Doc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fillNB Bool
g Doc a
forall a. Doc a
Empty Int
k [Doc a]
ys
fillNB g :: Bool
g Empty k :: Int
k (y :: Doc a
y:ys :: [Doc a]
ys) = Bool -> Int -> Doc a -> [Doc a] -> Doc a
forall a. Bool -> Int -> Doc a -> [Doc a] -> Doc a
fillNBE Bool
g Int
k Doc a
y [Doc a]
ys
fillNB g :: Bool
g p :: Doc a
p k :: Int
k ys :: [Doc a]
ys = Bool -> Doc a -> Int -> [Doc a] -> Doc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fill1 Bool
g Doc a
p Int
k [Doc a]
ys
fillNBE :: Bool -> Int -> Doc a -> [Doc a] -> Doc a
fillNBE :: Bool -> Int -> Doc a -> [Doc a] -> Doc a
fillNBE g :: Bool
g k :: Int
k y :: Doc a
y ys :: [Doc a]
ys
= Bool -> Doc a -> Doc a
forall a. Bool -> RDoc a -> RDoc a
nilBeside Bool
g (Bool -> Doc a -> Int -> [Doc a] -> Doc a
forall a. Bool -> RDoc a -> Int -> [RDoc a] -> RDoc a
fill1 Bool
g ((Doc a -> Doc a
forall a. Doc a -> Doc a
elideNest (Doc a -> Doc a) -> (Doc a -> Doc a) -> Doc a -> Doc a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc a -> Doc a
forall a. Doc a -> Doc a
oneLiner (Doc a -> Doc a) -> (Doc a -> Doc a) -> Doc a -> Doc a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc a -> Doc a
forall a. Doc a -> Doc a
reduceDoc) Doc a
y) Int
k' [Doc a]
ys)
Doc a -> Doc a -> Doc a
forall a. Doc a -> Doc a -> Doc a
`mkUnion` Bool -> Int -> Doc a -> Doc a
forall a. Bool -> Int -> RDoc a -> RDoc a
nilAboveNest Bool
False Int
k (Bool -> [Doc a] -> Doc a
forall a. Bool -> [Doc a] -> Doc a
fill Bool
g (Doc a
yDoc a -> [Doc a] -> [Doc a]
forall a. a -> [a] -> [a]
:[Doc a]
ys))
where k' :: Int
k' = if Bool
g then Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1 else Int
k
elideNest :: Doc a -> Doc a
elideNest :: Doc a -> Doc a
elideNest (Nest _ d :: Doc a
d) = Doc a
d
elideNest d :: Doc a
d = Doc a
d
best :: Int
-> Int
-> RDoc a
-> RDoc a
best :: Int -> Int -> RDoc a -> RDoc a
best w0 :: Int
w0 r :: Int
r = Int -> RDoc a -> RDoc a
forall a. Int -> Doc a -> Doc a
get Int
w0
where
get :: Int -> Doc a -> Doc a
get w :: Int
w _ | Int
w Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0 Bool -> Bool -> Bool
&& Bool
False = Doc a
forall a. HasCallStack => a
undefined
get _ Empty = Doc a
forall a. Doc a
Empty
get _ NoDoc = Doc a
forall a. Doc a
NoDoc
get w :: Int
w (NilAbove p :: Doc a
p) = Doc a -> Doc a
forall a. Doc a -> Doc a
nilAbove_ (Int -> Doc a -> Doc a
get Int
w Doc a
p)
get w :: Int
w (TextBeside s :: AnnotDetails a
s p :: Doc a
p) = AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ AnnotDetails a
s (Int -> Int -> Doc a -> Doc a
get1 Int
w (AnnotDetails a -> Int
forall a. AnnotDetails a -> Int
annotSize AnnotDetails a
s) Doc a
p)
get w :: Int
w (Nest k :: Int
k p :: Doc a
p) = Int -> Doc a -> Doc a
forall a. Int -> Doc a -> Doc a
nest_ Int
k (Int -> Doc a -> Doc a
get (Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k) Doc a
p)
get w :: Int
w (p :: Doc a
p `Union` q :: Doc a
q) = Int -> Int -> Doc a -> Doc a -> Doc a
forall a. Int -> Int -> Doc a -> Doc a -> Doc a
nicest Int
w Int
r (Int -> Doc a -> Doc a
get Int
w Doc a
p) (Int -> Doc a -> Doc a
get Int
w Doc a
q)
get _ (Above {}) = String -> Doc a
forall a. HasCallStack => String -> a
error "best get Above"
get _ (Beside {}) = String -> Doc a
forall a. HasCallStack => String -> a
error "best get Beside"
get1 :: Int -> Int -> Doc a -> Doc a
get1 w :: Int
w _ _ | Int
w Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0 Bool -> Bool -> Bool
&& Bool
False = Doc a
forall a. HasCallStack => a
undefined
get1 _ _ Empty = Doc a
forall a. Doc a
Empty
get1 _ _ NoDoc = Doc a
forall a. Doc a
NoDoc
get1 w :: Int
w sl :: Int
sl (NilAbove p :: Doc a
p) = Doc a -> Doc a
forall a. Doc a -> Doc a
nilAbove_ (Int -> Doc a -> Doc a
get (Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sl) Doc a
p)
get1 w :: Int
w sl :: Int
sl (TextBeside s :: AnnotDetails a
s p :: Doc a
p) = AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ AnnotDetails a
s (Int -> Int -> Doc a -> Doc a
get1 Int
w (Int
sl Int -> Int -> Int
forall a. Num a => a -> a -> a
+ AnnotDetails a -> Int
forall a. AnnotDetails a -> Int
annotSize AnnotDetails a
s) Doc a
p)
get1 w :: Int
w sl :: Int
sl (Nest _ p :: Doc a
p) = Int -> Int -> Doc a -> Doc a
get1 Int
w Int
sl Doc a
p
get1 w :: Int
w sl :: Int
sl (p :: Doc a
p `Union` q :: Doc a
q) = Int -> Int -> Int -> Doc a -> Doc a -> Doc a
forall a. Int -> Int -> Int -> Doc a -> Doc a -> Doc a
nicest1 Int
w Int
r Int
sl (Int -> Int -> Doc a -> Doc a
get1 Int
w Int
sl Doc a
p)
(Int -> Int -> Doc a -> Doc a
get1 Int
w Int
sl Doc a
q)
get1 _ _ (Above {}) = String -> Doc a
forall a. HasCallStack => String -> a
error "best get1 Above"
get1 _ _ (Beside {}) = String -> Doc a
forall a. HasCallStack => String -> a
error "best get1 Beside"
nicest :: Int -> Int -> Doc a -> Doc a -> Doc a
nicest :: Int -> Int -> Doc a -> Doc a -> Doc a
nicest !Int
w !Int
r = Int -> Int -> Int -> Doc a -> Doc a -> Doc a
forall a. Int -> Int -> Int -> Doc a -> Doc a -> Doc a
nicest1 Int
w Int
r 0
nicest1 :: Int -> Int -> Int -> Doc a -> Doc a -> Doc a
nicest1 :: Int -> Int -> Int -> Doc a -> Doc a -> Doc a
nicest1 !Int
w !Int
r !Int
sl p :: Doc a
p q :: Doc a
q | Int -> Doc a -> Bool
forall a. Int -> Doc a -> Bool
fits ((Int
w Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` Int
r) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sl) Doc a
p = Doc a
p
| Bool
otherwise = Doc a
q
fits :: Int
-> Doc a
-> Bool
fits :: Int -> Doc a -> Bool
fits n :: Int
n _ | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 0 = Bool
False
fits _ NoDoc = Bool
False
fits _ Empty = Bool
True
fits _ (NilAbove _) = Bool
True
fits n :: Int
n (TextBeside s :: AnnotDetails a
s p :: Doc a
p) = Int -> Doc a -> Bool
forall a. Int -> Doc a -> Bool
fits (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- AnnotDetails a -> Int
forall a. AnnotDetails a -> Int
annotSize AnnotDetails a
s) Doc a
p
fits _ (Above {}) = String -> Bool
forall a. HasCallStack => String -> a
error "fits Above"
fits _ (Beside {}) = String -> Bool
forall a. HasCallStack => String -> a
error "fits Beside"
fits _ (Union {}) = String -> Bool
forall a. HasCallStack => String -> a
error "fits Union"
fits _ (Nest {}) = String -> Bool
forall a. HasCallStack => String -> a
error "fits Nest"
first :: Doc a -> Doc a -> Doc a
first :: Doc a -> Doc a -> Doc a
first p :: Doc a
p q :: Doc a
q | Doc a -> Bool
forall a. Doc a -> Bool
nonEmptySet Doc a
p = Doc a
p
| Bool
otherwise = Doc a
q
nonEmptySet :: Doc a -> Bool
nonEmptySet :: Doc a -> Bool
nonEmptySet NoDoc = Bool
False
nonEmptySet (_ `Union` _) = Bool
True
nonEmptySet Empty = Bool
True
nonEmptySet (NilAbove _) = Bool
True
nonEmptySet (TextBeside _ p :: Doc a
p) = Doc a -> Bool
forall a. Doc a -> Bool
nonEmptySet Doc a
p
nonEmptySet (Nest _ p :: Doc a
p) = Doc a -> Bool
forall a. Doc a -> Bool
nonEmptySet Doc a
p
nonEmptySet (Above {}) = String -> Bool
forall a. HasCallStack => String -> a
error "nonEmptySet Above"
nonEmptySet (Beside {}) = String -> Bool
forall a. HasCallStack => String -> a
error "nonEmptySet Beside"
oneLiner :: Doc a -> Doc a
oneLiner :: Doc a -> Doc a
oneLiner NoDoc = Doc a
forall a. Doc a
NoDoc
oneLiner Empty = Doc a
forall a. Doc a
Empty
oneLiner (NilAbove _) = Doc a
forall a. Doc a
NoDoc
oneLiner (TextBeside s :: AnnotDetails a
s p :: Doc a
p) = AnnotDetails a -> Doc a -> Doc a
forall a. AnnotDetails a -> Doc a -> Doc a
textBeside_ AnnotDetails a
s (Doc a -> Doc a
forall a. Doc a -> Doc a
oneLiner Doc a
p)
oneLiner (Nest k :: Int
k p :: Doc a
p) = Int -> Doc a -> Doc a
forall a. Int -> Doc a -> Doc a
nest_ Int
k (Doc a -> Doc a
forall a. Doc a -> Doc a
oneLiner Doc a
p)
oneLiner (p :: Doc a
p `Union` _) = Doc a -> Doc a
forall a. Doc a -> Doc a
oneLiner Doc a
p
oneLiner (Above {}) = String -> Doc a
forall a. HasCallStack => String -> a
error "oneLiner Above"
oneLiner (Beside {}) = String -> Doc a
forall a. HasCallStack => String -> a
error "oneLiner Beside"
data Style
= Style { Style -> Mode
mode :: Mode
, Style -> Int
lineLength :: Int
, Style -> Float
ribbonsPerLine :: Float
}
#if __GLASGOW_HASKELL__ >= 701
deriving (Int -> Style -> ShowS
[Style] -> ShowS
Style -> String
(Int -> Style -> ShowS)
-> (Style -> String) -> ([Style] -> ShowS) -> Show Style
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Style] -> ShowS
$cshowList :: [Style] -> ShowS
show :: Style -> String
$cshow :: Style -> String
showsPrec :: Int -> Style -> ShowS
$cshowsPrec :: Int -> Style -> ShowS
Show, Style -> Style -> Bool
(Style -> Style -> Bool) -> (Style -> Style -> Bool) -> Eq Style
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Style -> Style -> Bool
$c/= :: Style -> Style -> Bool
== :: Style -> Style -> Bool
$c== :: Style -> Style -> Bool
Eq, (forall x. Style -> Rep Style x)
-> (forall x. Rep Style x -> Style) -> Generic Style
forall x. Rep Style x -> Style
forall x. Style -> Rep Style x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Style x -> Style
$cfrom :: forall x. Style -> Rep Style x
Generic)
#endif
style :: Style
style :: Style
style = Style :: Mode -> Int -> Float -> Style
Style { lineLength :: Int
lineLength = 100, ribbonsPerLine :: Float
ribbonsPerLine = 1.5, mode :: Mode
mode = Mode
PageMode }
data Mode = PageMode
| ZigZagMode
| LeftMode
| OneLineMode
#if __GLASGOW_HASKELL__ >= 701
deriving (Int -> Mode -> ShowS
[Mode] -> ShowS
Mode -> String
(Int -> Mode -> ShowS)
-> (Mode -> String) -> ([Mode] -> ShowS) -> Show Mode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Mode] -> ShowS
$cshowList :: [Mode] -> ShowS
show :: Mode -> String
$cshow :: Mode -> String
showsPrec :: Int -> Mode -> ShowS
$cshowsPrec :: Int -> Mode -> ShowS
Show, Mode -> Mode -> Bool
(Mode -> Mode -> Bool) -> (Mode -> Mode -> Bool) -> Eq Mode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Mode -> Mode -> Bool
$c/= :: Mode -> Mode -> Bool
== :: Mode -> Mode -> Bool
$c== :: Mode -> Mode -> Bool
Eq, (forall x. Mode -> Rep Mode x)
-> (forall x. Rep Mode x -> Mode) -> Generic Mode
forall x. Rep Mode x -> Mode
forall x. Mode -> Rep Mode x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Mode x -> Mode
$cfrom :: forall x. Mode -> Rep Mode x
Generic)
#endif
render :: Doc a -> String
render :: Doc a -> String
render = Mode
-> Int
-> Float
-> (TextDetails -> ShowS)
-> String
-> Doc a
-> String
forall a b.
Mode -> Int -> Float -> (TextDetails -> a -> a) -> a -> Doc b -> a
fullRender (Style -> Mode
mode Style
style) (Style -> Int
lineLength Style
style) (Style -> Float
ribbonsPerLine Style
style)
TextDetails -> ShowS
txtPrinter ""
renderStyle :: Style -> Doc a -> String
renderStyle :: Style -> Doc a -> String
renderStyle s :: Style
s = Mode
-> Int
-> Float
-> (TextDetails -> ShowS)
-> String
-> Doc a
-> String
forall a b.
Mode -> Int -> Float -> (TextDetails -> a -> a) -> a -> Doc b -> a
fullRender (Style -> Mode
mode Style
s) (Style -> Int
lineLength Style
s) (Style -> Float
ribbonsPerLine Style
s)
TextDetails -> ShowS
txtPrinter ""
txtPrinter :: TextDetails -> String -> String
txtPrinter :: TextDetails -> ShowS
txtPrinter (Chr c :: Char
c) s :: String
s = Char
cChar -> ShowS
forall a. a -> [a] -> [a]
:String
s
txtPrinter (Str s1 :: String
s1) s2 :: String
s2 = String
s1 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
s2
txtPrinter (PStr s1 :: String
s1) s2 :: String
s2 = String
s1 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
s2
fullRender :: Mode
-> Int
-> Float
-> (TextDetails -> a -> a)
-> a
-> Doc b
-> a
fullRender :: Mode -> Int -> Float -> (TextDetails -> a -> a) -> a -> Doc b -> a
fullRender m :: Mode
m l :: Int
l r :: Float
r txt :: TextDetails -> a -> a
txt = Mode
-> Int -> Float -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
forall b a.
Mode
-> Int -> Float -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
fullRenderAnn Mode
m Int
l Float
r AnnotDetails b -> a -> a
forall a. AnnotDetails a -> a -> a
annTxt
where
annTxt :: AnnotDetails a -> a -> a
annTxt (NoAnnot s :: TextDetails
s _) = TextDetails -> a -> a
txt TextDetails
s
annTxt _ = a -> a
forall a. a -> a
id
fullRenderAnn :: Mode
-> Int
-> Float
-> (AnnotDetails b -> a -> a)
-> a
-> Doc b
-> a
fullRenderAnn :: Mode
-> Int -> Float -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
fullRenderAnn OneLineMode _ _ txt :: AnnotDetails b -> a -> a
txt end :: a
end doc :: Doc b
doc
= AnnotDetails b
-> (Doc b -> Doc b -> Doc b)
-> (AnnotDetails b -> a -> a)
-> a
-> Doc b
-> a
forall b a.
AnnotDetails b
-> (Doc b -> Doc b -> Doc b)
-> (AnnotDetails b -> a -> a)
-> a
-> Doc b
-> a
easyDisplay AnnotDetails b
forall a. AnnotDetails a
spaceText (\_ y :: Doc b
y -> Doc b
y) AnnotDetails b -> a -> a
txt a
end (Doc b -> Doc b
forall a. Doc a -> Doc a
reduceDoc Doc b
doc)
fullRenderAnn LeftMode _ _ txt :: AnnotDetails b -> a -> a
txt end :: a
end doc :: Doc b
doc
= AnnotDetails b
-> (Doc b -> Doc b -> Doc b)
-> (AnnotDetails b -> a -> a)
-> a
-> Doc b
-> a
forall b a.
AnnotDetails b
-> (Doc b -> Doc b -> Doc b)
-> (AnnotDetails b -> a -> a)
-> a
-> Doc b
-> a
easyDisplay AnnotDetails b
forall a. AnnotDetails a
nlText Doc b -> Doc b -> Doc b
forall a. Doc a -> Doc a -> Doc a
first AnnotDetails b -> a -> a
txt a
end (Doc b -> Doc b
forall a. Doc a -> Doc a
reduceDoc Doc b
doc)
fullRenderAnn m :: Mode
m lineLen :: Int
lineLen ribbons :: Float
ribbons txt :: AnnotDetails b -> a -> a
txt rest :: a
rest doc :: Doc b
doc
= Mode -> Int -> Int -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
forall b a.
Mode -> Int -> Int -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
display Mode
m Int
lineLen Int
ribbonLen AnnotDetails b -> a -> a
txt a
rest Doc b
doc'
where
doc' :: Doc b
doc' = Int -> Int -> Doc b -> Doc b
forall a. Int -> Int -> RDoc a -> RDoc a
best Int
bestLineLen Int
ribbonLen (Doc b -> Doc b
forall a. Doc a -> Doc a
reduceDoc Doc b
doc)
bestLineLen, ribbonLen :: Int
ribbonLen :: Int
ribbonLen = Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
round (Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
lineLen Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
ribbons)
bestLineLen :: Int
bestLineLen = case Mode
m of
ZigZagMode -> Int
forall a. Bounded a => a
maxBound
_ -> Int
lineLen
easyDisplay :: AnnotDetails b
-> (Doc b -> Doc b -> Doc b)
-> (AnnotDetails b -> a -> a)
-> a
-> Doc b
-> a
easyDisplay :: AnnotDetails b
-> (Doc b -> Doc b -> Doc b)
-> (AnnotDetails b -> a -> a)
-> a
-> Doc b
-> a
easyDisplay nlSpaceText :: AnnotDetails b
nlSpaceText choose :: Doc b -> Doc b -> Doc b
choose txt :: AnnotDetails b -> a -> a
txt end :: a
end
= Doc b -> a
lay
where
lay :: Doc b -> a
lay NoDoc = String -> a
forall a. HasCallStack => String -> a
error "easyDisplay: NoDoc"
lay (Union p :: Doc b
p q :: Doc b
q) = Doc b -> a
lay (Doc b -> Doc b -> Doc b
choose Doc b
p Doc b
q)
lay (Nest _ p :: Doc b
p) = Doc b -> a
lay Doc b
p
lay Empty = a
end
lay (NilAbove p :: Doc b
p) = AnnotDetails b
nlSpaceText AnnotDetails b -> a -> a
`txt` Doc b -> a
lay Doc b
p
lay (TextBeside s :: AnnotDetails b
s p :: Doc b
p) = AnnotDetails b
s AnnotDetails b -> a -> a
`txt` Doc b -> a
lay Doc b
p
lay (Above {}) = String -> a
forall a. HasCallStack => String -> a
error "easyDisplay Above"
lay (Beside {}) = String -> a
forall a. HasCallStack => String -> a
error "easyDisplay Beside"
display :: Mode -> Int -> Int -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
display :: Mode -> Int -> Int -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
display m :: Mode
m !Int
page_width !Int
ribbon_width txt :: AnnotDetails b -> a -> a
txt end :: a
end doc :: Doc b
doc
= case Int
page_width Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
ribbon_width of { gap_width :: Int
gap_width ->
case Int
gap_width Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` 2 of { shift :: Int
shift ->
let
lay :: Int -> Doc b -> a
lay k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = a
forall a. HasCallStack => a
undefined
lay k :: Int
k (Nest k1 :: Int
k1 p :: Doc b
p) = Int -> Doc b -> a
lay (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
k1) Doc b
p
lay _ Empty = a
end
lay k :: Int
k (NilAbove p :: Doc b
p) = AnnotDetails b
forall a. AnnotDetails a
nlText AnnotDetails b -> a -> a
`txt` Int -> Doc b -> a
lay Int
k Doc b
p
lay k :: Int
k (TextBeside s :: AnnotDetails b
s p :: Doc b
p)
= case Mode
m of
ZigZagMode | Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
gap_width
-> AnnotDetails b
forall a. AnnotDetails a
nlText AnnotDetails b -> a -> a
`txt` (
TextDetails -> Int -> AnnotDetails b
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (String -> TextDetails
Str (Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
shift '/')) Int
shift AnnotDetails b -> a -> a
`txt` (
AnnotDetails b
forall a. AnnotDetails a
nlText AnnotDetails b -> a -> a
`txt`
Int -> AnnotDetails b -> Doc b -> a
lay1 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
shift) AnnotDetails b
s Doc b
p ))
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 0
-> AnnotDetails b
forall a. AnnotDetails a
nlText AnnotDetails b -> a -> a
`txt` (
TextDetails -> Int -> AnnotDetails b
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (String -> TextDetails
Str (Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
shift '\\')) Int
shift AnnotDetails b -> a -> a
`txt` (
AnnotDetails b
forall a. AnnotDetails a
nlText AnnotDetails b -> a -> a
`txt`
Int -> AnnotDetails b -> Doc b -> a
lay1 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
shift) AnnotDetails b
s Doc b
p ))
_ -> Int -> AnnotDetails b -> Doc b -> a
lay1 Int
k AnnotDetails b
s Doc b
p
lay _ (Above {}) = String -> a
forall a. HasCallStack => String -> a
error "display lay Above"
lay _ (Beside {}) = String -> a
forall a. HasCallStack => String -> a
error "display lay Beside"
lay _ NoDoc = String -> a
forall a. HasCallStack => String -> a
error "display lay NoDoc"
lay _ (Union {}) = String -> a
forall a. HasCallStack => String -> a
error "display lay Union"
lay1 :: Int -> AnnotDetails b -> Doc b -> a
lay1 !Int
k s :: AnnotDetails b
s p :: Doc b
p = let !r :: Int
r = Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ AnnotDetails b -> Int
forall a. AnnotDetails a -> Int
annotSize AnnotDetails b
s
in TextDetails -> Int -> AnnotDetails b
forall a. TextDetails -> Int -> AnnotDetails a
NoAnnot (String -> TextDetails
Str (Int -> String
indent Int
k)) Int
k AnnotDetails b -> a -> a
`txt` (AnnotDetails b
s AnnotDetails b -> a -> a
`txt` Int -> Doc b -> a
lay2 Int
r Doc b
p)
lay2 :: Int -> Doc b -> a
lay2 k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = a
forall a. HasCallStack => a
undefined
lay2 k :: Int
k (NilAbove p :: Doc b
p) = AnnotDetails b
forall a. AnnotDetails a
nlText AnnotDetails b -> a -> a
`txt` Int -> Doc b -> a
lay Int
k Doc b
p
lay2 k :: Int
k (TextBeside s :: AnnotDetails b
s p :: Doc b
p) = AnnotDetails b
s AnnotDetails b -> a -> a
`txt` Int -> Doc b -> a
lay2 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ AnnotDetails b -> Int
forall a. AnnotDetails a -> Int
annotSize AnnotDetails b
s) Doc b
p
lay2 k :: Int
k (Nest _ p :: Doc b
p) = Int -> Doc b -> a
lay2 Int
k Doc b
p
lay2 _ Empty = a
end
lay2 _ (Above {}) = String -> a
forall a. HasCallStack => String -> a
error "display lay2 Above"
lay2 _ (Beside {}) = String -> a
forall a. HasCallStack => String -> a
error "display lay2 Beside"
lay2 _ NoDoc = String -> a
forall a. HasCallStack => String -> a
error "display lay2 NoDoc"
lay2 _ (Union {}) = String -> a
forall a. HasCallStack => String -> a
error "display lay2 Union"
in
Int -> Doc b -> a
lay 0 Doc b
doc
}}
data Span a = Span { Span a -> Int
spanStart :: !Int
, Span a -> Int
spanLength :: !Int
, Span a -> a
spanAnnotation :: a
} deriving (Int -> Span a -> ShowS
[Span a] -> ShowS
Span a -> String
(Int -> Span a -> ShowS)
-> (Span a -> String) -> ([Span a] -> ShowS) -> Show (Span a)
forall a. Show a => Int -> Span a -> ShowS
forall a. Show a => [Span a] -> ShowS
forall a. Show a => Span a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Span a] -> ShowS
$cshowList :: forall a. Show a => [Span a] -> ShowS
show :: Span a -> String
$cshow :: forall a. Show a => Span a -> String
showsPrec :: Int -> Span a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Span a -> ShowS
Show,Span a -> Span a -> Bool
(Span a -> Span a -> Bool)
-> (Span a -> Span a -> Bool) -> Eq (Span a)
forall a. Eq a => Span a -> Span a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Span a -> Span a -> Bool
$c/= :: forall a. Eq a => Span a -> Span a -> Bool
== :: Span a -> Span a -> Bool
$c== :: forall a. Eq a => Span a -> Span a -> Bool
Eq)
instance Functor Span where
fmap :: (a -> b) -> Span a -> Span b
fmap f :: a -> b
f (Span x :: Int
x y :: Int
y a :: a
a) = Int -> Int -> b -> Span b
forall a. Int -> Int -> a -> Span a
Span Int
x Int
y (a -> b
f a
a)
data Spans a = Spans { Spans a -> Int
sOffset :: !Int
, Spans a -> [Int -> Span a]
sStack :: [Int -> Span a]
, Spans a -> [Span a]
sSpans :: [Span a]
, Spans a -> String
sOutput :: String
}
renderSpans :: Doc ann -> (String,[Span ann])
renderSpans :: Doc ann -> (String, [Span ann])
renderSpans = Spans ann -> (String, [Span ann])
forall a. Spans a -> (String, [Span a])
finalize
(Spans ann -> (String, [Span ann]))
-> (Doc ann -> Spans ann) -> Doc ann -> (String, [Span ann])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mode
-> Int
-> Float
-> (AnnotDetails ann -> Spans ann -> Spans ann)
-> Spans ann
-> Doc ann
-> Spans ann
forall b a.
Mode
-> Int -> Float -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
fullRenderAnn (Style -> Mode
mode Style
style) (Style -> Int
lineLength Style
style) (Style -> Float
ribbonsPerLine Style
style)
AnnotDetails ann -> Spans ann -> Spans ann
forall a. AnnotDetails a -> Spans a -> Spans a
spanPrinter
$WSpans :: forall a. Int -> [Int -> Span a] -> [Span a] -> String -> Spans a
Spans { sOffset :: Int
sOffset = 0, sStack :: [Int -> Span ann]
sStack = [], sSpans :: [Span ann]
sSpans = [], sOutput :: String
sOutput = "" }
where
finalize :: Spans a -> (String, [Span a])
finalize (Spans size :: Int
size _ spans :: [Span a]
spans out :: String
out) = (String
out, (Span a -> Span a) -> [Span a] -> [Span a]
forall a b. (a -> b) -> [a] -> [b]
map Span a -> Span a
forall a. Span a -> Span a
adjust [Span a]
spans)
where
adjust :: Span a -> Span a
adjust s :: Span a
s = Span a
s { spanStart :: Int
spanStart = Int
size Int -> Int -> Int
forall a. Num a => a -> a -> a
- Span a -> Int
forall a. Span a -> Int
spanStart Span a
s }
mkSpan :: a -> Int -> Int -> Span a
mkSpan a :: a
a end :: Int
end start :: Int
start = $WSpan :: forall a. Int -> Int -> a -> Span a
Span { spanStart :: Int
spanStart = Int
start
, spanLength :: Int
spanLength = Int
start Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
end
, spanAnnotation :: a
spanAnnotation = a
a }
spanPrinter :: AnnotDetails a -> Spans a -> Spans a
spanPrinter AnnotStart s :: Spans a
s =
case Spans a -> [Int -> Span a]
forall a. Spans a -> [Int -> Span a]
sStack Spans a
s of
sp :: Int -> Span a
sp : rest :: [Int -> Span a]
rest -> Spans a
s { sSpans :: [Span a]
sSpans = Int -> Span a
sp (Spans a -> Int
forall a. Spans a -> Int
sOffset Spans a
s) Span a -> [Span a] -> [Span a]
forall a. a -> [a] -> [a]
: Spans a -> [Span a]
forall a. Spans a -> [Span a]
sSpans Spans a
s, sStack :: [Int -> Span a]
sStack = [Int -> Span a]
rest }
_ -> String -> Spans a
forall a. HasCallStack => String -> a
error "renderSpans: stack underflow"
spanPrinter (AnnotEnd a :: a
a) s :: Spans a
s =
Spans a
s { sStack :: [Int -> Span a]
sStack = a -> Int -> Int -> Span a
forall a. a -> Int -> Int -> Span a
mkSpan a
a (Spans a -> Int
forall a. Spans a -> Int
sOffset Spans a
s) (Int -> Span a) -> [Int -> Span a] -> [Int -> Span a]
forall a. a -> [a] -> [a]
: Spans a -> [Int -> Span a]
forall a. Spans a -> [Int -> Span a]
sStack Spans a
s }
spanPrinter (NoAnnot td :: TextDetails
td l :: Int
l) s :: Spans a
s =
case TextDetails
td of
Chr c :: Char
c -> Spans a
s { sOutput :: String
sOutput = Char
c Char -> ShowS
forall a. a -> [a] -> [a]
: Spans a -> String
forall a. Spans a -> String
sOutput Spans a
s, sOffset :: Int
sOffset = Spans a -> Int
forall a. Spans a -> Int
sOffset Spans a
s Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
l }
Str t :: String
t -> Spans a
s { sOutput :: String
sOutput = String
t String -> ShowS
forall a. [a] -> [a] -> [a]
++ Spans a -> String
forall a. Spans a -> String
sOutput Spans a
s, sOffset :: Int
sOffset = Spans a -> Int
forall a. Spans a -> Int
sOffset Spans a
s Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
l }
PStr t :: String
t -> Spans a
s { sOutput :: String
sOutput = String
t String -> ShowS
forall a. [a] -> [a] -> [a]
++ Spans a -> String
forall a. Spans a -> String
sOutput Spans a
s, sOffset :: Int
sOffset = Spans a -> Int
forall a. Spans a -> Int
sOffset Spans a
s Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
l }
renderDecorated :: (ann -> String)
-> (ann -> String)
-> Doc ann -> String
renderDecorated :: (ann -> String) -> (ann -> String) -> Doc ann -> String
renderDecorated startAnn :: ann -> String
startAnn endAnn :: ann -> String
endAnn =
(String, [ann]) -> String
forall a b. (a, b) -> a
finalize ((String, [ann]) -> String)
-> (Doc ann -> (String, [ann])) -> Doc ann -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mode
-> Int
-> Float
-> (AnnotDetails ann -> (String, [ann]) -> (String, [ann]))
-> (String, [ann])
-> Doc ann
-> (String, [ann])
forall b a.
Mode
-> Int -> Float -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
fullRenderAnn (Style -> Mode
mode Style
style) (Style -> Int
lineLength Style
style) (Style -> Float
ribbonsPerLine Style
style)
AnnotDetails ann -> (String, [ann]) -> (String, [ann])
annPrinter
("", [])
where
annPrinter :: AnnotDetails ann -> (String, [ann]) -> (String, [ann])
annPrinter AnnotStart (rest :: String
rest,stack :: [ann]
stack) =
case [ann]
stack of
a :: ann
a : as :: [ann]
as -> (ann -> String
startAnn ann
a String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
rest, [ann]
as)
_ -> String -> (String, [ann])
forall a. HasCallStack => String -> a
error "renderDecorated: stack underflow"
annPrinter (AnnotEnd a :: ann
a) (rest :: String
rest,stack :: [ann]
stack) =
(ann -> String
endAnn ann
a String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
rest, ann
a ann -> [ann] -> [ann]
forall a. a -> [a] -> [a]
: [ann]
stack)
annPrinter (NoAnnot s :: TextDetails
s _) (rest :: String
rest,stack :: [ann]
stack) =
(TextDetails -> ShowS
txtPrinter TextDetails
s String
rest, [ann]
stack)
finalize :: (a, b) -> a
finalize (str :: a
str,_) = a
str
renderDecoratedM :: Monad m
=> (ann -> m r)
-> (ann -> m r)
-> (String -> m r)
-> m r
-> Doc ann -> m r
renderDecoratedM :: (ann -> m r)
-> (ann -> m r) -> (String -> m r) -> m r -> Doc ann -> m r
renderDecoratedM startAnn :: ann -> m r
startAnn endAnn :: ann -> m r
endAnn txt :: String -> m r
txt docEnd :: m r
docEnd =
(m r, [ann]) -> m r
forall a b. (a, b) -> a
finalize ((m r, [ann]) -> m r)
-> (Doc ann -> (m r, [ann])) -> Doc ann -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mode
-> Int
-> Float
-> (AnnotDetails ann -> (m r, [ann]) -> (m r, [ann]))
-> (m r, [ann])
-> Doc ann
-> (m r, [ann])
forall b a.
Mode
-> Int -> Float -> (AnnotDetails b -> a -> a) -> a -> Doc b -> a
fullRenderAnn (Style -> Mode
mode Style
style) (Style -> Int
lineLength Style
style) (Style -> Float
ribbonsPerLine Style
style)
AnnotDetails ann -> (m r, [ann]) -> (m r, [ann])
forall b. AnnotDetails ann -> (m b, [ann]) -> (m b, [ann])
annPrinter
(m r
docEnd, [])
where
annPrinter :: AnnotDetails ann -> (m b, [ann]) -> (m b, [ann])
annPrinter AnnotStart (rest :: m b
rest,stack :: [ann]
stack) =
case [ann]
stack of
a :: ann
a : as :: [ann]
as -> (ann -> m r
startAnn ann
a m r -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m b
rest, [ann]
as)
_ -> String -> (m b, [ann])
forall a. HasCallStack => String -> a
error "renderDecorated: stack underflow"
annPrinter (AnnotEnd a :: ann
a) (rest :: m b
rest,stack :: [ann]
stack) =
(ann -> m r
endAnn ann
a m r -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m b
rest, ann
a ann -> [ann] -> [ann]
forall a. a -> [a] -> [a]
: [ann]
stack)
annPrinter (NoAnnot td :: TextDetails
td _) (rest :: m b
rest,stack :: [ann]
stack) =
case TextDetails
td of
Chr c :: Char
c -> (String -> m r
txt [Char
c] m r -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m b
rest, [ann]
stack)
Str s :: String
s -> (String -> m r
txt String
s m r -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m b
rest, [ann]
stack)
PStr s :: String
s -> (String -> m r
txt String
s m r -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m b
rest, [ann]
stack)
finalize :: (a, b) -> a
finalize (m :: a
m,_) = a
m