Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > db7a4a658d190b3e658423135710c498 > files > 1139

ghc-darcs-devel-2.8.3-1.fc18.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>src/Printer.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>

A Document is at heart ShowS from the prelude
\htmladdnormallink{http://www.haskell.org/onlinereport/standard-prelude.html#\$tShowS}

Essentially, if you give a Doc a string it'll print out whatever it
wants followed by that string. So \verb!(text "foo")! makes the Doc that
prints \verb!"foo"! followed by its argument. The combinator names are taken
from Text.PrettyPrint.HughesPJ, although the behaviour of the two libraries is
slightly different.

The advantage of Printer over simple string appending/concatenating is
that the appends end up associating to the right, e.g.:

\begin{verbatim}
  (text "foo" <> text "bar") <> (text "baz" <> text "quux") ""
= \s -> (text "foo" <> text "bar") ((text "baz" <> text "quux") s) ""
= (text "foo" <> text "bar") ((text "baz" <> text "quux") "")
= (\s -> (text "foo") (text "bar" s)) ((text "baz" <> text "quux") "")
= text "foo" (text "bar" ((text "baz" <> text "quux") ""))
= (\s -> "foo" ++ s) (text "bar" ((text "baz" <> text "quux") ""))
= "foo" ++ (text "bar" ((text "baz" <> text "quux") ""))
= "foo" ++ ("bar" ++ ((text "baz" <> text "quux") ""))
= "foo" ++ ("bar" ++ ((\s -> text "baz" (text "quux" s)) ""))
= "foo" ++ ("bar" ++ (text "baz" (text "quux" "")))
= "foo" ++ ("bar" ++ ("baz" ++ (text "quux" "")))
= "foo" ++ ("bar" ++ ("baz" ++ ("quux" ++ "")))
\end{verbatim}

The Empty alternative comes in because you want
\begin{verbatim}
    text "a" $$ vcat xs $$ text "b"
\end{verbatim}
(\verb!$$! means ``above'', vcat is the list version of \verb!$$!) to be
\verb!"a\nb"! when \verb!xs!  is \verb![]!, but without the concept of an
Empty Document each \verb!$$! would add a \verb!'\n'! and you'd end up with
\verb!"a\n\nb"!. Note that \verb!Empty /= text ""! (the latter would cause two
\verb!'\n'!s).

This code was made generic in the element type by Juliusz Chroboczek.
\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Printer</span> <span class='hs-layout'>(</span><span class='hs-conid'>Printable</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>(</span><span class='hs-conid'>Doc</span><span class='hs-layout'>,</span><span class='hs-varid'>unDoc</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Printers</span><span class='hs-layout'>,</span> <span class='hs-conid'>Printers'</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Printer</span><span class='hs-layout'>,</span> <span class='hs-conid'>Color</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-2"></a>                <span class='hs-varid'>hPutDoc</span><span class='hs-layout'>,</span>     <span class='hs-varid'>hPutDocLn</span><span class='hs-layout'>,</span>     <span class='hs-varid'>putDoc</span><span class='hs-layout'>,</span>     <span class='hs-varid'>putDocLn</span><span class='hs-layout'>,</span>
<a name="line-3"></a>                <span class='hs-varid'>hPutDocWith</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutDocLnWith</span><span class='hs-layout'>,</span> <span class='hs-varid'>putDocWith</span><span class='hs-layout'>,</span> <span class='hs-varid'>putDocLnWith</span><span class='hs-layout'>,</span>
<a name="line-4"></a>                <span class='hs-varid'>renderString</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderStringWith</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderPS</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderPSWith</span><span class='hs-layout'>,</span>
<a name="line-5"></a>                <span class='hs-varid'>renderPSs</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderPSsWith</span><span class='hs-layout'>,</span> <span class='hs-varid'>lineColor</span><span class='hs-layout'>,</span>
<a name="line-6"></a>                <span class='hs-varid'>prefix</span><span class='hs-layout'>,</span> <span class='hs-varid'>insertBeforeLastline</span><span class='hs-layout'>,</span> <span class='hs-varid'>colorText</span><span class='hs-layout'>,</span> <span class='hs-varid'>invisibleText</span><span class='hs-layout'>,</span>
<a name="line-7"></a>                <span class='hs-varid'>hiddenText</span><span class='hs-layout'>,</span> <span class='hs-varid'>hiddenPrefix</span><span class='hs-layout'>,</span> <span class='hs-varid'>userchunk</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span><span class='hs-layout'>,</span>
<a name="line-8"></a>                <span class='hs-varid'>printable</span><span class='hs-layout'>,</span> <span class='hs-varid'>wrapText</span><span class='hs-layout'>,</span>
<a name="line-9"></a>                <span class='hs-varid'>blueText</span><span class='hs-layout'>,</span> <span class='hs-varid'>redText</span><span class='hs-layout'>,</span> <span class='hs-varid'>greenText</span><span class='hs-layout'>,</span> <span class='hs-varid'>magentaText</span><span class='hs-layout'>,</span> <span class='hs-varid'>cyanText</span><span class='hs-layout'>,</span>
<a name="line-10"></a>                <span class='hs-varid'>unsafeText</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeBoth</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeBothText</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeChar</span><span class='hs-layout'>,</span>
<a name="line-11"></a>                <span class='hs-varid'>invisiblePS</span><span class='hs-layout'>,</span> <span class='hs-varid'>packedString</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafePackedString</span><span class='hs-layout'>,</span> <span class='hs-varid'>userchunkPS</span><span class='hs-layout'>,</span>
<a name="line-12"></a>                <span class='hs-varid'>simplePrinters</span><span class='hs-layout'>,</span> <span class='hs-varid'>invisiblePrinter</span><span class='hs-layout'>,</span> <span class='hs-varid'>simplePrinter</span><span class='hs-layout'>,</span>
<a name="line-13"></a>                <span class='hs-varid'>doc</span><span class='hs-layout'>,</span> <span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;?&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;+&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>vcat</span><span class='hs-layout'>,</span> <span class='hs-varid'>vsep</span><span class='hs-layout'>,</span> <span class='hs-varid'>hcat</span><span class='hs-layout'>,</span>
<a name="line-14"></a>                <span class='hs-varid'>minus</span><span class='hs-layout'>,</span> <span class='hs-varid'>newline</span><span class='hs-layout'>,</span> <span class='hs-varid'>plus</span><span class='hs-layout'>,</span> <span class='hs-varid'>space</span><span class='hs-layout'>,</span> <span class='hs-varid'>backslash</span><span class='hs-layout'>,</span> <span class='hs-varid'>lparen</span><span class='hs-layout'>,</span> <span class='hs-varid'>rparen</span><span class='hs-layout'>,</span>
<a name="line-15"></a>                <span class='hs-varid'>parens</span><span class='hs-layout'>,</span>
<a name="line-16"></a>                <span class='hs-varid'>errorDoc</span><span class='hs-layout'>,</span>
<a name="line-17"></a>               <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-layout'>(</span><span class='hs-varid'>intersperse</span><span class='hs-layout'>)</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Handle</span><span class='hs-layout'>,</span> <span class='hs-varid'>stdout</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutStr</span><span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ByteStringUtils</span> <span class='hs-layout'>(</span> <span class='hs-varid'>linesPS</span> <span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>B</span> <span class='hs-layout'>(</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPut</span><span class='hs-layout'>,</span> <span class='hs-varid'>concat</span><span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Char8</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>BC</span> <span class='hs-layout'>(</span><span class='hs-varid'>unpack</span><span class='hs-layout'>,</span> <span class='hs-varid'>pack</span><span class='hs-layout'>,</span> <span class='hs-varid'>singleton</span><span class='hs-layout'>)</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="Printable"></a><span class='hs-comment'>-- | A 'Printable' is either a String, a packed string, or a chunk of</span>
<a name="line-26"></a><a name="Printable"></a><span class='hs-comment'>-- text with both representations.</span>
<a name="line-27"></a><a name="Printable"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Printable</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span> <span class='hs-varop'>!</span><span class='hs-conid'>String</span>
<a name="line-28"></a>               <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PS</span> <span class='hs-varop'>!</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-29"></a>               <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Both</span> <span class='hs-varop'>!</span><span class='hs-conid'>String</span> <span class='hs-varop'>!</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="spaceP"></a><span class='hs-comment'>-- | 'spaceP' is the 'Printable' representation of a space.</span>
<a name="line-32"></a><span class='hs-definition'>spaceP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printable</span>
<a name="line-33"></a><span class='hs-definition'>spaceP</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Both</span> <span class='hs-str'>" "</span>  <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>' '</span><span class='hs-layout'>)</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="newlineP"></a><span class='hs-comment'>-- | 'newlineP' is the 'Printable' representation of a newline.</span>
<a name="line-36"></a><span class='hs-definition'>newlineP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printable</span>
<a name="line-37"></a><span class='hs-definition'>newlineP</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span> <span class='hs-str'>"\n"</span>
<a name="line-38"></a>
<a name="line-39"></a><a name="space"></a><span class='hs-comment'>-- | Minimal 'Doc's representing the common characters 'space', 'newline'</span>
<a name="line-40"></a><span class='hs-comment'>-- 'minus', 'plus', and 'backslash'.</span>
<a name="line-41"></a><span class='hs-definition'>space</span><span class='hs-layout'>,</span> <span class='hs-varid'>newline</span><span class='hs-layout'>,</span> <span class='hs-varid'>plus</span><span class='hs-layout'>,</span> <span class='hs-varid'>minus</span><span class='hs-layout'>,</span> <span class='hs-varid'>backslash</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-42"></a><span class='hs-definition'>space</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeBoth</span> <span class='hs-str'>" "</span>  <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>' '</span><span class='hs-layout'>)</span>
<a name="line-43"></a><a name="newline"></a><span class='hs-definition'>newline</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeChar</span> <span class='hs-chr'>'\n'</span>
<a name="line-44"></a><a name="minus"></a><span class='hs-definition'>minus</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeBoth</span> <span class='hs-str'>"-"</span>  <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>'-'</span><span class='hs-layout'>)</span>
<a name="line-45"></a><a name="plus"></a><span class='hs-definition'>plus</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeBoth</span> <span class='hs-str'>"+"</span>  <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>'+'</span><span class='hs-layout'>)</span>
<a name="line-46"></a><a name="backslash"></a><span class='hs-definition'>backslash</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeBoth</span> <span class='hs-str'>"\\"</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>'\\'</span><span class='hs-layout'>)</span>
<a name="line-47"></a>
<a name="line-48"></a><a name="lparen"></a><span class='hs-comment'>-- | 'lparen' is the 'Doc' that represents @\"(\"@</span>
<a name="line-49"></a><span class='hs-definition'>lparen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-50"></a><span class='hs-definition'>lparen</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeBoth</span>  <span class='hs-str'>"("</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>'('</span><span class='hs-layout'>)</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="rparen"></a><span class='hs-comment'>-- | 'rparen' is the 'Doc' that represents @\")\"@</span>
<a name="line-53"></a><span class='hs-definition'>rparen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-54"></a><span class='hs-definition'>rparen</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeBoth</span> <span class='hs-str'>")"</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>')'</span><span class='hs-layout'>)</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="parens"></a><span class='hs-comment'>-- | @'parens' doc@ returns a 'Doc' with the content of @doc@ put within</span>
<a name="line-57"></a><span class='hs-comment'>-- a pair of parenthesis.</span>
<a name="line-58"></a><span class='hs-definition'>parens</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-59"></a><span class='hs-definition'>parens</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lparen</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>d</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>rparen</span>
<a name="line-60"></a>
<a name="line-61"></a><a name="errorDoc"></a><span class='hs-definition'>errorDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-62"></a><span class='hs-definition'>errorDoc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>.</span> <span class='hs-varid'>renderStringWith</span> <span class='hs-varid'>simplePrinters'</span>
<a name="line-63"></a>
<a name="line-64"></a>
<a name="line-65"></a><a name="putDocWith"></a><span class='hs-comment'>-- | 'putDocWith' puts a doc on stdout using the given printer.</span>
<a name="line-66"></a><span class='hs-definition'>putDocWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-67"></a><span class='hs-definition'>putDocWith</span> <span class='hs-varid'>prs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutDocWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>stdout</span>
<a name="line-68"></a>
<a name="line-69"></a><a name="putDocLnWith"></a><span class='hs-comment'>-- | 'putDocLnWith' puts a doc, followed by a newline on stdout using</span>
<a name="line-70"></a><span class='hs-comment'>-- the given printer.</span>
<a name="line-71"></a><span class='hs-definition'>putDocLnWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-72"></a><span class='hs-definition'>putDocLnWith</span> <span class='hs-varid'>prs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutDocLnWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>stdout</span>
<a name="line-73"></a>
<a name="line-74"></a>
<a name="line-75"></a><a name="putDoc"></a><span class='hs-comment'>-- | 'putDoc' puts a doc on stdout using the simple printer 'simplePrinters'.</span>
<a name="line-76"></a><span class='hs-definition'>putDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-77"></a><a name="putDocLn"></a><span class='hs-comment'>-- | 'putDocLn' puts a doc, followed by a newline on stdout using</span>
<a name="line-78"></a><span class='hs-comment'>-- 'simplePrinters'</span>
<a name="line-79"></a><span class='hs-definition'>putDocLn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-80"></a><span class='hs-definition'>putDoc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutDoc</span> <span class='hs-varid'>stdout</span>
<a name="line-81"></a><span class='hs-definition'>putDocLn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutDocLn</span> <span class='hs-varid'>stdout</span>
<a name="line-82"></a>
<a name="line-83"></a><a name="hPutDocWith"></a><span class='hs-comment'>-- | 'hputDocWith' puts a doc on the given handle using the given printer.</span>
<a name="line-84"></a><span class='hs-definition'>hPutDocWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-85"></a><a name="hPutDocLnWith"></a><span class='hs-comment'>-- | 'hputDocLnWith' puts a doc, followed by a newline on the given</span>
<a name="line-86"></a><span class='hs-comment'>-- handle using the given printer.</span>
<a name="line-87"></a><span class='hs-definition'>hPutDocLnWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-88"></a>
<a name="line-89"></a><span class='hs-definition'>hPutDocWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>h</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPrintPrintables</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-varid'>renderWith</span> <span class='hs-layout'>(</span><span class='hs-varid'>prs</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-90"></a><span class='hs-definition'>hPutDocLnWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>h</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutDocWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varop'>&lt;?&gt;</span> <span class='hs-varid'>newline</span><span class='hs-layout'>)</span>
<a name="line-91"></a>
<a name="line-92"></a><a name="hPutDoc"></a><span class='hs-comment'>-- |'hputDoc' puts a doc on the given handle using 'simplePrinters'</span>
<a name="line-93"></a><span class='hs-definition'>hPutDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-94"></a><a name="hPutDocLn"></a><span class='hs-comment'>-- 'hputDocLn' puts a doc, followed by a newline on the given handle using</span>
<a name="line-95"></a><span class='hs-comment'>-- 'simplePrinters'.</span>
<a name="line-96"></a><span class='hs-definition'>hPutDocLn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-97"></a><span class='hs-definition'>hPutDoc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutDocWith</span> <span class='hs-varid'>simplePrinters</span>
<a name="line-98"></a><span class='hs-definition'>hPutDocLn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutDocLnWith</span> <span class='hs-varid'>simplePrinters</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="hPrintPrintables"></a><span class='hs-comment'>-- | @'hPrintPrintables' h@ prints a list of 'Printable's to the handle h</span>
<a name="line-101"></a><span class='hs-definition'>hPrintPrintables</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-102"></a><span class='hs-definition'>hPrintPrintables</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-varid'>hPrintPrintable</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-103"></a>
<a name="line-104"></a><a name="hPrintPrintable"></a><span class='hs-comment'>-- | @hPrintPrintable h@ prints a 'Printable' to the handle h.</span>
<a name="line-105"></a><span class='hs-definition'>hPrintPrintable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Printable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-106"></a><span class='hs-definition'>hPrintPrintable</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutStr</span> <span class='hs-varid'>h</span> <span class='hs-varid'>ps</span>
<a name="line-107"></a><span class='hs-definition'>hPrintPrintable</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>PS</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>hPut</span> <span class='hs-varid'>h</span> <span class='hs-varid'>ps</span>
<a name="line-108"></a><span class='hs-definition'>hPrintPrintable</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>Both</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>hPut</span> <span class='hs-varid'>h</span> <span class='hs-varid'>ps</span>
<a name="line-109"></a>
<a name="line-110"></a><a name="Doc"></a><span class='hs-comment'>-- | a 'Doc' is a bit of enriched text. 'Doc's get concatanated using</span>
<a name="line-111"></a><a name="Doc"></a><span class='hs-comment'>-- '&lt;&gt;', which is right-associative.</span>
<a name="line-112"></a><a name="Doc"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-layout'>{</span> <span class='hs-varid'>unDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>St</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Document</span> <span class='hs-layout'>}</span>
<a name="line-113"></a>
<a name="line-114"></a><a name="St"></a><span class='hs-comment'>-- | The State associated with a doc. Contains a set of printers for each</span>
<a name="line-115"></a><a name="St"></a><span class='hs-comment'>-- hanlde, and the current prefix of the document.</span>
<a name="line-116"></a><a name="St"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>St</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>St</span> <span class='hs-layout'>{</span> <span class='hs-varid'>printers</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Printers'</span><span class='hs-layout'>,</span>
<a name="line-117"></a>               <span class='hs-varid'>currentPrefix</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-118"></a><a name="Printers"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Printers</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Printers'</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="Printers'"></a><span class='hs-comment'>-- | A set of printers to print different types of text to a handle.</span>
<a name="line-121"></a><a name="Printers'"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Printers'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Printers</span> <span class='hs-layout'>{</span><span class='hs-varid'>colorP</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Color</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Printer</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-122"></a>                           <span class='hs-varid'>invisibleP</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Printer</span><span class='hs-layout'>,</span>
<a name="line-123"></a>                           <span class='hs-varid'>hiddenP</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Printer</span><span class='hs-layout'>,</span>
<a name="line-124"></a>                           <span class='hs-varid'>userchunkP</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Printer</span><span class='hs-layout'>,</span>
<a name="line-125"></a>                           <span class='hs-varid'>defP</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Printer</span><span class='hs-layout'>,</span>
<a name="line-126"></a>                           <span class='hs-varid'>lineColorT</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Color</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-127"></a>                           <span class='hs-varid'>lineColorS</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-128"></a>                          <span class='hs-layout'>}</span>
<a name="line-129"></a><a name="Printer"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Printer</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Printable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>St</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Document</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="Color"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Color</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Blue</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Red</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Green</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Cyan</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Magenta</span>
<a name="line-132"></a>
<a name="line-133"></a><a name="Document"></a><span class='hs-comment'>-- | 'Document' is a wrapper around '[Printable] -&gt; [Printable]' which allows</span>
<a name="line-134"></a><a name="Document"></a><span class='hs-comment'>-- for empty Documents. The simplest 'Documents' are built from 'String's</span>
<a name="line-135"></a><a name="Document"></a><span class='hs-comment'>-- using 'text'.</span>
<a name="line-136"></a><a name="Document"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Document</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Document</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-137"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Empty</span>
<a name="line-138"></a>
<a name="line-139"></a><a name="renderString"></a><span class='hs-comment'>-- | renders a 'Doc' into a 'String' with control codes for the</span>
<a name="line-140"></a><span class='hs-comment'>-- special features of the doc.</span>
<a name="line-141"></a><span class='hs-definition'>renderString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-142"></a><span class='hs-definition'>renderString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStringWith</span> <span class='hs-varid'>simplePrinters'</span>
<a name="line-143"></a>
<a name="line-144"></a><a name="renderStringWith"></a><span class='hs-comment'>-- | renders a 'Doc' into a 'String' using a given set of printers.</span>
<a name="line-145"></a><span class='hs-definition'>renderStringWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-146"></a><span class='hs-definition'>renderStringWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-varid'>toString</span> <span class='hs-varop'>$</span> <span class='hs-varid'>renderWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>d</span>
<a name="line-147"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>toString</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span>
<a name="line-148"></a>          <span class='hs-varid'>toString</span> <span class='hs-layout'>(</span><span class='hs-conid'>PS</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>ps</span>
<a name="line-149"></a>          <span class='hs-varid'>toString</span> <span class='hs-layout'>(</span><span class='hs-conid'>Both</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span>
<a name="line-150"></a>
<a name="line-151"></a><a name="renderPS"></a><span class='hs-comment'>-- | renders a 'Doc' into 'B.ByteString' with control codes for the</span>
<a name="line-152"></a><span class='hs-comment'>-- special features of the Doc. See also 'readerString'.</span>
<a name="line-153"></a><span class='hs-definition'>renderPS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-154"></a><span class='hs-definition'>renderPS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderPSWith</span> <span class='hs-varid'>simplePrinters'</span>
<a name="line-155"></a>
<a name="line-156"></a><a name="renderPSs"></a><span class='hs-comment'>-- | renders a 'Doc' into a list of 'PackedStrings', one for each line.</span>
<a name="line-157"></a><span class='hs-definition'>renderPSs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span>
<a name="line-158"></a><span class='hs-definition'>renderPSs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderPSsWith</span> <span class='hs-varid'>simplePrinters'</span>
<a name="line-159"></a>
<a name="line-160"></a><a name="renderPSWith"></a><span class='hs-comment'>-- | renders a doc into a 'B.ByteString' using a given set of printers.</span>
<a name="line-161"></a><span class='hs-definition'>renderPSWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-162"></a><span class='hs-definition'>renderPSWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>concat</span> <span class='hs-varop'>$</span> <span class='hs-varid'>renderPSsWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>d</span>
<a name="line-163"></a>
<a name="line-164"></a><a name="renderPSsWith"></a><span class='hs-comment'>-- | renders a 'Doc' into a list of 'PackedStrings', one for each</span>
<a name="line-165"></a><span class='hs-comment'>-- chunk of text that was added to the doc, using the given set of</span>
<a name="line-166"></a><span class='hs-comment'>-- printers.</span>
<a name="line-167"></a><span class='hs-definition'>renderPSsWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span>
<a name="line-168"></a><span class='hs-definition'>renderPSsWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>toPS</span> <span class='hs-varop'>$</span> <span class='hs-varid'>renderWith</span> <span class='hs-varid'>prs</span> <span class='hs-varid'>d</span>
<a name="line-169"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>toPS</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>s</span>
<a name="line-170"></a>          <span class='hs-varid'>toPS</span> <span class='hs-layout'>(</span><span class='hs-conid'>PS</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ps</span>
<a name="line-171"></a>          <span class='hs-varid'>toPS</span> <span class='hs-layout'>(</span><span class='hs-conid'>Both</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ps</span>
<a name="line-172"></a>
<a name="line-173"></a><a name="renderWith"></a><span class='hs-comment'>-- | renders a 'Doc' into a list of 'Printables' using a set of</span>
<a name="line-174"></a><span class='hs-comment'>-- printers. Each item of the list corresponds to a string that was</span>
<a name="line-175"></a><span class='hs-comment'>-- added to the doc.</span>
<a name="line-176"></a><span class='hs-definition'>renderWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span>
<a name="line-177"></a><span class='hs-definition'>renderWith</span> <span class='hs-varid'>ps</span> <span class='hs-layout'>(</span><span class='hs-conid'>Doc</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-varid'>initState</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-178"></a>                        <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>[]</span>
<a name="line-179"></a>                        <span class='hs-conid'>Document</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-conid'>[]</span>
<a name="line-180"></a>
<a name="line-181"></a><a name="initState"></a><span class='hs-definition'>initState</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>St</span>
<a name="line-182"></a><span class='hs-definition'>initState</span> <span class='hs-varid'>prs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>St</span> <span class='hs-layout'>{</span> <span class='hs-varid'>printers</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>prs</span><span class='hs-layout'>,</span> <span class='hs-varid'>currentPrefix</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> <span class='hs-layout'>}</span>
<a name="line-183"></a>
<a name="line-184"></a><a name="prefix"></a><span class='hs-definition'>prefix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-185"></a><span class='hs-definition'>prefix</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-conid'>Doc</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-186"></a>                   <span class='hs-keyword'>let</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span> <span class='hs-varid'>s</span>
<a name="line-187"></a>                       <span class='hs-varid'>st'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>st</span> <span class='hs-layout'>{</span> <span class='hs-varid'>currentPrefix</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>currentPrefix</span> <span class='hs-varid'>st</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span> <span class='hs-keyword'>in</span>
<a name="line-188"></a>                   <span class='hs-keyword'>case</span> <span class='hs-varid'>d</span> <span class='hs-varid'>st'</span> <span class='hs-keyword'>of</span>
<a name="line-189"></a>                     <span class='hs-conid'>Document</span> <span class='hs-varid'>d''</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Document</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>d''</span>
<a name="line-190"></a>                     <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Empty</span>
<a name="line-191"></a>
<a name="line-192"></a>
<a name="line-193"></a><a name="insertBeforeLastline"></a><span class='hs-definition'>insertBeforeLastline</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-194"></a><span class='hs-definition'>insertBeforeLastline</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span>
<a name="line-195"></a>   <span class='hs-keyword'>case</span> <span class='hs-varid'>reverse</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>packedString</span> <span class='hs-varop'>$</span> <span class='hs-varid'>linesPS</span> <span class='hs-varop'>$</span> <span class='hs-varid'>renderPS</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>of</span>
<a name="line-196"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>ll</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>b</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>ll</span>
<a name="line-197"></a>   <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-str'>"empty Doc given as first argument of Printer.insert_before_last_line"</span>
<a name="line-198"></a>
<a name="line-199"></a>
<a name="line-200"></a><a name="lineColor"></a><span class='hs-definition'>lineColor</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Color</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-201"></a><span class='hs-definition'>lineColor</span> <span class='hs-varid'>c</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lineColorT</span> <span class='hs-layout'>(</span><span class='hs-varid'>printers</span> <span class='hs-varid'>st</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span> <span class='hs-varid'>d</span> <span class='hs-keyword'>of</span>
<a name="line-202"></a>                             <span class='hs-conid'>Doc</span> <span class='hs-varid'>d'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>d'</span> <span class='hs-varid'>st</span>
<a name="line-203"></a>
<a name="line-204"></a><a name="hiddenPrefix"></a><span class='hs-definition'>hiddenPrefix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-205"></a><span class='hs-definition'>hiddenPrefix</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-conid'>Doc</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-206"></a>    <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>pr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>printers</span> <span class='hs-varid'>st</span>
<a name="line-207"></a>                     <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span> <span class='hs-layout'>(</span><span class='hs-varid'>renderStringWith</span> <span class='hs-varid'>pr</span> <span class='hs-varop'>$</span> <span class='hs-varid'>hiddenText</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-208"></a>                     <span class='hs-varid'>st'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>st</span> <span class='hs-layout'>{</span> <span class='hs-varid'>currentPrefix</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>currentPrefix</span> <span class='hs-varid'>st</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-209"></a>                 <span class='hs-keyword'>in</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>d</span> <span class='hs-varid'>st'</span> <span class='hs-keyword'>of</span>
<a name="line-210"></a>                      <span class='hs-conid'>Document</span> <span class='hs-varid'>d''</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Document</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>d''</span>
<a name="line-211"></a>                      <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Empty</span>
<a name="line-212"></a>
<a name="line-213"></a><a name="unsafeBoth"></a><span class='hs-comment'>-- | 'unsafeBoth' builds a Doc from a 'String' and a 'B.ByteString' representing</span>
<a name="line-214"></a><span class='hs-comment'>-- the same text, but does not check that they do.</span>
<a name="line-215"></a><span class='hs-definition'>unsafeBoth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-216"></a><span class='hs-definition'>unsafeBoth</span> <span class='hs-varid'>s</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>simplePrinter</span> <span class='hs-layout'>(</span><span class='hs-conid'>Both</span> <span class='hs-varid'>s</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>
<a name="line-217"></a>
<a name="line-218"></a><a name="unsafeBothText"></a><span class='hs-comment'>-- | 'unsafeBothText' builds a 'Doc' from a 'String'. The string is stored in the</span>
<a name="line-219"></a><span class='hs-comment'>-- Doc as both a String and a 'B.ByteString'.</span>
<a name="line-220"></a><span class='hs-definition'>unsafeBothText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-221"></a><span class='hs-definition'>unsafeBothText</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>simplePrinter</span> <span class='hs-layout'>(</span><span class='hs-conid'>Both</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-222"></a>
<a name="line-223"></a><a name="packedString"></a><span class='hs-comment'>-- | 'packedString' builds a 'Doc' from a 'B.ByteString' using 'printable'</span>
<a name="line-224"></a><span class='hs-definition'>packedString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-225"></a><a name="unsafePackedString"></a><span class='hs-comment'>-- | 'unsafePackedString' builds a 'Doc' from a 'B.ByteString' using 'simplePrinter'</span>
<a name="line-226"></a><span class='hs-definition'>unsafePackedString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-227"></a><a name="invisiblePS"></a><span class='hs-comment'>-- | 'invisiblePS' creates a 'Doc' with invisible text from a 'B.ByteString'</span>
<a name="line-228"></a><span class='hs-definition'>invisiblePS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-229"></a><a name="userchunkPS"></a><span class='hs-comment'>-- | 'userchunkPS' creates a 'Doc' representing a user chunk from a 'B.ByteString'.</span>
<a name="line-230"></a><span class='hs-definition'>userchunkPS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-231"></a><span class='hs-definition'>packedString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>printable</span> <span class='hs-varop'>.</span> <span class='hs-conid'>PS</span>
<a name="line-232"></a><span class='hs-definition'>unsafePackedString</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>.</span> <span class='hs-varid'>simplePrinter</span> <span class='hs-varop'>.</span> <span class='hs-conid'>PS</span>
<a name="line-233"></a><span class='hs-definition'>invisiblePS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>invisiblePrintable</span> <span class='hs-varop'>.</span> <span class='hs-conid'>PS</span>
<a name="line-234"></a><span class='hs-definition'>userchunkPS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>userchunkPrintable</span> <span class='hs-varop'>.</span> <span class='hs-conid'>PS</span>
<a name="line-235"></a>
<a name="line-236"></a><a name="unsafeChar"></a><span class='hs-comment'>-- | 'unsafeChar' creates a Doc containing just one character.</span>
<a name="line-237"></a><span class='hs-definition'>unsafeChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-238"></a><span class='hs-definition'>unsafeChar</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeText</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-conop'>:</span><span class='hs-str'>""</span><span class='hs-layout'>)</span>
<a name="line-239"></a>
<a name="line-240"></a><a name="text"></a><span class='hs-comment'>-- | 'text' creates a 'Doc' from a @String@, using 'printable'.</span>
<a name="line-241"></a><span class='hs-definition'>text</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-242"></a><a name="unsafeText"></a><span class='hs-comment'>-- | 'unsafeText' creates a 'Doc' from a 'String', using 'simplePrinter' directly</span>
<a name="line-243"></a><span class='hs-definition'>unsafeText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-244"></a><a name="invisibleText"></a><span class='hs-comment'>-- | 'invisibleText' creates a 'Doc' containing invisible text from a @String@</span>
<a name="line-245"></a><span class='hs-definition'>invisibleText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-246"></a><a name="hiddenText"></a><span class='hs-comment'>-- | 'hiddenText' creates a 'Doc' containing hidden text from a @String@</span>
<a name="line-247"></a><span class='hs-definition'>hiddenText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-248"></a><a name="userchunk"></a><span class='hs-comment'>-- | 'userchunk' creates a 'Doc' containing a user chunk from a @String@</span>
<a name="line-249"></a><span class='hs-definition'>userchunk</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-250"></a><a name="blueText"></a><span class='hs-comment'>-- | 'blueText' creates a 'Doc' containing blue text from a @String@</span>
<a name="line-251"></a><span class='hs-definition'>blueText</span><span class='hs-layout'>,</span> <span class='hs-varid'>redText</span><span class='hs-layout'>,</span> <span class='hs-varid'>greenText</span><span class='hs-layout'>,</span> <span class='hs-varid'>magentaText</span><span class='hs-layout'>,</span> <span class='hs-varid'>cyanText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-252"></a><span class='hs-definition'>text</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>printable</span> <span class='hs-varop'>.</span> <span class='hs-conid'>S</span>
<a name="line-253"></a><span class='hs-definition'>unsafeText</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>.</span> <span class='hs-varid'>simplePrinter</span> <span class='hs-varop'>.</span> <span class='hs-conid'>S</span>
<a name="line-254"></a><span class='hs-definition'>invisibleText</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>invisiblePrintable</span> <span class='hs-varop'>.</span> <span class='hs-conid'>S</span>
<a name="line-255"></a><span class='hs-definition'>hiddenText</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hiddenPrintable</span> <span class='hs-varop'>.</span> <span class='hs-conid'>S</span>
<a name="line-256"></a><span class='hs-definition'>userchunk</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>userchunkPrintable</span> <span class='hs-varop'>.</span> <span class='hs-conid'>S</span>
<a name="line-257"></a><span class='hs-definition'>blueText</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorText</span> <span class='hs-conid'>Blue</span>
<a name="line-258"></a><a name="redText"></a><span class='hs-definition'>redText</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorText</span> <span class='hs-conid'>Red</span>
<a name="line-259"></a><a name="greenText"></a><span class='hs-definition'>greenText</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorText</span> <span class='hs-conid'>Green</span>
<a name="line-260"></a><a name="magentaText"></a><span class='hs-definition'>magentaText</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorText</span> <span class='hs-conid'>Magenta</span>
<a name="line-261"></a><a name="cyanText"></a><span class='hs-definition'>cyanText</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorText</span> <span class='hs-conid'>Cyan</span>
<a name="line-262"></a>
<a name="line-263"></a><a name="colorText"></a><span class='hs-comment'>-- | 'colorText' creates a 'Doc' containing colored text from a @String@</span>
<a name="line-264"></a><span class='hs-definition'>colorText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Color</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-265"></a><span class='hs-definition'>colorText</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkColorPrintable</span> <span class='hs-varid'>c</span> <span class='hs-varop'>.</span> <span class='hs-conid'>S</span>
<a name="line-266"></a>
<a name="line-267"></a><a name="wrapText"></a><span class='hs-comment'>-- | @'wrapText' n s@ is a 'Doc' representing @s@ line-wrapped at 'n' characters</span>
<a name="line-268"></a><span class='hs-definition'>wrapText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-269"></a><span class='hs-definition'>wrapText</span> <span class='hs-varid'>n</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span>
<a name="line-270"></a>    <span class='hs-varid'>vcat</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>text</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reverse</span> <span class='hs-varop'>$</span> <span class='hs-str'>""</span><span class='hs-conop'>:</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldl</span> <span class='hs-varid'>add_to_line</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>$</span> <span class='hs-varid'>words</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-271"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>add_to_line</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-272"></a>        <span class='hs-varid'>add_to_line</span> <span class='hs-layout'>(</span><span class='hs-str'>""</span><span class='hs-conop'>:</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-conop'>:</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-273"></a>        <span class='hs-varid'>add_to_line</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-varid'>new</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>length</span> <span class='hs-varid'>l</span> <span class='hs-varop'>+</span> <span class='hs-varid'>length</span> <span class='hs-varid'>new</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new</span><span class='hs-conop'>:</span><span class='hs-varid'>l</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span>
<a name="line-274"></a>        <span class='hs-varid'>add_to_line</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-varid'>new</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-str'>" "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>new</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span>
<a name="line-275"></a>
<a name="line-276"></a><a name="printable"></a><span class='hs-comment'>-- | 'printable x' creates a 'Doc' from any 'Printable'.</span>
<a name="line-277"></a><span class='hs-definition'>printable</span><span class='hs-layout'>,</span> <span class='hs-varid'>invisiblePrintable</span><span class='hs-layout'>,</span> <span class='hs-varid'>hiddenPrintable</span><span class='hs-layout'>,</span> <span class='hs-varid'>userchunkPrintable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-278"></a><span class='hs-definition'>printable</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>defP</span> <span class='hs-layout'>(</span><span class='hs-varid'>printers</span> <span class='hs-varid'>st</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varid'>st</span>
<a name="line-279"></a>
<a name="line-280"></a><a name="mkColorPrintable"></a><span class='hs-definition'>mkColorPrintable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Color</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Printable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-281"></a><span class='hs-definition'>mkColorPrintable</span> <span class='hs-varid'>c</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>colorP</span> <span class='hs-layout'>(</span><span class='hs-varid'>printers</span> <span class='hs-varid'>st</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span> <span class='hs-varid'>x</span> <span class='hs-varid'>st</span>
<a name="line-282"></a><a name="invisiblePrintable"></a><span class='hs-definition'>invisiblePrintable</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>invisibleP</span> <span class='hs-layout'>(</span><span class='hs-varid'>printers</span> <span class='hs-varid'>st</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varid'>st</span>
<a name="line-283"></a><a name="hiddenPrintable"></a><span class='hs-definition'>hiddenPrintable</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>hiddenP</span> <span class='hs-layout'>(</span><span class='hs-varid'>printers</span> <span class='hs-varid'>st</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varid'>st</span>
<a name="line-284"></a><a name="userchunkPrintable"></a><span class='hs-definition'>userchunkPrintable</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>userchunkP</span> <span class='hs-layout'>(</span><span class='hs-varid'>printers</span> <span class='hs-varid'>st</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varid'>st</span>
<a name="line-285"></a>
<a name="line-286"></a><a name="simplePrinters"></a><span class='hs-comment'>-- | 'simplePrinters' is a 'Printers' which uses the set 'simplePriners\'' on any</span>
<a name="line-287"></a><span class='hs-comment'>-- handle.</span>
<a name="line-288"></a><span class='hs-definition'>simplePrinters</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers</span>
<a name="line-289"></a><span class='hs-definition'>simplePrinters</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>simplePrinters'</span>
<a name="line-290"></a>
<a name="line-291"></a><a name="simplePrinters'"></a><span class='hs-comment'>-- | A set of default printers suitable for any handle. Does not use color.</span>
<a name="line-292"></a><span class='hs-definition'>simplePrinters'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printers'</span>
<a name="line-293"></a><span class='hs-definition'>simplePrinters'</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Printers</span> <span class='hs-layout'>{</span> <span class='hs-varid'>colorP</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>const</span> <span class='hs-varid'>simplePrinter</span><span class='hs-layout'>,</span>
<a name="line-294"></a>                              <span class='hs-varid'>invisibleP</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>simplePrinter</span><span class='hs-layout'>,</span>
<a name="line-295"></a>                              <span class='hs-varid'>hiddenP</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>invisiblePrinter</span><span class='hs-layout'>,</span>
<a name="line-296"></a>                              <span class='hs-varid'>userchunkP</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>simplePrinter</span><span class='hs-layout'>,</span>
<a name="line-297"></a>                              <span class='hs-varid'>defP</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>simplePrinter</span><span class='hs-layout'>,</span>
<a name="line-298"></a>                              <span class='hs-varid'>lineColorT</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>const</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span>
<a name="line-299"></a>                              <span class='hs-varid'>lineColorS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-300"></a>                            <span class='hs-layout'>}</span>
<a name="line-301"></a>
<a name="line-302"></a><a name="simplePrinter"></a><span class='hs-comment'>-- | 'simplePrinter' is the simplest 'Printer': it just concatenates together</span>
<a name="line-303"></a><span class='hs-comment'>-- the pieces of the 'Doc'</span>
<a name="line-304"></a><span class='hs-definition'>simplePrinter</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printer</span>
<a name="line-305"></a><a name="invisiblePrinter"></a><span class='hs-comment'>-- | 'invisiblePrinter' is the 'Printer' for hidden text. It just replaces</span>
<a name="line-306"></a><span class='hs-comment'>-- the document with 'empty'.  It's useful to have a printer that doesn't</span>
<a name="line-307"></a><span class='hs-comment'>-- actually do anything because this allows you to have tunable policies,</span>
<a name="line-308"></a><span class='hs-comment'>-- for example, only printing some text if it's to the terminal, but not</span>
<a name="line-309"></a><span class='hs-comment'>-- if it's to a file or vice-versa.</span>
<a name="line-310"></a><span class='hs-definition'>invisiblePrinter</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Printer</span>
<a name="line-311"></a><span class='hs-definition'>simplePrinter</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unDoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-312"></a><span class='hs-definition'>invisiblePrinter</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unDoc</span> <span class='hs-varid'>empty</span>
<a name="line-313"></a>
<a name="line-314"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>6</span> <span class='hs-varop'>&lt;&gt;</span>
<a name="line-315"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>6</span> <span class='hs-varop'>&lt;+&gt;</span>
<a name="line-316"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>5</span> <span class='hs-varop'>$$</span>
<a name="line-317"></a>
<a name="line-318"></a><a name="empty"></a><span class='hs-comment'>-- | The empty 'Doc'.</span>
<a name="line-319"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-320"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>const</span> <span class='hs-conid'>Empty</span>
<a name="line-321"></a><a name="doc"></a><span class='hs-definition'>doc</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Printable</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-322"></a><span class='hs-definition'>doc</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>const</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Document</span> <span class='hs-varid'>f</span>
<a name="line-323"></a>
<a name="line-324"></a><a name="%3c%3e"></a><span class='hs-comment'>-- | '(&lt;&gt;)' is the concatenation operator for 'Doc's</span>
<a name="line-325"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-326"></a><a name="%3c?%3e"></a><span class='hs-comment'>-- | @a '&lt;?&gt;' b@ is @a &lt;&gt; b@ if @a@ is not empty, else empty.</span>
<a name="line-327"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;?&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-328"></a><a name="%3c+%3e"></a><span class='hs-comment'>-- | @a '&lt;+&gt;' b@ is @a@ followed by a space, then @b@.</span>
<a name="line-329"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;+&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-330"></a><a name="$$"></a><span class='hs-comment'>-- | @a '$$' b@ is @a@ above @b@.</span>
<a name="line-331"></a><span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-332"></a><span class='hs-comment'>-- a then b</span>
<a name="line-333"></a><span class='hs-conid'>Doc</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span>
<a name="line-334"></a>   <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>a</span> <span class='hs-varid'>st</span> <span class='hs-keyword'>of</span>
<a name="line-335"></a>                <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-varid'>st</span>
<a name="line-336"></a>                <span class='hs-conid'>Document</span> <span class='hs-varid'>af</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-337"></a>                    <span class='hs-conid'>Document</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>af</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>b</span> <span class='hs-varid'>st</span> <span class='hs-keyword'>of</span>
<a name="line-338"></a>                                         <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span>
<a name="line-339"></a>                                         <span class='hs-conid'>Document</span> <span class='hs-varid'>bf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>bf</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-340"></a>
<a name="line-341"></a><span class='hs-comment'>-- empty if a empty, else a then b</span>
<a name="line-342"></a><span class='hs-conid'>Doc</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;?&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span>
<a name="line-343"></a>    <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>a</span> <span class='hs-varid'>st</span> <span class='hs-keyword'>of</span>
<a name="line-344"></a>                 <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Empty</span>
<a name="line-345"></a>                 <span class='hs-conid'>Document</span> <span class='hs-varid'>af</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Document</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>af</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>b</span> <span class='hs-varid'>st</span> <span class='hs-keyword'>of</span>
<a name="line-346"></a>                                                     <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span>
<a name="line-347"></a>                                                     <span class='hs-conid'>Document</span> <span class='hs-varid'>bf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>bf</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-348"></a>
<a name="line-349"></a><span class='hs-comment'>-- a then space then b</span>
<a name="line-350"></a><span class='hs-conid'>Doc</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span>
<a name="line-351"></a>    <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>a</span> <span class='hs-varid'>st</span> <span class='hs-keyword'>of</span>
<a name="line-352"></a>                 <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-varid'>st</span>
<a name="line-353"></a>                 <span class='hs-conid'>Document</span> <span class='hs-varid'>af</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Document</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>af</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>b</span> <span class='hs-varid'>st</span> <span class='hs-keyword'>of</span>
<a name="line-354"></a>                                                     <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span>
<a name="line-355"></a>                                                     <span class='hs-conid'>Document</span> <span class='hs-varid'>bf</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-356"></a>                                                         <span class='hs-varid'>spaceP</span><span class='hs-conop'>:</span><span class='hs-varid'>bf</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-357"></a>
<a name="line-358"></a><span class='hs-comment'>-- a above b</span>
<a name="line-359"></a><span class='hs-conid'>Doc</span> <span class='hs-varid'>a</span> <span class='hs-varop'>$$</span> <span class='hs-conid'>Doc</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span>
<a name="line-360"></a>   <span class='hs-conid'>Doc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>st</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>a</span> <span class='hs-varid'>st</span> <span class='hs-keyword'>of</span>
<a name="line-361"></a>                <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-varid'>st</span>
<a name="line-362"></a>                <span class='hs-conid'>Document</span> <span class='hs-varid'>af</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-363"></a>                    <span class='hs-conid'>Document</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>af</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>b</span> <span class='hs-varid'>st</span> <span class='hs-keyword'>of</span>
<a name="line-364"></a>                                         <span class='hs-conid'>Empty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span>
<a name="line-365"></a>                                         <span class='hs-conid'>Document</span> <span class='hs-varid'>bf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>sf</span> <span class='hs-layout'>(</span><span class='hs-varid'>newlineP</span><span class='hs-conop'>:</span><span class='hs-varid'>pf</span> <span class='hs-layout'>(</span><span class='hs-varid'>bf</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-366"></a>                        <span class='hs-keyword'>where</span> <span class='hs-varid'>pf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>currentPrefix</span> <span class='hs-varid'>st</span>
<a name="line-367"></a>                              <span class='hs-varid'>sf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lineColorS</span> <span class='hs-varop'>$</span> <span class='hs-varid'>printers</span> <span class='hs-varid'>st</span>
<a name="line-368"></a>
<a name="line-369"></a><a name="vcat"></a><span class='hs-comment'>-- | 'vcat' piles vertically a list of 'Doc's.</span>
<a name="line-370"></a><span class='hs-definition'>vcat</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Doc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-371"></a><span class='hs-definition'>vcat</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-372"></a><span class='hs-definition'>vcat</span> <span class='hs-varid'>ds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr1</span> <span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span>
<a name="line-373"></a>
<a name="line-374"></a><a name="vsep"></a><span class='hs-comment'>-- | 'vsep' piles vertically a list of 'Doc's leaving a blank line between each.</span>
<a name="line-375"></a><span class='hs-definition'>vsep</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Doc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-376"></a><span class='hs-definition'>vsep</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-377"></a><span class='hs-definition'>vsep</span> <span class='hs-varid'>ds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr1</span> <span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>intersperse</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>""</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span>
<a name="line-378"></a>
<a name="line-379"></a><a name="hcat"></a><span class='hs-comment'>-- | 'hcat' concatenates (horizontally) a list of 'Doc's</span>
<a name="line-380"></a><span class='hs-definition'>hcat</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Doc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-381"></a><span class='hs-definition'>hcat</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-382"></a><span class='hs-definition'>hcat</span> <span class='hs-varid'>ds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr1</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span>
<a name="line-383"></a>
</pre>\end{code}

</body>
</html>