{-# OPTIONS_HADDOCK not-home #-}
module Common.Lib.Pretty (
Doc,
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,
empty,
(<>), (<+>), hcat, hsep,
($$), ($+$), vcat,
sep, cat,
fsep, fcat,
nest,
hang, punctuate,
isEmpty,
render,
Style (..),
style,
renderStyle,
fullRender,
Mode (..), TextDetails (..)
) where
import Prelude
import Data.Monoid ()
import Data.String ( IsString (fromString) )
infixl 6 <+>
infixl 5 $$, $+$
isEmpty :: Doc -> Bool;
empty :: Doc
semi :: Doc;
comma :: Doc;
colon :: Doc;
space :: Doc;
equals :: Doc;
lparen :: Doc;
rparen :: Doc;
lbrack :: Doc;
rbrack :: Doc;
lbrace :: Doc;
rbrace :: Doc;
char :: Char -> Doc
text :: String -> Doc
instance IsString Doc where
fromString :: String -> Doc
fromString = String -> Doc
text
ptext :: String -> Doc
sizedText :: Int -> String -> Doc
zeroWidthText :: String -> Doc
int :: Int -> Doc;
integer :: Integer -> Doc;
float :: Float -> Doc;
double :: Double -> Doc;
rational :: Rational -> Doc;
parens :: Doc -> Doc;
brackets :: Doc -> Doc;
braces :: Doc -> Doc;
quotes :: Doc -> Doc;
doubleQuotes :: Doc -> Doc;
instance Semigroup Doc where
p :: Doc
p <> :: Doc -> Doc -> Doc
<> q :: Doc
q = Doc -> Bool -> Doc -> Doc
beside_ Doc
p Bool
False Doc
q
instance Monoid Doc where
mempty :: Doc
mempty = Doc
empty
(<+>) :: Doc -> Doc -> Doc
($$) :: Doc -> Doc -> Doc
($+$) :: Doc -> Doc -> Doc
hcat :: [Doc] -> Doc;
hsep :: [Doc] -> Doc;
vcat :: [Doc] -> Doc;
cat :: [Doc] -> Doc;
sep :: [Doc] -> Doc;
fcat :: [Doc] -> Doc;
fsep :: [Doc] -> Doc;
nest :: Int -> Doc -> Doc
hang :: Doc -> Int -> Doc -> Doc
punctuate :: Doc -> [Doc] -> [Doc]
instance Show Doc where
showsPrec :: Int -> Doc -> ShowS
showsPrec _ = Doc -> ShowS
showDoc
render :: Doc -> String
fullRender :: Mode
-> Int
-> Float
-> (TextDetails -> a -> a)
-> a
-> Doc
-> a
renderStyle :: Style -> Doc -> String
data Style
= Style { Style -> Mode
mode :: Mode
, Style -> Int
lineLength :: Int
, Style -> Float
ribbonsPerLine :: Float
}
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
semi :: Doc
semi = Char -> Doc
char ';'
colon :: Doc
colon = Char -> Doc
char ':'
comma :: Doc
comma = Char -> Doc
char ','
space :: Doc
space = Char -> Doc
char ' '
equals :: Doc
equals = Char -> Doc
char '='
lparen :: Doc
lparen = Char -> Doc
char '('
rparen :: Doc
rparen = Char -> Doc
char ')'
lbrack :: Doc
lbrack = Char -> Doc
char '['
rbrack :: Doc
rbrack = Char -> Doc
char ']'
lbrace :: Doc
lbrace = Char -> Doc
char '{'
rbrace :: Doc
rbrace = Char -> Doc
char '}'
int :: Int -> Doc
int n :: Int
n = String -> Doc
text (Int -> String
forall a. Show a => a -> String
show Int
n)
integer :: Integer -> Doc
integer n :: Integer
n = String -> Doc
text (Integer -> String
forall a. Show a => a -> String
show Integer
n)
float :: Float -> Doc
float n :: Float
n = String -> Doc
text (Float -> String
forall a. Show a => a -> String
show Float
n)
double :: Double -> Doc
double n :: Double
n = String -> Doc
text (Double -> String
forall a. Show a => a -> String
show Double
n)
rational :: Rational -> Doc
rational n :: Rational
n = String -> Doc
text (Rational -> String
forall a. Show a => a -> String
show Rational
n)
quotes :: Doc -> Doc
quotes p :: Doc
p = Char -> Doc
char '\'' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
p Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Char -> Doc
char '\''
doubleQuotes :: Doc -> Doc
doubleQuotes p :: Doc
p = Char -> Doc
char '"' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
p Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Char -> Doc
char '"'
parens :: Doc -> Doc
parens p :: Doc
p = Char -> Doc
char '(' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
p Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Char -> Doc
char ')'
brackets :: Doc -> Doc
brackets p :: Doc
p = Char -> Doc
char '[' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
p Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Char -> Doc
char ']'
braces :: Doc -> Doc
braces p :: Doc
p = Char -> Doc
char '{' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
p Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Char -> Doc
char '}'
hcat :: [Doc] -> Doc
hcat = Doc -> Doc
reduceAB (Doc -> Doc) -> ([Doc] -> Doc) -> [Doc] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Doc -> Doc -> Doc) -> Doc -> [Doc] -> Doc
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Bool -> Doc -> Doc -> Doc
beside_' Bool
False) Doc
empty
hsep :: [Doc] -> Doc
hsep = Doc -> Doc
reduceAB (Doc -> Doc) -> ([Doc] -> Doc) -> [Doc] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Doc -> Doc -> Doc) -> Doc -> [Doc] -> Doc
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Bool -> Doc -> Doc -> Doc
beside_' Bool
True) Doc
empty
vcat :: [Doc] -> Doc
vcat = Doc -> Doc
reduceAB (Doc -> Doc) -> ([Doc] -> Doc) -> [Doc] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Doc -> Doc -> Doc) -> Doc -> [Doc] -> Doc
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Bool -> Doc -> Doc -> Doc
above_' Bool
False) Doc
empty
beside_' :: Bool -> Doc -> Doc -> Doc
beside_' :: Bool -> Doc -> Doc -> Doc
beside_' _ p :: Doc
p Empty = Doc
p
beside_' g :: Bool
g p :: Doc
p q :: Doc
q = Doc -> Bool -> Doc -> Doc
Beside Doc
p Bool
g Doc
q
above_' :: Bool -> Doc -> Doc -> Doc
above_' :: Bool -> Doc -> Doc -> Doc
above_' _ p :: Doc
p Empty = Doc
p
above_' g :: Bool
g p :: Doc
p q :: Doc
q = Doc -> Bool -> Doc -> Doc
Above Doc
p Bool
g Doc
q
reduceAB :: Doc -> Doc
reduceAB :: Doc -> Doc
reduceAB (Above Empty _ q :: Doc
q) = Doc
q
reduceAB (Beside Empty _ q :: Doc
q) = Doc
q
reduceAB doc :: Doc
doc = Doc
doc
hang :: Doc -> Int -> Doc -> Doc
hang d1 :: Doc
d1 n :: Int
n d2 :: Doc
d2 = [Doc] -> Doc
sep [Doc
d1, Int -> Doc -> Doc
nest Int
n Doc
d2]
punctuate :: Doc -> [Doc] -> [Doc]
punctuate _ [] = []
punctuate p :: Doc
p (d :: Doc
d : ds :: [Doc]
ds) = Doc -> [Doc] -> [Doc]
go Doc
d [Doc]
ds
where
go :: Doc -> [Doc] -> [Doc]
go d' :: Doc
d' [] = [Doc
d']
go d' :: Doc
d' (e :: Doc
e : es :: [Doc]
es) = (Doc
d' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
p) Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
: Doc -> [Doc] -> [Doc]
go Doc
e [Doc]
es
data Doc
= Empty
| NilAbove Doc
| TextBeside TextDetails !Int Doc
| Nest !Int Doc
| Union Doc Doc
| NoDoc
| Beside Doc Bool Doc
| Above Doc Bool Doc
type RDoc = Doc
reduceDoc :: Doc -> RDoc
reduceDoc :: Doc -> Doc
reduceDoc (Beside p :: Doc
p g :: Bool
g q :: Doc
q) = Doc -> Bool -> Doc -> Doc
beside Doc
p Bool
g (Doc -> Doc
reduceDoc Doc
q)
reduceDoc (Above p :: Doc
p g :: Bool
g q :: Doc
q) = Doc -> Bool -> Doc -> Doc
above Doc
p Bool
g (Doc -> Doc
reduceDoc Doc
q)
reduceDoc p :: Doc
p = Doc
p
data TextDetails = Chr Char
| Str String
| PStr String
space_text, nl_text :: TextDetails
space_text :: TextDetails
space_text = Char -> TextDetails
Chr ' '
nl_text :: TextDetails
nl_text = Char -> TextDetails
Chr '\n'
nilAbove_ :: RDoc -> RDoc
nilAbove_ :: Doc -> Doc
nilAbove_ = Doc -> Doc
NilAbove
textBeside_ :: TextDetails -> Int -> RDoc -> RDoc
textBeside_ :: TextDetails -> Int -> Doc -> Doc
textBeside_ = TextDetails -> Int -> Doc -> Doc
TextBeside
nest_ :: Int -> RDoc -> RDoc
nest_ :: Int -> Doc -> Doc
nest_ = Int -> Doc -> Doc
Nest
union_ :: RDoc -> RDoc -> RDoc
union_ :: Doc -> Doc -> Doc
union_ = Doc -> Doc -> Doc
Union
empty :: Doc
empty = Doc
Empty
isEmpty :: Doc -> Bool
isEmpty Empty = Bool
True
isEmpty _ = Bool
False
char :: Char -> Doc
char c :: Char
c = TextDetails -> Int -> Doc -> Doc
textBeside_ (Char -> TextDetails
Chr Char
c) 1 Doc
Empty
text :: String -> Doc
text s :: String
s = case String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s of {sl :: Int
sl -> TextDetails -> Int -> Doc -> Doc
textBeside_ (String -> TextDetails
Str String
s) Int
sl Doc
Empty}
ptext :: String -> Doc
ptext s :: String
s = case String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s of {sl :: Int
sl -> TextDetails -> Int -> Doc -> Doc
textBeside_ (String -> TextDetails
PStr String
s) Int
sl Doc
Empty}
sizedText :: Int -> String -> Doc
sizedText l :: Int
l s :: String
s = TextDetails -> Int -> Doc -> Doc
textBeside_ (String -> TextDetails
Str String
s) Int
l Doc
Empty
zeroWidthText :: String -> Doc
zeroWidthText = Int -> String -> Doc
sizedText 0
nest :: Int -> Doc -> Doc
nest k :: Int
k p :: Doc
p = Int -> Doc -> Doc
mkNest Int
k (Doc -> Doc
reduceDoc Doc
p)
mkNest :: Int -> Doc -> Doc
mkNest :: Int -> Doc -> Doc
mkNest k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = Doc
forall a. HasCallStack => a
undefined
mkNest k :: Int
k (Nest k1 :: Int
k1 p :: Doc
p) = Int -> Doc -> Doc
mkNest (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
k1) Doc
p
mkNest _ NoDoc = Doc
NoDoc
mkNest _ Empty = Doc
Empty
mkNest 0 p :: Doc
p = Doc
p
mkNest k :: Int
k p :: Doc
p = Int -> Doc -> Doc
nest_ Int
k Doc
p
mkUnion :: Doc -> Doc -> Doc
mkUnion :: Doc -> Doc -> Doc
mkUnion Empty _ = Doc
Empty
mkUnion p :: Doc
p q :: Doc
q = Doc
p Doc -> Doc -> Doc
`union_` Doc
q
above_ :: Doc -> Bool -> Doc -> Doc
above_ :: Doc -> Bool -> Doc -> Doc
above_ p :: Doc
p _ Empty = Doc
p
above_ Empty _ q :: Doc
q = Doc
q
above_ p :: Doc
p g :: Bool
g q :: Doc
q = Doc -> Bool -> Doc -> Doc
Above Doc
p Bool
g Doc
q
p :: Doc
p $$ :: Doc -> Doc -> Doc
$$ q :: Doc
q = Doc -> Bool -> Doc -> Doc
above_ Doc
p Bool
False Doc
q
p :: Doc
p $+$ :: Doc -> Doc -> Doc
$+$ q :: Doc
q = Doc -> Bool -> Doc -> Doc
above_ Doc
p Bool
True Doc
q
above :: Doc -> Bool -> RDoc -> RDoc
above :: Doc -> Bool -> Doc -> Doc
above (Above p :: Doc
p g1 :: Bool
g1 q1 :: Doc
q1) g2 :: Bool
g2 q2 :: Doc
q2 = Doc -> Bool -> Doc -> Doc
above Doc
p Bool
g1 (Doc -> Bool -> Doc -> Doc
above Doc
q1 Bool
g2 Doc
q2)
above p :: Doc
p@(Beside {}) g :: Bool
g q :: Doc
q = Doc -> Bool -> Int -> Doc -> Doc
aboveNest (Doc -> Doc
reduceDoc Doc
p) Bool
g 0 (Doc -> Doc
reduceDoc Doc
q)
above p :: Doc
p g :: Bool
g q :: Doc
q = Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
p Bool
g 0 (Doc -> Doc
reduceDoc Doc
q)
aboveNest :: RDoc -> Bool -> Int -> RDoc -> RDoc
aboveNest :: Doc -> Bool -> Int -> Doc -> Doc
aboveNest _ _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = Doc
forall a. HasCallStack => a
undefined
aboveNest NoDoc _ _ _ = Doc
NoDoc
aboveNest (p1 :: Doc
p1 `Union` p2 :: Doc
p2) g :: Bool
g k :: Int
k q :: Doc
q = Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
p1 Bool
g Int
k Doc
q Doc -> Doc -> Doc
`union_`
Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
p2 Bool
g Int
k Doc
q
aboveNest Empty _ k :: Int
k q :: Doc
q = Int -> Doc -> Doc
mkNest Int
k Doc
q
aboveNest (Nest k1 :: Int
k1 p :: Doc
p) g :: Bool
g k :: Int
k q :: Doc
q = Int -> Doc -> Doc
nest_ Int
k1 (Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
p Bool
g (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k1) Doc
q)
aboveNest (NilAbove p :: Doc
p) g :: Bool
g k :: Int
k q :: Doc
q = Doc -> Doc
nilAbove_ (Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
p Bool
g Int
k Doc
q)
aboveNest (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p) g :: Bool
g k :: Int
k q :: Doc
q = Int
k1 Int -> Doc -> Doc
forall a b. a -> b -> b
`seq` TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
s Int
sl Doc
rest
where
k1 :: Int
k1 = Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sl
rest :: Doc
rest = case Doc
p of
Empty -> Bool -> Int -> Doc -> Doc
nilAboveNest Bool
g Int
k1 Doc
q
_ -> Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
p Bool
g Int
k1 Doc
q
aboveNest (Above {}) _ _ _ = String -> Doc
forall a. HasCallStack => String -> a
error "aboveNest Above"
aboveNest (Beside {}) _ _ _ = String -> Doc
forall a. HasCallStack => String -> a
error "aboveNest Beside"
nilAboveNest :: Bool -> Int -> RDoc -> RDoc
nilAboveNest :: Bool -> Int -> Doc -> Doc
nilAboveNest _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = Doc
forall a. HasCallStack => a
undefined
nilAboveNest _ _ Empty = Doc
Empty
nilAboveNest g :: Bool
g k :: Int
k (Nest k1 :: Int
k1 q :: Doc
q) = Bool -> Int -> Doc -> Doc
nilAboveNest Bool
g (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
k1) Doc
q
nilAboveNest g :: Bool
g k :: Int
k q :: Doc
q | Bool -> Bool
not Bool
g Bool -> Bool -> Bool
&& Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0
= TextDetails -> Int -> Doc -> Doc
textBeside_ (String -> TextDetails
Str (Int -> String
indent Int
k)) Int
k Doc
q
| Bool
otherwise
= Doc -> Doc
nilAbove_ (Int -> Doc -> Doc
mkNest Int
k Doc
q)
beside_ :: Doc -> Bool -> Doc -> Doc
beside_ :: Doc -> Bool -> Doc -> Doc
beside_ p :: Doc
p _ Empty = Doc
p
beside_ Empty _ q :: Doc
q = Doc
q
beside_ p :: Doc
p g :: Bool
g q :: Doc
q = Doc -> Bool -> Doc -> Doc
Beside Doc
p Bool
g Doc
q
p :: Doc
p <+> :: Doc -> Doc -> Doc
<+> q :: Doc
q = Doc -> Bool -> Doc -> Doc
beside_ Doc
p Bool
True Doc
q
beside :: Doc -> Bool -> RDoc -> RDoc
beside :: Doc -> Bool -> Doc -> Doc
beside NoDoc _ _ = Doc
NoDoc
beside (p1 :: Doc
p1 `Union` p2 :: Doc
p2) g :: Bool
g q :: Doc
q = Doc -> Bool -> Doc -> Doc
beside Doc
p1 Bool
g Doc
q Doc -> Doc -> Doc
`union_` Doc -> Bool -> Doc -> Doc
beside Doc
p2 Bool
g Doc
q
beside Empty _ q :: Doc
q = Doc
q
beside (Nest k :: Int
k p :: Doc
p) g :: Bool
g q :: Doc
q = Int -> Doc -> Doc
nest_ Int
k (Doc -> Bool -> Doc -> Doc
beside Doc
p Bool
g Doc
q)
beside p :: Doc
p@(Beside p1 :: Doc
p1 g1 :: Bool
g1 q1 :: Doc
q1) g2 :: Bool
g2 q2 :: Doc
q2
| Bool
g1 Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
g2 = Doc -> Bool -> Doc -> Doc
beside Doc
p1 Bool
g1 (Doc -> Bool -> Doc -> Doc
beside Doc
q1 Bool
g2 Doc
q2)
| Bool
otherwise = Doc -> Bool -> Doc -> Doc
beside (Doc -> Doc
reduceDoc Doc
p) Bool
g2 Doc
q2
beside p :: Doc
p@(Above {}) g :: Bool
g q :: Doc
q = Doc -> Bool -> Doc -> Doc
beside (Doc -> Doc
reduceDoc Doc
p) Bool
g Doc
q
beside (NilAbove p :: Doc
p) g :: Bool
g q :: Doc
q = Doc -> Doc
nilAbove_ (Doc -> Bool -> Doc -> Doc
beside Doc
p Bool
g Doc
q)
beside (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p) g :: Bool
g q :: Doc
q = TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
s Int
sl Doc
rest
where
rest :: Doc
rest = case Doc
p of
Empty -> Bool -> Doc -> Doc
nilBeside Bool
g Doc
q
_ -> Doc -> Bool -> Doc -> Doc
beside Doc
p Bool
g Doc
q
nilBeside :: Bool -> RDoc -> RDoc
nilBeside :: Bool -> Doc -> Doc
nilBeside _ Empty = Doc
Empty
nilBeside g :: Bool
g (Nest _ p :: Doc
p) = Bool -> Doc -> Doc
nilBeside Bool
g Doc
p
nilBeside g :: Bool
g p :: Doc
p | Bool
g = TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
space_text 1 Doc
p
| Bool
otherwise = Doc
p
sep :: [Doc] -> Doc
sep = Bool -> [Doc] -> Doc
sepX Bool
True
cat :: [Doc] -> Doc
cat = Bool -> [Doc] -> Doc
sepX Bool
False
sepX :: Bool -> [Doc] -> Doc
sepX :: Bool -> [Doc] -> Doc
sepX _ [] = Doc
empty
sepX x :: Bool
x (p :: Doc
p : ps :: [Doc]
ps) = Bool -> Doc -> Int -> [Doc] -> Doc
sep1 Bool
x (Doc -> Doc
reduceDoc Doc
p) 0 [Doc]
ps
sep1 :: Bool -> RDoc -> Int -> [Doc] -> RDoc
sep1 :: Bool -> Doc -> Int -> [Doc] -> Doc
sep1 _ _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = Doc
forall a. HasCallStack => a
undefined
sep1 _ NoDoc _ _ = Doc
NoDoc
sep1 g :: Bool
g (p :: Doc
p `Union` q :: Doc
q) k :: Int
k ys :: [Doc]
ys = Bool -> Doc -> Int -> [Doc] -> Doc
sep1 Bool
g Doc
p Int
k [Doc]
ys
Doc -> Doc -> Doc
`union_`
Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
q Bool
False Int
k (Doc -> Doc
reduceDoc ([Doc] -> Doc
vcat [Doc]
ys))
sep1 g :: Bool
g Empty k :: Int
k ys :: [Doc]
ys = Int -> Doc -> Doc
mkNest Int
k (Bool -> [Doc] -> Doc
sepX Bool
g [Doc]
ys)
sep1 g :: Bool
g (Nest n :: Int
n p :: Doc
p) k :: Int
k ys :: [Doc]
ys = Int -> Doc -> Doc
nest_ Int
n (Bool -> Doc -> Int -> [Doc] -> Doc
sep1 Bool
g Doc
p (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) [Doc]
ys)
sep1 _ (NilAbove p :: Doc
p) k :: Int
k ys :: [Doc]
ys = Doc -> Doc
nilAbove_
(Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
p Bool
False Int
k (Doc -> Doc
reduceDoc ([Doc] -> Doc
vcat [Doc]
ys)))
sep1 g :: Bool
g (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p) k :: Int
k ys :: [Doc]
ys = TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
s Int
sl (Bool -> Doc -> Int -> [Doc] -> Doc
sepNB Bool
g Doc
p (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sl) [Doc]
ys)
sep1 _ (Above {}) _ _ = String -> Doc
forall a. HasCallStack => String -> a
error "sep1 Above"
sep1 _ (Beside {}) _ _ = String -> Doc
forall a. HasCallStack => String -> a
error "sep1 Beside"
sepNB :: Bool -> Doc -> Int -> [Doc] -> Doc
sepNB :: Bool -> Doc -> Int -> [Doc] -> Doc
sepNB g :: Bool
g (Nest _ p :: Doc
p) k :: Int
k ys :: [Doc]
ys = Bool -> Doc -> Int -> [Doc] -> Doc
sepNB Bool
g Doc
p Int
k [Doc]
ys
sepNB g :: Bool
g Empty k :: Int
k ys :: [Doc]
ys = Doc -> Doc
oneLiner (Bool -> Doc -> Doc
nilBeside Bool
g (Doc -> Doc
reduceDoc Doc
rest))
Doc -> Doc -> Doc
`mkUnion`
Bool -> Int -> Doc -> Doc
nilAboveNest Bool
True Int
k (Doc -> Doc
reduceDoc ([Doc] -> Doc
vcat [Doc]
ys))
where
rest :: Doc
rest | Bool
g = [Doc] -> Doc
hsep [Doc]
ys
| Bool
otherwise = [Doc] -> Doc
hcat [Doc]
ys
sepNB g :: Bool
g p :: Doc
p k :: Int
k ys :: [Doc]
ys = Bool -> Doc -> Int -> [Doc] -> Doc
sep1 Bool
g Doc
p Int
k [Doc]
ys
fsep :: [Doc] -> Doc
fsep = Bool -> [Doc] -> Doc
fill Bool
True
fcat :: [Doc] -> Doc
fcat = Bool -> [Doc] -> Doc
fill Bool
False
fill :: Bool -> [Doc] -> RDoc
fill :: Bool -> [Doc] -> Doc
fill _ [] = Doc
empty
fill g :: Bool
g (p :: Doc
p : ps :: [Doc]
ps) = Bool -> Doc -> Int -> [Doc] -> Doc
fill1 Bool
g (Doc -> Doc
reduceDoc Doc
p) 0 [Doc]
ps
fill1 :: Bool -> RDoc -> Int -> [Doc] -> Doc
fill1 :: Bool -> Doc -> Int -> [Doc] -> Doc
fill1 _ _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = Doc
forall a. HasCallStack => a
undefined
fill1 _ NoDoc _ _ = Doc
NoDoc
fill1 g :: Bool
g (p :: Doc
p `Union` q :: Doc
q) k :: Int
k ys :: [Doc]
ys = Bool -> Doc -> Int -> [Doc] -> Doc
fill1 Bool
g Doc
p Int
k [Doc]
ys
Doc -> Doc -> Doc
`union_`
Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
q Bool
False Int
k (Bool -> [Doc] -> Doc
fill Bool
g [Doc]
ys)
fill1 g :: Bool
g Empty k :: Int
k ys :: [Doc]
ys = Int -> Doc -> Doc
mkNest Int
k (Bool -> [Doc] -> Doc
fill Bool
g [Doc]
ys)
fill1 g :: Bool
g (Nest n :: Int
n p :: Doc
p) k :: Int
k ys :: [Doc]
ys = Int -> Doc -> Doc
nest_ Int
n (Bool -> Doc -> Int -> [Doc] -> Doc
fill1 Bool
g Doc
p (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) [Doc]
ys)
fill1 g :: Bool
g (NilAbove p :: Doc
p) k :: Int
k ys :: [Doc]
ys = Doc -> Doc
nilAbove_ (Doc -> Bool -> Int -> Doc -> Doc
aboveNest Doc
p Bool
False Int
k (Bool -> [Doc] -> Doc
fill Bool
g [Doc]
ys))
fill1 g :: Bool
g (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p) k :: Int
k ys :: [Doc]
ys = TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
s Int
sl (Bool -> Doc -> Int -> [Doc] -> Doc
fillNB Bool
g Doc
p (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sl) [Doc]
ys)
fill1 _ (Above {}) _ _ = String -> Doc
forall a. HasCallStack => String -> a
error "fill1 Above"
fill1 _ (Beside {}) _ _ = String -> Doc
forall a. HasCallStack => String -> a
error "fill1 Beside"
fillNB :: Bool -> Doc -> Int -> [Doc] -> Doc
fillNB :: Bool -> Doc -> Int -> [Doc] -> Doc
fillNB _ _ k :: Int
k _ | Int
k Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = Doc
forall a. HasCallStack => a
undefined
fillNB g :: Bool
g (Nest _ p :: Doc
p) k :: Int
k ys :: [Doc]
ys = Bool -> Doc -> Int -> [Doc] -> Doc
fillNB Bool
g Doc
p Int
k [Doc]
ys
fillNB _ Empty _ [] = Doc
Empty
fillNB g :: Bool
g Empty k :: Int
k (Empty : ys :: [Doc]
ys) = Bool -> Doc -> Int -> [Doc] -> Doc
fillNB Bool
g Doc
Empty Int
k [Doc]
ys
fillNB g :: Bool
g Empty k :: Int
k (y :: Doc
y : ys :: [Doc]
ys) = Bool -> Int -> Doc -> [Doc] -> Doc
fillNBE Bool
g Int
k Doc
y [Doc]
ys
fillNB g :: Bool
g p :: Doc
p k :: Int
k ys :: [Doc]
ys = Bool -> Doc -> Int -> [Doc] -> Doc
fill1 Bool
g Doc
p Int
k [Doc]
ys
fillNBE :: Bool -> Int -> Doc -> [Doc] -> Doc
fillNBE :: Bool -> Int -> Doc -> [Doc] -> Doc
fillNBE g :: Bool
g k :: Int
k y :: Doc
y ys :: [Doc]
ys = Bool -> Doc -> Doc
nilBeside Bool
g
(Bool -> Doc -> Int -> [Doc] -> Doc
fill1 Bool
g ((Doc -> Doc
elideNest (Doc -> Doc) -> (Doc -> Doc) -> Doc -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> Doc
oneLiner (Doc -> Doc) -> (Doc -> Doc) -> Doc -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> Doc
reduceDoc) Doc
y)
Int
k1 [Doc]
ys)
Doc -> Doc -> Doc
`mkUnion`
Bool -> Int -> Doc -> Doc
nilAboveNest Bool
True Int
k (Bool -> [Doc] -> Doc
fill Bool
g (Doc
y Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
: [Doc]
ys))
where
k1 :: Int
k1 | Bool
g = Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
| Bool
otherwise = Int
k
elideNest :: Doc -> Doc
elideNest :: Doc -> Doc
elideNest (Nest _ d :: Doc
d) = Doc
d
elideNest d :: Doc
d = Doc
d
best :: Mode
-> Int
-> Int
-> RDoc
-> RDoc
best :: Mode -> Int -> Int -> Doc -> Doc
best OneLineMode _ _ p0 :: Doc
p0
= Doc -> Doc
get Doc
p0
where
get :: Doc -> Doc
get Empty = Doc
Empty
get NoDoc = Doc
NoDoc
get (NilAbove p :: Doc
p) = Doc -> Doc
nilAbove_ (Doc -> Doc
get Doc
p)
get (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p) = TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
s Int
sl (Doc -> Doc
get Doc
p)
get (Nest _ p :: Doc
p) = Doc -> Doc
get Doc
p
get (p :: Doc
p `Union` q :: Doc
q) = Doc -> Doc -> Doc
first (Doc -> Doc
get Doc
p) (Doc -> Doc
get Doc
q)
get (Above {}) = String -> Doc
forall a. HasCallStack => String -> a
error "best OneLineMode get Above"
get (Beside {}) = String -> Doc
forall a. HasCallStack => String -> a
error "best OneLineMode get Beside"
best _ w0 :: Int
w0 r :: Int
r p0 :: Doc
p0
= Int -> Doc -> Doc
get Int
w0 Doc
p0
where
get :: Int
-> Doc -> Doc
get :: Int -> Doc -> Doc
get w :: Int
w _ | Int
w Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0 Bool -> Bool -> Bool
&& Bool
False = Doc
forall a. HasCallStack => a
undefined
get _ Empty = Doc
Empty
get _ NoDoc = Doc
NoDoc
get w :: Int
w (NilAbove p :: Doc
p) = Doc -> Doc
nilAbove_ (Int -> Doc -> Doc
get Int
w Doc
p)
get w :: Int
w (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p) = TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
s Int
sl (Int -> Int -> Doc -> Doc
get1 Int
w Int
sl Doc
p)
get w :: Int
w (Nest k :: Int
k p :: Doc
p) = Int -> Doc -> Doc
nest_ Int
k (Int -> Doc -> Doc
get (Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k) Doc
p)
get w :: Int
w (p :: Doc
p `Union` q :: Doc
q) = Int -> Int -> Doc -> Doc -> Doc
nicest Int
w Int
r (Int -> Doc -> Doc
get Int
w Doc
p) (Int -> Doc -> Doc
get Int
w Doc
q)
get _ (Above {}) = String -> Doc
forall a. HasCallStack => String -> a
error "best get Above"
get _ (Beside {}) = String -> Doc
forall a. HasCallStack => String -> a
error "best get Beside"
get1 :: Int
-> Int
-> Doc
-> Doc
get1 :: Int -> Int -> Doc -> Doc
get1 w :: Int
w _ _ | Int
w Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0 Bool -> Bool -> Bool
&& Bool
False = Doc
forall a. HasCallStack => a
undefined
get1 _ _ Empty = Doc
Empty
get1 _ _ NoDoc = Doc
NoDoc
get1 w :: Int
w sl :: Int
sl (NilAbove p :: Doc
p) = Doc -> Doc
nilAbove_ (Int -> Doc -> Doc
get (Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sl) Doc
p)
get1 w :: Int
w sl :: Int
sl (TextBeside t :: TextDetails
t tl :: Int
tl p :: Doc
p) = TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
t Int
tl (Int -> Int -> Doc -> Doc
get1 Int
w (Int
sl Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
tl) Doc
p)
get1 w :: Int
w sl :: Int
sl (Nest _ p :: Doc
p) = Int -> Int -> Doc -> Doc
get1 Int
w Int
sl Doc
p
get1 w :: Int
w sl :: Int
sl (p :: Doc
p `Union` q :: Doc
q) = Int -> Int -> Int -> Doc -> Doc -> Doc
nicest1 Int
w Int
r Int
sl (Int -> Int -> Doc -> Doc
get1 Int
w Int
sl Doc
p)
(Int -> Int -> Doc -> Doc
get1 Int
w Int
sl Doc
q)
get1 _ _ (Above {}) = String -> Doc
forall a. HasCallStack => String -> a
error "best get1 Above"
get1 _ _ (Beside {}) = String -> Doc
forall a. HasCallStack => String -> a
error "best get1 Beside"
nicest :: Int -> Int -> Doc -> Doc -> Doc
nicest :: Int -> Int -> Doc -> Doc -> Doc
nicest w :: Int
w r :: Int
r = Int -> Int -> Int -> Doc -> Doc -> Doc
nicest1 Int
w Int
r 0
nicest1 :: Int -> Int -> Int -> Doc -> Doc -> Doc
nicest1 :: Int -> Int -> Int -> Doc -> Doc -> Doc
nicest1 w :: Int
w r :: Int
r sl :: Int
sl p :: Doc
p q :: Doc
q | Int -> Doc -> Bool
fits ((Int
w Int -> Int -> Int
`minn` Int
r) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sl) Doc
p = Doc
p
| Bool
otherwise = Doc
q
fits :: Int
-> Doc
-> Bool
fits :: Int -> Doc -> 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 _ sl :: Int
sl p :: Doc
p) = Int -> Doc -> Bool
fits (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sl) Doc
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"
minn :: Int -> Int -> Int
minn :: Int -> Int -> Int
minn x :: Int
x y :: Int
y | Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
y = Int
x
| Bool
otherwise = Int
y
first :: Doc -> Doc -> Doc
first :: Doc -> Doc -> Doc
first p :: Doc
p q :: Doc
q | Doc -> Bool
nonEmptySet Doc
p = Doc
p
| Bool
otherwise = Doc
q
nonEmptySet :: Doc -> Bool
nonEmptySet :: Doc -> Bool
nonEmptySet NoDoc = Bool
False
nonEmptySet (_ `Union` _) = Bool
True
nonEmptySet Empty = Bool
True
nonEmptySet (NilAbove _) = Bool
True
nonEmptySet (TextBeside _ _ p :: Doc
p) = Doc -> Bool
nonEmptySet Doc
p
nonEmptySet (Nest _ p :: Doc
p) = Doc -> Bool
nonEmptySet Doc
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 -> Doc
oneLiner :: Doc -> Doc
oneLiner NoDoc = Doc
NoDoc
oneLiner Empty = Doc
Empty
oneLiner (NilAbove _) = Doc
NoDoc
oneLiner (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p) = TextDetails -> Int -> Doc -> Doc
textBeside_ TextDetails
s Int
sl (Doc -> Doc
oneLiner Doc
p)
oneLiner (Nest k :: Int
k p :: Doc
p) = Int -> Doc -> Doc
nest_ Int
k (Doc -> Doc
oneLiner Doc
p)
oneLiner (p :: Doc
p `Union` _) = Doc -> Doc
oneLiner Doc
p
oneLiner (Above {}) = String -> Doc
forall a. HasCallStack => String -> a
error "oneLiner Above"
oneLiner (Beside {}) = String -> Doc
forall a. HasCallStack => String -> a
error "oneLiner Beside"
renderStyle :: Style -> Doc -> String
renderStyle the_style :: Style
the_style
= Mode
-> Int
-> Float
-> (TextDetails -> ShowS)
-> String
-> Doc
-> String
forall a.
Mode -> Int -> Float -> (TextDetails -> a -> a) -> a -> Doc -> a
fullRender (Style -> Mode
mode Style
the_style)
(Style -> Int
lineLength Style
the_style)
(Style -> Float
ribbonsPerLine Style
the_style)
TextDetails -> ShowS
string_txt
""
render :: Doc -> String
render doc :: Doc
doc = Doc -> ShowS
showDoc Doc
doc ""
showDoc :: Doc -> String -> String
showDoc :: Doc -> ShowS
showDoc doc :: Doc
doc rest :: String
rest = Mode
-> Int
-> Float
-> (TextDetails -> ShowS)
-> String
-> Doc
-> String
forall a.
Mode -> Int -> Float -> (TextDetails -> a -> a) -> a -> Doc -> a
fullRender Mode
PageMode 100 1.5 TextDetails -> ShowS
string_txt String
rest Doc
doc
string_txt :: TextDetails -> String -> String
string_txt :: TextDetails -> ShowS
string_txt (Chr c :: Char
c) s :: String
s = Char
c Char -> ShowS
forall a. a -> [a] -> [a]
: String
s
string_txt (Str s1 :: String
s1) s2 :: String
s2 = String
s1 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
s2
string_txt (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 -> a
fullRender OneLineMode _ _ txt :: TextDetails -> a -> a
txt end :: a
end doc :: Doc
doc
= TextDetails -> (TextDetails -> a -> a) -> a -> Doc -> a
forall a. TextDetails -> (TextDetails -> a -> a) -> a -> Doc -> a
easy_display TextDetails
space_text TextDetails -> a -> a
txt a
end (Doc -> Doc
reduceDoc Doc
doc)
fullRender LeftMode _ _ txt :: TextDetails -> a -> a
txt end :: a
end doc :: Doc
doc
= TextDetails -> (TextDetails -> a -> a) -> a -> Doc -> a
forall a. TextDetails -> (TextDetails -> a -> a) -> a -> Doc -> a
easy_display TextDetails
nl_text TextDetails -> a -> a
txt a
end (Doc -> Doc
reduceDoc Doc
doc)
fullRender the_mode :: Mode
the_mode line_length :: Int
line_length ribbons_per_line :: Float
ribbons_per_line txt :: TextDetails -> a -> a
txt end :: a
end doc :: Doc
doc
= Mode -> Int -> Int -> (TextDetails -> a -> a) -> a -> Doc -> a
forall a.
Mode -> Int -> Int -> (TextDetails -> a -> a) -> a -> Doc -> a
display Mode
the_mode Int
line_length Int
ribbon_length TextDetails -> a -> a
txt a
end Doc
best_doc
where
best_doc :: Doc
best_doc = Mode -> Int -> Int -> Doc -> Doc
best Mode
the_mode Int
hacked_line_length Int
ribbon_length (Doc -> Doc
reduceDoc Doc
doc)
hacked_line_length, ribbon_length :: Int
ribbon_length :: Int
ribbon_length = 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
line_length Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
ribbons_per_line)
hacked_line_length :: Int
hacked_line_length = case Mode
the_mode of
ZigZagMode -> Int
forall a. Bounded a => a
maxBound
_ -> Int
line_length
display :: Mode -> Int -> Int -> (TextDetails -> a -> a) -> a -> Doc -> a
display :: Mode -> Int -> Int -> (TextDetails -> a -> a) -> a -> Doc -> a
display the_mode :: Mode
the_mode page_width :: Int
page_width ribbon_width :: Int
ribbon_width txt :: TextDetails -> a -> a
txt end :: a
end doc :: Doc
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 -> 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
p) = Int -> Doc -> a
lay (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
k1) Doc
p
lay _ Empty = a
end
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"
lay k :: Int
k (NilAbove p :: Doc
p) = TextDetails
nl_text TextDetails -> a -> a
`txt` Int -> Doc -> a
lay Int
k Doc
p
lay k :: Int
k (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p)
= case Mode
the_mode of
ZigZagMode | Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
gap_width
-> TextDetails
nl_text TextDetails -> a -> a
`txt` (
String -> TextDetails
Str (Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
shift '/') TextDetails -> a -> a
`txt` (
TextDetails
nl_text TextDetails -> a -> a
`txt`
Int -> TextDetails -> Int -> Doc -> a
lay1 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
shift) TextDetails
s Int
sl Doc
p ))
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 0
-> TextDetails
nl_text TextDetails -> a -> a
`txt` (
String -> TextDetails
Str (Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
shift '\\') TextDetails -> a -> a
`txt` (
TextDetails
nl_text TextDetails -> a -> a
`txt`
Int -> TextDetails -> Int -> Doc -> a
lay1 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
shift) TextDetails
s Int
sl Doc
p ))
_ -> Int -> TextDetails -> Int -> Doc -> a
lay1 Int
k TextDetails
s Int
sl Doc
p
lay1 :: Int -> TextDetails -> Int -> Doc -> a
lay1 k :: Int
k _ sl :: Int
sl _ | Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
sl Int -> Bool -> Bool
forall a b. a -> b -> b
`seq` Bool
False = a
forall a. HasCallStack => a
undefined
lay1 k :: Int
k s :: TextDetails
s sl :: Int
sl p :: Doc
p = String -> TextDetails
Str (Int -> String
indent Int
k) TextDetails -> a -> a
`txt` (TextDetails
s TextDetails -> a -> a
`txt` Int -> Doc -> a
lay2 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
sl) Doc
p)
lay2 :: Int -> Doc -> 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
p) = TextDetails
nl_text TextDetails -> a -> a
`txt` Int -> Doc -> a
lay Int
k Doc
p
lay2 k :: Int
k (TextBeside s :: TextDetails
s sl :: Int
sl p :: Doc
p) = TextDetails
s TextDetails -> a -> a
`txt` Int -> Doc -> a
lay2 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
sl) Doc
p
lay2 k :: Int
k (Nest _ p :: Doc
p) = Int -> Doc -> a
lay2 Int
k Doc
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 -> a
lay 0 Doc
doc
}}
cant_fail :: a
cant_fail :: a
cant_fail = String -> a
forall a. HasCallStack => String -> a
error "easy_display: NoDoc"
easy_display :: TextDetails -> (TextDetails -> a -> a) -> a -> Doc -> a
easy_display :: TextDetails -> (TextDetails -> a -> a) -> a -> Doc -> a
easy_display nl_space_text :: TextDetails
nl_space_text txt :: TextDetails -> a -> a
txt end :: a
end doc :: Doc
doc
= Doc -> a -> a
lay Doc
doc a
forall a. a
cant_fail
where
lay :: Doc -> a -> a
lay NoDoc no_doc :: a
no_doc = a
no_doc
lay (Union _p :: Doc
_p q :: Doc
q) _ = Doc -> a -> a
lay Doc
q a
forall a. a
cant_fail
lay (Nest _ p :: Doc
p) no_doc :: a
no_doc = Doc -> a -> a
lay Doc
p a
no_doc
lay Empty _ = a
end
lay (NilAbove p :: Doc
p) _ = TextDetails
nl_space_text TextDetails -> a -> a
`txt` Doc -> a -> a
lay Doc
p a
forall a. a
cant_fail
lay (TextBeside s :: TextDetails
s _ p :: Doc
p) no_doc :: a
no_doc = TextDetails
s TextDetails -> a -> a
`txt` Doc -> a -> a
lay Doc
p a
no_doc
lay (Above {}) _ = String -> a
forall a. HasCallStack => String -> a
error "easy_display Above"
lay (Beside {}) _ = String -> a
forall a. HasCallStack => String -> a
error "easy_display Beside"
indent :: Int -> String
indent :: Int -> String
indent n :: Int
n = Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
n ' '