Sophie

Sophie

distrib > Fedora > 19 > i386 > by-pkgid > c455419798a70ac4631caa36d7302e85 > files > 27

ghc-ansi-wl-pprint-devel-0.6.7.1-1.fc19.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>Text/PrettyPrint/ANSI/Leijen.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      :  Text.PrettyPrint.ANSI.Leijen</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   :  Daan Leijen (c) 2000, <a href="http://www.cs.uu.nl/~daan">http://www.cs.uu.nl/~daan</a></span>
<a name="line-5"></a><span class='hs-comment'>--                Max Bolingbroke (c) 2008, <a href="http://blog.omega-prime.co.uk">http://blog.omega-prime.co.uk</a></span>
<a name="line-6"></a><span class='hs-comment'>-- License     :  BSD-style (see the file LICENSE)</span>
<a name="line-7"></a><span class='hs-comment'>--</span>
<a name="line-8"></a><span class='hs-comment'>-- Maintainer  :  batterseapower@hotmail.com</span>
<a name="line-9"></a><span class='hs-comment'>-- Stability   :  provisional</span>
<a name="line-10"></a><span class='hs-comment'>-- Portability :  portable</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- Pretty print module based on Philip Wadler's \"prettier printer\"</span>
<a name="line-13"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><span class='hs-comment'>-- @</span>
<a name="line-15"></a><span class='hs-comment'>--      \"A prettier printer\"</span>
<a name="line-16"></a><span class='hs-comment'>--      Draft paper, April 1997, revised March 1998.</span>
<a name="line-17"></a><span class='hs-comment'>--      &lt;<a href="http://cm.bell-labs.com/cm/cs/who/wadler/papers/prettier/prettier.ps">http://cm.bell-labs.com/cm/cs/who/wadler/papers/prettier/prettier.ps</a>&gt;</span>
<a name="line-18"></a><span class='hs-comment'>-- @</span>
<a name="line-19"></a><span class='hs-comment'>--</span>
<a name="line-20"></a><span class='hs-comment'>-- PPrint is an implementation of the pretty printing combinators</span>
<a name="line-21"></a><span class='hs-comment'>-- described by Philip Wadler (1997). In their bare essence, the</span>
<a name="line-22"></a><span class='hs-comment'>-- combinators of Wadler are not expressive enough to describe some</span>
<a name="line-23"></a><span class='hs-comment'>-- commonly occurring layouts. The PPrint library adds new primitives</span>
<a name="line-24"></a><span class='hs-comment'>-- to describe these layouts and works well in practice.</span>
<a name="line-25"></a><span class='hs-comment'>--</span>
<a name="line-26"></a><span class='hs-comment'>-- The library is based on a single way to concatenate documents,</span>
<a name="line-27"></a><span class='hs-comment'>-- which is associative and has both a left and right unit.  This</span>
<a name="line-28"></a><span class='hs-comment'>-- simple design leads to an efficient and short implementation. The</span>
<a name="line-29"></a><span class='hs-comment'>-- simplicity is reflected in the predictable behaviour of the</span>
<a name="line-30"></a><span class='hs-comment'>-- combinators which make them easy to use in practice.</span>
<a name="line-31"></a><span class='hs-comment'>--</span>
<a name="line-32"></a><span class='hs-comment'>-- A thorough description of the primitive combinators and their</span>
<a name="line-33"></a><span class='hs-comment'>-- implementation can be found in Philip Wadler's paper</span>
<a name="line-34"></a><span class='hs-comment'>-- (1997). Additions and the main differences with his original paper</span>
<a name="line-35"></a><span class='hs-comment'>-- are:</span>
<a name="line-36"></a><span class='hs-comment'>--</span>
<a name="line-37"></a><span class='hs-comment'>-- * The nil document is called empty.</span>
<a name="line-38"></a><span class='hs-comment'>--</span>
<a name="line-39"></a><span class='hs-comment'>-- * The above combinator is called '&lt;$&gt;'. The operator '&lt;/&gt;' is used</span>
<a name="line-40"></a><span class='hs-comment'>-- for soft line breaks.</span>
<a name="line-41"></a><span class='hs-comment'>--</span>
<a name="line-42"></a><span class='hs-comment'>-- * There are three new primitives: 'align', 'fill' and</span>
<a name="line-43"></a><span class='hs-comment'>-- 'fillBreak'. These are very useful in practice.</span>
<a name="line-44"></a><span class='hs-comment'>--</span>
<a name="line-45"></a><span class='hs-comment'>-- * Lots of other useful combinators, like 'fillSep' and 'list'.</span>
<a name="line-46"></a><span class='hs-comment'>--</span>
<a name="line-47"></a><span class='hs-comment'>-- * There are two renderers, 'renderPretty' for pretty printing and</span>
<a name="line-48"></a><span class='hs-comment'>-- 'renderCompact' for compact output. The pretty printing algorithm</span>
<a name="line-49"></a><span class='hs-comment'>-- also uses a ribbon-width now for even prettier output.</span>
<a name="line-50"></a><span class='hs-comment'>--</span>
<a name="line-51"></a><span class='hs-comment'>-- * There are two displayers, 'displayS' for strings and 'displayIO' for</span>
<a name="line-52"></a><span class='hs-comment'>-- file based output.</span>
<a name="line-53"></a><span class='hs-comment'>--</span>
<a name="line-54"></a><span class='hs-comment'>-- * There is a 'Pretty' class.</span>
<a name="line-55"></a><span class='hs-comment'>--</span>
<a name="line-56"></a><span class='hs-comment'>-- * The implementation uses optimised representations and strictness</span>
<a name="line-57"></a><span class='hs-comment'>-- annotations.</span>
<a name="line-58"></a><span class='hs-comment'>--</span>
<a name="line-59"></a><span class='hs-comment'>-- Full documentation for the original wl-pprint library available at</span>
<a name="line-60"></a><span class='hs-comment'>-- &lt;<a href="http://www.cs.uu.nl/~daan/download/pprint/pprint.html">http://www.cs.uu.nl/~daan/download/pprint/pprint.html</a>&gt;.</span>
<a name="line-61"></a><span class='hs-comment'>--</span>
<a name="line-62"></a><span class='hs-comment'>-- The library has been extended to allow formatting text for output</span>
<a name="line-63"></a><span class='hs-comment'>-- to ANSI style consoles. New combinators allow:</span>
<a name="line-64"></a><span class='hs-comment'>--</span>
<a name="line-65"></a><span class='hs-comment'>-- * Control of foreground and background color of text</span>
<a name="line-66"></a><span class='hs-comment'>--</span>
<a name="line-67"></a><span class='hs-comment'>-- * The abliity to make parts of the text bold or underlined</span>
<a name="line-68"></a><span class='hs-comment'>--</span>
<a name="line-69"></a><span class='hs-comment'>-- This functionality is, as far as possible, portable across platforms</span>
<a name="line-70"></a><span class='hs-comment'>-- with their varying terminals.  However, one thing to be particularly</span>
<a name="line-71"></a><span class='hs-comment'>-- wary of is that console colors will not be displayed on Windows unless</span>
<a name="line-72"></a><span class='hs-comment'>-- the 'Doc' value is output using the 'putDoc' function or one of it's</span>
<a name="line-73"></a><span class='hs-comment'>-- friends.  Rendering the 'Doc' to a 'String' and then outputing /that/</span>
<a name="line-74"></a><span class='hs-comment'>-- will only work on Unix-style operating systems.</span>
<a name="line-75"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-76"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>PrettyPrint</span><span class='hs-varop'>.</span><span class='hs-conid'>ANSI</span><span class='hs-varop'>.</span><span class='hs-conid'>Leijen</span> <span class='hs-layout'>(</span>
<a name="line-77"></a>   <span class='hs-comment'>-- * Documents</span>
<a name="line-78"></a>   <span class='hs-conid'>Doc</span><span class='hs-layout'>,</span> <span class='hs-varid'>putDoc</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutDoc</span><span class='hs-layout'>,</span>
<a name="line-79"></a>
<a name="line-80"></a>   <span class='hs-comment'>-- * Basic combinators</span>
<a name="line-81"></a>   <span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-varid'>char</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</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-varid'>nest</span><span class='hs-layout'>,</span> <span class='hs-varid'>line</span><span class='hs-layout'>,</span> <span class='hs-varid'>linebreak</span><span class='hs-layout'>,</span> <span class='hs-varid'>group</span><span class='hs-layout'>,</span> <span class='hs-varid'>softline</span><span class='hs-layout'>,</span>
<a name="line-82"></a>   <span class='hs-varid'>softbreak</span><span class='hs-layout'>,</span> <span class='hs-varid'>hardline</span><span class='hs-layout'>,</span> <span class='hs-varid'>flatAlt</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderSmart</span><span class='hs-layout'>,</span>
<a name="line-83"></a>
<a name="line-84"></a>   <span class='hs-comment'>-- * Alignment</span>
<a name="line-85"></a>   <span class='hs-comment'>--</span>
<a name="line-86"></a>   <span class='hs-comment'>-- The combinators in this section can not be described by Wadler's</span>
<a name="line-87"></a>   <span class='hs-comment'>-- original combinators. They align their output relative to the</span>
<a name="line-88"></a>   <span class='hs-comment'>-- current output position - in contrast to @nest@ which always</span>
<a name="line-89"></a>   <span class='hs-comment'>-- aligns to the current nesting level. This deprives these</span>
<a name="line-90"></a>   <span class='hs-comment'>-- combinators from being \`optimal\'. In practice however they</span>
<a name="line-91"></a>   <span class='hs-comment'>-- prove to be very useful. The combinators in this section should</span>
<a name="line-92"></a>   <span class='hs-comment'>-- be used with care, since they are more expensive than the other</span>
<a name="line-93"></a>   <span class='hs-comment'>-- combinators. For example, @align@ shouldn't be used to pretty</span>
<a name="line-94"></a>   <span class='hs-comment'>-- print all top-level declarations of a language, but using @hang@</span>
<a name="line-95"></a>   <span class='hs-comment'>-- for let expressions is fine.</span>
<a name="line-96"></a>   <span class='hs-varid'>align</span><span class='hs-layout'>,</span> <span class='hs-varid'>hang</span><span class='hs-layout'>,</span> <span class='hs-varid'>indent</span><span class='hs-layout'>,</span> <span class='hs-varid'>encloseSep</span><span class='hs-layout'>,</span> <span class='hs-varid'>list</span><span class='hs-layout'>,</span> <span class='hs-varid'>tupled</span><span class='hs-layout'>,</span> <span class='hs-varid'>semiBraces</span><span class='hs-layout'>,</span>
<a name="line-97"></a>
<a name="line-98"></a>   <span class='hs-comment'>-- * Operators</span>
<a name="line-99"></a>   <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'>&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>
<a name="line-100"></a>
<a name="line-101"></a>   <span class='hs-comment'>-- * List combinators</span>
<a name="line-102"></a>   <span class='hs-varid'>hsep</span><span class='hs-layout'>,</span> <span class='hs-varid'>vsep</span><span class='hs-layout'>,</span> <span class='hs-varid'>fillSep</span><span class='hs-layout'>,</span> <span class='hs-varid'>sep</span><span class='hs-layout'>,</span> <span class='hs-varid'>hcat</span><span class='hs-layout'>,</span> <span class='hs-varid'>vcat</span><span class='hs-layout'>,</span> <span class='hs-varid'>fillCat</span><span class='hs-layout'>,</span> <span class='hs-varid'>cat</span><span class='hs-layout'>,</span> <span class='hs-varid'>punctuate</span><span class='hs-layout'>,</span>
<a name="line-103"></a>
<a name="line-104"></a>   <span class='hs-comment'>-- * Fillers</span>
<a name="line-105"></a>   <span class='hs-varid'>fill</span><span class='hs-layout'>,</span> <span class='hs-varid'>fillBreak</span><span class='hs-layout'>,</span>
<a name="line-106"></a>
<a name="line-107"></a>   <span class='hs-comment'>-- * Bracketing combinators</span>
<a name="line-108"></a>   <span class='hs-varid'>enclose</span><span class='hs-layout'>,</span> <span class='hs-varid'>squotes</span><span class='hs-layout'>,</span> <span class='hs-varid'>dquotes</span><span class='hs-layout'>,</span> <span class='hs-varid'>parens</span><span class='hs-layout'>,</span> <span class='hs-varid'>angles</span><span class='hs-layout'>,</span> <span class='hs-varid'>braces</span><span class='hs-layout'>,</span> <span class='hs-varid'>brackets</span><span class='hs-layout'>,</span>
<a name="line-109"></a>
<a name="line-110"></a>   <span class='hs-comment'>-- * Character documents</span>
<a name="line-111"></a>   <span class='hs-varid'>lparen</span><span class='hs-layout'>,</span> <span class='hs-varid'>rparen</span><span class='hs-layout'>,</span> <span class='hs-varid'>langle</span><span class='hs-layout'>,</span> <span class='hs-varid'>rangle</span><span class='hs-layout'>,</span> <span class='hs-varid'>lbrace</span><span class='hs-layout'>,</span> <span class='hs-varid'>rbrace</span><span class='hs-layout'>,</span> <span class='hs-varid'>lbracket</span><span class='hs-layout'>,</span> <span class='hs-varid'>rbracket</span><span class='hs-layout'>,</span>
<a name="line-112"></a>   <span class='hs-varid'>squote</span><span class='hs-layout'>,</span> <span class='hs-varid'>dquote</span><span class='hs-layout'>,</span> <span class='hs-varid'>semi</span><span class='hs-layout'>,</span> <span class='hs-varid'>colon</span><span class='hs-layout'>,</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span> <span class='hs-varid'>space</span><span class='hs-layout'>,</span> <span class='hs-varid'>dot</span><span class='hs-layout'>,</span> <span class='hs-varid'>backslash</span><span class='hs-layout'>,</span> <span class='hs-varid'>equals</span><span class='hs-layout'>,</span>
<a name="line-113"></a>   
<a name="line-114"></a>   <span class='hs-comment'>-- * Colorisation combinators</span>
<a name="line-115"></a>   <span class='hs-varid'>black</span><span class='hs-layout'>,</span> <span class='hs-varid'>red</span><span class='hs-layout'>,</span> <span class='hs-varid'>green</span><span class='hs-layout'>,</span> <span class='hs-varid'>yellow</span><span class='hs-layout'>,</span> <span class='hs-varid'>blue</span><span class='hs-layout'>,</span> <span class='hs-varid'>magenta</span><span class='hs-layout'>,</span> <span class='hs-varid'>cyan</span><span class='hs-layout'>,</span> <span class='hs-varid'>white</span><span class='hs-layout'>,</span>
<a name="line-116"></a>   <span class='hs-varid'>dullblack</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullred</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullgreen</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullyellow</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullblue</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullmagenta</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullcyan</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullwhite</span><span class='hs-layout'>,</span>
<a name="line-117"></a>   <span class='hs-varid'>onblack</span><span class='hs-layout'>,</span> <span class='hs-varid'>onred</span><span class='hs-layout'>,</span> <span class='hs-varid'>ongreen</span><span class='hs-layout'>,</span> <span class='hs-varid'>onyellow</span><span class='hs-layout'>,</span> <span class='hs-varid'>onblue</span><span class='hs-layout'>,</span> <span class='hs-varid'>onmagenta</span><span class='hs-layout'>,</span> <span class='hs-varid'>oncyan</span><span class='hs-layout'>,</span> <span class='hs-varid'>onwhite</span><span class='hs-layout'>,</span>
<a name="line-118"></a>   <span class='hs-varid'>ondullblack</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullred</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullgreen</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullyellow</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullblue</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullmagenta</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullcyan</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullwhite</span><span class='hs-layout'>,</span>
<a name="line-119"></a>
<a name="line-120"></a>   <span class='hs-comment'>-- * Emboldening combinators</span>
<a name="line-121"></a>   <span class='hs-varid'>bold</span><span class='hs-layout'>,</span> <span class='hs-varid'>debold</span><span class='hs-layout'>,</span>
<a name="line-122"></a>   
<a name="line-123"></a>   <span class='hs-comment'>-- * Underlining combinators</span>
<a name="line-124"></a>   <span class='hs-varid'>underline</span><span class='hs-layout'>,</span> <span class='hs-varid'>deunderline</span><span class='hs-layout'>,</span>
<a name="line-125"></a>
<a name="line-126"></a>   <span class='hs-comment'>-- * Removing formatting</span>
<a name="line-127"></a>   <span class='hs-varid'>plain</span><span class='hs-layout'>,</span>
<a name="line-128"></a>
<a name="line-129"></a>   <span class='hs-comment'>-- * Primitive type documents</span>
<a name="line-130"></a>   <span class='hs-varid'>string</span><span class='hs-layout'>,</span> <span class='hs-varid'>int</span><span class='hs-layout'>,</span> <span class='hs-varid'>integer</span><span class='hs-layout'>,</span> <span class='hs-varid'>float</span><span class='hs-layout'>,</span> <span class='hs-varid'>double</span><span class='hs-layout'>,</span> <span class='hs-varid'>rational</span><span class='hs-layout'>,</span>
<a name="line-131"></a>
<a name="line-132"></a>   <span class='hs-comment'>-- * Pretty class</span>
<a name="line-133"></a>   <span class='hs-conid'>Pretty</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-134"></a>
<a name="line-135"></a>   <span class='hs-comment'>-- * Rendering</span>
<a name="line-136"></a>   <span class='hs-conid'>SimpleDoc</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderPretty</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderCompact</span><span class='hs-layout'>,</span> <span class='hs-varid'>displayS</span><span class='hs-layout'>,</span> <span class='hs-varid'>displayIO</span>
<a name="line-137"></a>
<a name="line-138"></a>   <span class='hs-comment'>-- * Undocumented</span>
<a name="line-139"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>bool</span>
<a name="line-140"></a>
<a name="line-141"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>column</span><span class='hs-layout'>,</span> <span class='hs-varid'>columns</span><span class='hs-layout'>,</span> <span class='hs-varid'>nesting</span><span class='hs-layout'>,</span> <span class='hs-varid'>width</span>
<a name="line-142"></a>
<a name="line-143"></a>        <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-144"></a>
<a name="line-145"></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'>hPutStr</span><span class='hs-layout'>,</span><span class='hs-varid'>hPutChar</span><span class='hs-layout'>,</span><span class='hs-varid'>stdout</span><span class='hs-layout'>)</span>
<a name="line-146"></a>
<a name="line-147"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Console</span><span class='hs-varop'>.</span><span class='hs-conid'>ANSI</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> <span class='hs-conid'>ColorIntensity</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'>ConsoleLayer</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-148"></a>                            <span class='hs-conid'>Underlining</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'>ConsoleIntensity</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-149"></a>                            <span class='hs-conid'>SGR</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>hSetSGR</span><span class='hs-layout'>,</span> <span class='hs-varid'>setSGRCode</span><span class='hs-layout'>)</span>
<a name="line-150"></a>
<a name="line-151"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>IsString</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-152"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>catMaybes</span><span class='hs-layout'>)</span>
<a name="line-153"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monoid</span><span class='hs-layout'>,</span> <span class='hs-varid'>mappend</span><span class='hs-layout'>,</span> <span class='hs-varid'>mconcat</span><span class='hs-layout'>,</span> <span class='hs-varid'>mempty</span><span class='hs-layout'>)</span>
<a name="line-154"></a>
<a name="line-155"></a>
<a name="line-156"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>5</span> <span class='hs-varop'>&lt;/&gt;</span><span class='hs-layout'>,</span><span class='hs-varop'>&lt;//&gt;</span><span class='hs-layout'>,</span><span class='hs-varop'>&lt;$&gt;</span><span class='hs-layout'>,</span><span class='hs-varop'>&lt;$$&gt;</span>
<a name="line-157"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>6</span> <span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>,</span><span class='hs-varop'>&lt;+&gt;</span>
<a name="line-158"></a>
<a name="line-159"></a>
<a name="line-160"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-161"></a><span class='hs-comment'>-- list, tupled and semiBraces pretty print a list of</span>
<a name="line-162"></a><span class='hs-comment'>-- documents either horizontally or vertically aligned.</span>
<a name="line-163"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-164"></a>
<a name="line-165"></a>
<a name="line-166"></a><a name="list"></a><span class='hs-comment'>-- | The document @(list xs)@ comma separates the documents @xs@ and</span>
<a name="line-167"></a><span class='hs-comment'>-- encloses them in square brackets. The documents are rendered</span>
<a name="line-168"></a><span class='hs-comment'>-- horizontally if that fits the page. Otherwise they are aligned</span>
<a name="line-169"></a><span class='hs-comment'>-- vertically. All comma separators are put in front of the elements.</span>
<a name="line-170"></a><span class='hs-definition'>list</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-171"></a><span class='hs-definition'>list</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>encloseSep</span> <span class='hs-varid'>lbracket</span> <span class='hs-varid'>rbracket</span> <span class='hs-varid'>comma</span>
<a name="line-172"></a>
<a name="line-173"></a><a name="tupled"></a><span class='hs-comment'>-- | The document @(tupled xs)@ comma separates the documents @xs@ and</span>
<a name="line-174"></a><span class='hs-comment'>-- encloses them in parenthesis. The documents are rendered</span>
<a name="line-175"></a><span class='hs-comment'>-- horizontally if that fits the page. Otherwise they are aligned</span>
<a name="line-176"></a><span class='hs-comment'>-- vertically. All comma separators are put in front of the elements.</span>
<a name="line-177"></a><span class='hs-definition'>tupled</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-178"></a><span class='hs-definition'>tupled</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>encloseSep</span> <span class='hs-varid'>lparen</span>   <span class='hs-varid'>rparen</span>  <span class='hs-varid'>comma</span>
<a name="line-179"></a>
<a name="line-180"></a>
<a name="line-181"></a><a name="semiBraces"></a><span class='hs-comment'>-- | The document @(semiBraces xs)@ separates the documents @xs@ with</span>
<a name="line-182"></a><span class='hs-comment'>-- semi colons and encloses them in braces. The documents are rendered</span>
<a name="line-183"></a><span class='hs-comment'>-- horizontally if that fits the page. Otherwise they are aligned</span>
<a name="line-184"></a><span class='hs-comment'>-- vertically. All semi colons are put in front of the elements.</span>
<a name="line-185"></a><span class='hs-definition'>semiBraces</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-186"></a><span class='hs-definition'>semiBraces</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>encloseSep</span> <span class='hs-varid'>lbrace</span>   <span class='hs-varid'>rbrace</span>  <span class='hs-varid'>semi</span>
<a name="line-187"></a>
<a name="line-188"></a><a name="encloseSep"></a><span class='hs-comment'>-- | The document @(encloseSep l r sep xs)@ concatenates the documents</span>
<a name="line-189"></a><span class='hs-comment'>-- @xs@ separated by @sep@ and encloses the resulting document by @l@</span>
<a name="line-190"></a><span class='hs-comment'>-- and @r@. The documents are rendered horizontally if that fits the</span>
<a name="line-191"></a><span class='hs-comment'>-- page. Otherwise they are aligned vertically. All separators are put</span>
<a name="line-192"></a><span class='hs-comment'>-- in front of the elements. For example, the combinator 'list' can be</span>
<a name="line-193"></a><span class='hs-comment'>-- defined with @encloseSep@:</span>
<a name="line-194"></a><span class='hs-comment'>--</span>
<a name="line-195"></a><span class='hs-comment'>-- &gt; list xs = encloseSep lbracket rbracket comma xs</span>
<a name="line-196"></a><span class='hs-comment'>-- &gt; test    = text "list" &lt;+&gt; (list (map int [10,200,3000]))</span>
<a name="line-197"></a><span class='hs-comment'>--</span>
<a name="line-198"></a><span class='hs-comment'>-- Which is layed out with a page width of 20 as:</span>
<a name="line-199"></a><span class='hs-comment'>--</span>
<a name="line-200"></a><span class='hs-comment'>-- @</span>
<a name="line-201"></a><span class='hs-comment'>-- list [10,200,3000]</span>
<a name="line-202"></a><span class='hs-comment'>-- @</span>
<a name="line-203"></a><span class='hs-comment'>--</span>
<a name="line-204"></a><span class='hs-comment'>-- But when the page width is 15, it is layed out as:</span>
<a name="line-205"></a><span class='hs-comment'>--</span>
<a name="line-206"></a><span class='hs-comment'>-- @</span>
<a name="line-207"></a><span class='hs-comment'>-- list [10</span>
<a name="line-208"></a><span class='hs-comment'>--      ,200</span>
<a name="line-209"></a><span class='hs-comment'>--      ,3000]</span>
<a name="line-210"></a><span class='hs-comment'>-- @</span>
<a name="line-211"></a><span class='hs-definition'>encloseSep</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> <span class='hs-keyglyph'>-&gt;</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-212"></a><span class='hs-definition'>encloseSep</span> <span class='hs-varid'>left</span> <span class='hs-varid'>right</span> <span class='hs-varid'>sep</span> <span class='hs-varid'>ds</span>
<a name="line-213"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>ds</span> <span class='hs-keyword'>of</span>
<a name="line-214"></a>        <span class='hs-conid'>[]</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>left</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>right</span>
<a name="line-215"></a>        <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>left</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'>right</span>
<a name="line-216"></a>        <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>align</span> <span class='hs-layout'>(</span><span class='hs-varid'>cat</span> <span class='hs-layout'>(</span><span class='hs-varid'>zipWith</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-varid'>left</span> <span class='hs-conop'>:</span> <span class='hs-varid'>repeat</span> <span class='hs-varid'>sep</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>right</span><span class='hs-layout'>)</span> 
<a name="line-217"></a>
<a name="line-218"></a>
<a name="line-219"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-220"></a><span class='hs-comment'>-- punctuate p [d1,d2,...,dn] =&gt; [d1 &lt;&gt; p,d2 &lt;&gt; p, ... ,dn]</span>
<a name="line-221"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-222"></a>
<a name="line-223"></a>
<a name="line-224"></a><a name="punctuate"></a><span class='hs-comment'>-- | @(punctuate p xs)@ concatenates all documents in @xs@ with</span>
<a name="line-225"></a><span class='hs-comment'>-- document @p@ except for the last document.</span>
<a name="line-226"></a><span class='hs-comment'>--</span>
<a name="line-227"></a><span class='hs-comment'>-- &gt; someText = map text ["words","in","a","tuple"]</span>
<a name="line-228"></a><span class='hs-comment'>-- &gt; test     = parens (align (cat (punctuate comma someText)))</span>
<a name="line-229"></a><span class='hs-comment'>--</span>
<a name="line-230"></a><span class='hs-comment'>-- This is layed out on a page width of 20 as:</span>
<a name="line-231"></a><span class='hs-comment'>--</span>
<a name="line-232"></a><span class='hs-comment'>-- @</span>
<a name="line-233"></a><span class='hs-comment'>-- (words,in,a,tuple)</span>
<a name="line-234"></a><span class='hs-comment'>-- @</span>
<a name="line-235"></a><span class='hs-comment'>--</span>
<a name="line-236"></a><span class='hs-comment'>-- But when the page width is 15, it is layed out as:</span>
<a name="line-237"></a><span class='hs-comment'>--</span>
<a name="line-238"></a><span class='hs-comment'>-- @</span>
<a name="line-239"></a><span class='hs-comment'>-- (words,</span>
<a name="line-240"></a><span class='hs-comment'>--  in,</span>
<a name="line-241"></a><span class='hs-comment'>--  a,</span>
<a name="line-242"></a><span class='hs-comment'>--  tuple)</span>
<a name="line-243"></a><span class='hs-comment'>-- @</span>
<a name="line-244"></a><span class='hs-comment'>--</span>
<a name="line-245"></a><span class='hs-comment'>-- (If you want put the commas in front of their elements instead of</span>
<a name="line-246"></a><span class='hs-comment'>-- at the end, you should use 'tupled' or, in general, 'encloseSep'.)</span>
<a name="line-247"></a><span class='hs-definition'>punctuate</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'>Doc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Doc</span><span class='hs-keyglyph'>]</span>
<a name="line-248"></a><span class='hs-definition'>punctuate</span> <span class='hs-varid'>p</span> <span class='hs-conid'>[]</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-249"></a><span class='hs-definition'>punctuate</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span><span class='hs-keyglyph'>]</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span><span class='hs-keyglyph'>]</span>
<a name="line-250"></a><span class='hs-definition'>punctuate</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>punctuate</span> <span class='hs-varid'>p</span> <span class='hs-varid'>ds</span>
<a name="line-251"></a>
<a name="line-252"></a>
<a name="line-253"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-254"></a><span class='hs-comment'>-- high-level combinators</span>
<a name="line-255"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-256"></a>
<a name="line-257"></a>
<a name="line-258"></a><a name="sep"></a><span class='hs-comment'>-- | The document @(sep xs)@ concatenates all documents @xs@ either</span>
<a name="line-259"></a><span class='hs-comment'>-- horizontally with @(\&lt;+\&gt;)@, if it fits the page, or vertically with</span>
<a name="line-260"></a><span class='hs-comment'>-- @(\&lt;$\&gt;)@.</span>
<a name="line-261"></a><span class='hs-comment'>--</span>
<a name="line-262"></a><span class='hs-comment'>-- &gt; sep xs  = group (vsep xs)</span>
<a name="line-263"></a><span class='hs-definition'>sep</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-264"></a><span class='hs-definition'>sep</span>             <span class='hs-keyglyph'>=</span> <span class='hs-varid'>group</span> <span class='hs-varop'>.</span> <span class='hs-varid'>vsep</span>
<a name="line-265"></a>
<a name="line-266"></a><a name="fillSep"></a><span class='hs-comment'>-- | The document @(fillSep xs)@ concatenates documents @xs@</span>
<a name="line-267"></a><span class='hs-comment'>-- horizontally with @(\&lt;+\&gt;)@ as long as its fits the page, than</span>
<a name="line-268"></a><span class='hs-comment'>-- inserts a @line@ and continues doing that for all documents in</span>
<a name="line-269"></a><span class='hs-comment'>-- @xs@.</span>
<a name="line-270"></a><span class='hs-comment'>--</span>
<a name="line-271"></a><span class='hs-comment'>-- &gt; fillSep xs  = foldr (\&lt;\/\&gt;) empty xs</span>
<a name="line-272"></a><span class='hs-definition'>fillSep</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-273"></a><span class='hs-definition'>fillSep</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fold</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;/&gt;</span><span class='hs-layout'>)</span>
<a name="line-274"></a>
<a name="line-275"></a><a name="hsep"></a><span class='hs-comment'>-- | The document @(hsep xs)@ concatenates all documents @xs@</span>
<a name="line-276"></a><span class='hs-comment'>-- horizontally with @(\&lt;+\&gt;)@.</span>
<a name="line-277"></a><span class='hs-definition'>hsep</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-278"></a><span class='hs-definition'>hsep</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fold</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;+&gt;</span><span class='hs-layout'>)</span>
<a name="line-279"></a>
<a name="line-280"></a>
<a name="line-281"></a><a name="vsep"></a><span class='hs-comment'>-- | The document @(vsep xs)@ concatenates all documents @xs@</span>
<a name="line-282"></a><span class='hs-comment'>-- vertically with @(\&lt;$\&gt;)@. If a 'group' undoes the line breaks</span>
<a name="line-283"></a><span class='hs-comment'>-- inserted by @vsep@, all documents are separated with a space.</span>
<a name="line-284"></a><span class='hs-comment'>--</span>
<a name="line-285"></a><span class='hs-comment'>-- &gt; someText = map text (words ("text to lay out"))</span>
<a name="line-286"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-287"></a><span class='hs-comment'>-- &gt; test     = text "some" &lt;+&gt; vsep someText</span>
<a name="line-288"></a><span class='hs-comment'>--</span>
<a name="line-289"></a><span class='hs-comment'>-- This is layed out as:</span>
<a name="line-290"></a><span class='hs-comment'>--</span>
<a name="line-291"></a><span class='hs-comment'>-- @</span>
<a name="line-292"></a><span class='hs-comment'>-- some text</span>
<a name="line-293"></a><span class='hs-comment'>-- to</span>
<a name="line-294"></a><span class='hs-comment'>-- lay</span>
<a name="line-295"></a><span class='hs-comment'>-- out</span>
<a name="line-296"></a><span class='hs-comment'>-- @</span>
<a name="line-297"></a><span class='hs-comment'>--</span>
<a name="line-298"></a><span class='hs-comment'>-- The 'align' combinator can be used to align the documents under</span>
<a name="line-299"></a><span class='hs-comment'>-- their first element</span>
<a name="line-300"></a><span class='hs-comment'>--</span>
<a name="line-301"></a><span class='hs-comment'>-- &gt; test     = text "some" &lt;+&gt; align (vsep someText)</span>
<a name="line-302"></a><span class='hs-comment'>--</span>
<a name="line-303"></a><span class='hs-comment'>-- Which is printed as:</span>
<a name="line-304"></a><span class='hs-comment'>--</span>
<a name="line-305"></a><span class='hs-comment'>-- @</span>
<a name="line-306"></a><span class='hs-comment'>-- some text</span>
<a name="line-307"></a><span class='hs-comment'>--      to</span>
<a name="line-308"></a><span class='hs-comment'>--      lay</span>
<a name="line-309"></a><span class='hs-comment'>--      out</span>
<a name="line-310"></a><span class='hs-comment'>-- @</span>
<a name="line-311"></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-312"></a><span class='hs-definition'>vsep</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fold</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;$&gt;</span><span class='hs-layout'>)</span>
<a name="line-313"></a>
<a name="line-314"></a><a name="cat"></a><span class='hs-comment'>-- | The document @(cat xs)@ concatenates all documents @xs@ either</span>
<a name="line-315"></a><span class='hs-comment'>-- horizontally with @(\&lt;\&gt;)@, if it fits the page, or vertically with</span>
<a name="line-316"></a><span class='hs-comment'>-- @(\&lt;$$\&gt;)@.</span>
<a name="line-317"></a><span class='hs-comment'>--</span>
<a name="line-318"></a><span class='hs-comment'>-- &gt; cat xs  = group (vcat xs)</span>
<a name="line-319"></a><span class='hs-definition'>cat</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-320"></a><span class='hs-definition'>cat</span>             <span class='hs-keyglyph'>=</span> <span class='hs-varid'>group</span> <span class='hs-varop'>.</span> <span class='hs-varid'>vcat</span>
<a name="line-321"></a>
<a name="line-322"></a><a name="fillCat"></a><span class='hs-comment'>-- | The document @(fillCat xs)@ concatenates documents @xs@</span>
<a name="line-323"></a><span class='hs-comment'>-- horizontally with @(\&lt;\&gt;)@ as long as its fits the page, than inserts</span>
<a name="line-324"></a><span class='hs-comment'>-- a @linebreak@ and continues doing that for all documents in @xs@.</span>
<a name="line-325"></a><span class='hs-comment'>--</span>
<a name="line-326"></a><span class='hs-comment'>-- &gt; fillCat xs  = foldr (\&lt;\/\/\&gt;) empty xs</span>
<a name="line-327"></a><span class='hs-definition'>fillCat</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-328"></a><span class='hs-definition'>fillCat</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fold</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;//&gt;</span><span class='hs-layout'>)</span>
<a name="line-329"></a>
<a name="line-330"></a><a name="hcat"></a><span class='hs-comment'>-- | The document @(hcat xs)@ concatenates all documents @xs@</span>
<a name="line-331"></a><span class='hs-comment'>-- horizontally with @(\&lt;\&gt;)@.</span>
<a name="line-332"></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-333"></a><span class='hs-definition'>hcat</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fold</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>)</span>
<a name="line-334"></a>
<a name="line-335"></a><a name="vcat"></a><span class='hs-comment'>-- | The document @(vcat xs)@ concatenates all documents @xs@</span>
<a name="line-336"></a><span class='hs-comment'>-- vertically with @(\&lt;$$\&gt;)@. If a 'group' undoes the line breaks</span>
<a name="line-337"></a><span class='hs-comment'>-- inserted by @vcat@, all documents are directly concatenated.</span>
<a name="line-338"></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-339"></a><span class='hs-definition'>vcat</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fold</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;$$&gt;</span><span class='hs-layout'>)</span>
<a name="line-340"></a>
<a name="line-341"></a><a name="fold"></a><span class='hs-definition'>fold</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</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><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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-342"></a><span class='hs-definition'>fold</span> <span class='hs-varid'>f</span> <span class='hs-conid'>[]</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-343"></a><span class='hs-definition'>fold</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ds</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr1</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ds</span>
<a name="line-344"></a>
<a name="line-345"></a><a name="%3c%3e"></a><span class='hs-comment'>-- | The document @(x \&lt;\&gt; y)@ concatenates document @x@ and document</span>
<a name="line-346"></a><span class='hs-comment'>-- @y@. It is an associative operation having 'empty' as a left and</span>
<a name="line-347"></a><span class='hs-comment'>-- right unit.  (infixr 6)</span>
<a name="line-348"></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-349"></a><a name="x"></a><span class='hs-definition'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>y</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`beside`</span> <span class='hs-varid'>y</span>
<a name="line-350"></a>
<a name="line-351"></a><a name="%3c+%3e"></a><span class='hs-comment'>-- | The document @(x \&lt;+\&gt; y)@ concatenates document @x@ and @y@ with a</span>
<a name="line-352"></a><span class='hs-comment'>-- @space@ in between.  (infixr 6)</span>
<a name="line-353"></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-354"></a><span class='hs-definition'>x</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>y</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>space</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>y</span>
<a name="line-355"></a>
<a name="line-356"></a><a name="%3c/%3e"></a><span class='hs-comment'>-- | The document @(x \&lt;\/\&gt; y)@ concatenates document @x@ and @y@ with a</span>
<a name="line-357"></a><span class='hs-comment'>-- 'softline' in between. This effectively puts @x@ and @y@ either</span>
<a name="line-358"></a><span class='hs-comment'>-- next to each other (with a @space@ in between) or underneath each</span>
<a name="line-359"></a><span class='hs-comment'>-- other. (infixr 5)</span>
<a name="line-360"></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-361"></a><span class='hs-definition'>x</span> <span class='hs-varop'>&lt;/&gt;</span> <span class='hs-varid'>y</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>softline</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>y</span>
<a name="line-362"></a>
<a name="line-363"></a><a name="%3c//%3e"></a><span class='hs-comment'>-- | The document @(x \&lt;\/\/\&gt; y)@ concatenates document @x@ and @y@ with</span>
<a name="line-364"></a><span class='hs-comment'>-- a 'softbreak' in between. This effectively puts @x@ and @y@ either</span>
<a name="line-365"></a><span class='hs-comment'>-- right next to each other or underneath each other. (infixr 5)</span>
<a name="line-366"></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-367"></a><span class='hs-definition'>x</span> <span class='hs-varop'>&lt;//&gt;</span> <span class='hs-varid'>y</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>softbreak</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>y</span>
<a name="line-368"></a>
<a name="line-369"></a><a name="%3c$%3e"></a><span class='hs-comment'>-- | The document @(x \&lt;$\&gt; y)@ concatenates document @x@ and @y@ with a</span>
<a name="line-370"></a><span class='hs-comment'>-- 'line' in between. (infixr 5)</span>
<a name="line-371"></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-372"></a><span class='hs-definition'>x</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>y</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>line</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>y</span>
<a name="line-373"></a>
<a name="line-374"></a><a name="%3c$$%3e"></a><span class='hs-comment'>-- | The document @(x \&lt;$$\&gt; y)@ concatenates document @x@ and @y@ with</span>
<a name="line-375"></a><span class='hs-comment'>-- a @linebreak@ in between. (infixr 5)</span>
<a name="line-376"></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-377"></a><span class='hs-definition'>x</span> <span class='hs-varop'>&lt;$$&gt;</span> <span class='hs-varid'>y</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>linebreak</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>y</span>
<a name="line-378"></a>
<a name="line-379"></a><a name="softline"></a><span class='hs-comment'>-- | The document @softline@ behaves like 'space' if the resulting</span>
<a name="line-380"></a><span class='hs-comment'>-- output fits the page, otherwise it behaves like 'line'.</span>
<a name="line-381"></a><span class='hs-comment'>--</span>
<a name="line-382"></a><span class='hs-comment'>-- &gt; softline = group line</span>
<a name="line-383"></a><span class='hs-definition'>softline</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-384"></a><span class='hs-definition'>softline</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>group</span> <span class='hs-varid'>line</span>
<a name="line-385"></a>
<a name="line-386"></a><a name="softbreak"></a><span class='hs-comment'>-- | The document @softbreak@ behaves like 'empty' if the resulting</span>
<a name="line-387"></a><span class='hs-comment'>-- output fits the page, otherwise it behaves like 'line'.</span>
<a name="line-388"></a><span class='hs-comment'>--</span>
<a name="line-389"></a><span class='hs-comment'>-- &gt; softbreak  = group linebreak</span>
<a name="line-390"></a><span class='hs-definition'>softbreak</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-391"></a><span class='hs-definition'>softbreak</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>group</span> <span class='hs-varid'>linebreak</span>
<a name="line-392"></a>
<a name="line-393"></a><a name="squotes"></a><span class='hs-comment'>-- | Document @(squotes x)@ encloses document @x@ with single quotes</span>
<a name="line-394"></a><span class='hs-comment'>-- \"'\".</span>
<a name="line-395"></a><span class='hs-definition'>squotes</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-396"></a><span class='hs-definition'>squotes</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>enclose</span> <span class='hs-varid'>squote</span> <span class='hs-varid'>squote</span>
<a name="line-397"></a>
<a name="line-398"></a><a name="dquotes"></a><span class='hs-comment'>-- | Document @(dquotes x)@ encloses document @x@ with double quotes</span>
<a name="line-399"></a><span class='hs-comment'>-- '\"'.</span>
<a name="line-400"></a><span class='hs-definition'>dquotes</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-401"></a><span class='hs-definition'>dquotes</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>enclose</span> <span class='hs-varid'>dquote</span> <span class='hs-varid'>dquote</span>
<a name="line-402"></a>
<a name="line-403"></a><a name="braces"></a><span class='hs-comment'>-- | Document @(braces x)@ encloses document @x@ in braces, \"{\" and</span>
<a name="line-404"></a><span class='hs-comment'>-- \"}\".</span>
<a name="line-405"></a><span class='hs-definition'>braces</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-406"></a><span class='hs-definition'>braces</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>enclose</span> <span class='hs-varid'>lbrace</span> <span class='hs-varid'>rbrace</span>
<a name="line-407"></a>
<a name="line-408"></a><a name="parens"></a><span class='hs-comment'>-- | Document @(parens x)@ encloses document @x@ in parenthesis, \"(\"</span>
<a name="line-409"></a><span class='hs-comment'>-- and \")\".</span>
<a name="line-410"></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-411"></a><span class='hs-definition'>parens</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>enclose</span> <span class='hs-varid'>lparen</span> <span class='hs-varid'>rparen</span>
<a name="line-412"></a>
<a name="line-413"></a><a name="angles"></a><span class='hs-comment'>-- | Document @(angles x)@ encloses document @x@ in angles, \"\&lt;\" and</span>
<a name="line-414"></a><span class='hs-comment'>-- \"\&gt;\".</span>
<a name="line-415"></a><span class='hs-definition'>angles</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-416"></a><span class='hs-definition'>angles</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>enclose</span> <span class='hs-varid'>langle</span> <span class='hs-varid'>rangle</span>
<a name="line-417"></a>
<a name="line-418"></a><a name="brackets"></a><span class='hs-comment'>-- | Document @(brackets x)@ encloses document @x@ in square brackets,</span>
<a name="line-419"></a><span class='hs-comment'>-- \"[\" and \"]\".</span>
<a name="line-420"></a><span class='hs-definition'>brackets</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-421"></a><span class='hs-definition'>brackets</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>enclose</span> <span class='hs-varid'>lbracket</span> <span class='hs-varid'>rbracket</span>
<a name="line-422"></a>
<a name="line-423"></a><a name="enclose"></a><span class='hs-comment'>-- | The document @(enclose l r x)@ encloses document @x@ between</span>
<a name="line-424"></a><span class='hs-comment'>-- documents @l@ and @r@ using @(\&lt;\&gt;)@.</span>
<a name="line-425"></a><span class='hs-comment'>--</span>
<a name="line-426"></a><span class='hs-comment'>-- &gt; enclose l r x   = l &lt;&gt; x &lt;&gt; r</span>
<a name="line-427"></a><span class='hs-definition'>enclose</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> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-428"></a><span class='hs-definition'>enclose</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-varid'>x</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>r</span>
<a name="line-429"></a>
<a name="line-430"></a><a name="lparen"></a><span class='hs-comment'>-- | The document @lparen@ contains a left parenthesis, \"(\".</span>
<a name="line-431"></a><span class='hs-definition'>lparen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-432"></a><span class='hs-definition'>lparen</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'('</span>
<a name="line-433"></a><a name="rparen"></a><span class='hs-comment'>-- | The document @rparen@ contains a right parenthesis, \")\".</span>
<a name="line-434"></a><span class='hs-definition'>rparen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-435"></a><span class='hs-definition'>rparen</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>')'</span>
<a name="line-436"></a><a name="langle"></a><span class='hs-comment'>-- | The document @langle@ contains a left angle, \"\&lt;\".</span>
<a name="line-437"></a><span class='hs-definition'>langle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-438"></a><span class='hs-definition'>langle</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'&lt;'</span>
<a name="line-439"></a><a name="rangle"></a><span class='hs-comment'>-- | The document @rangle@ contains a right angle, \"&gt;\".</span>
<a name="line-440"></a><span class='hs-definition'>rangle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-441"></a><span class='hs-definition'>rangle</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'&gt;'</span>
<a name="line-442"></a><a name="lbrace"></a><span class='hs-comment'>-- | The document @lbrace@ contains a left brace, \"{\".</span>
<a name="line-443"></a><span class='hs-definition'>lbrace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-444"></a><span class='hs-definition'>lbrace</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'{'</span>
<a name="line-445"></a><a name="rbrace"></a><span class='hs-comment'>-- | The document @rbrace@ contains a right brace, \"}\".</span>
<a name="line-446"></a><span class='hs-definition'>rbrace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-447"></a><span class='hs-definition'>rbrace</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'}'</span>
<a name="line-448"></a><a name="lbracket"></a><span class='hs-comment'>-- | The document @lbracket@ contains a left square bracket, \"[\".</span>
<a name="line-449"></a><span class='hs-definition'>lbracket</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-450"></a><span class='hs-definition'>lbracket</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'['</span>
<a name="line-451"></a><a name="rbracket"></a><span class='hs-comment'>-- | The document @rbracket@ contains a right square bracket, \"]\".</span>
<a name="line-452"></a><span class='hs-definition'>rbracket</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-453"></a><span class='hs-definition'>rbracket</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>']'</span>
<a name="line-454"></a>
<a name="line-455"></a>
<a name="line-456"></a><a name="squote"></a><span class='hs-comment'>-- | The document @squote@ contains a single quote, \"'\".</span>
<a name="line-457"></a><span class='hs-definition'>squote</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-458"></a><span class='hs-definition'>squote</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'\''</span>
<a name="line-459"></a><a name="dquote"></a><span class='hs-comment'>-- | The document @dquote@ contains a double quote, '\"'.</span>
<a name="line-460"></a><span class='hs-definition'>dquote</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-461"></a><span class='hs-definition'>dquote</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'"'</span>
<a name="line-462"></a><a name="semi"></a><span class='hs-comment'>-- | The document @semi@ contains a semi colon, \";\".</span>
<a name="line-463"></a><span class='hs-definition'>semi</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-464"></a><span class='hs-definition'>semi</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>';'</span>
<a name="line-465"></a><a name="colon"></a><span class='hs-comment'>-- | The document @colon@ contains a colon, \":\".</span>
<a name="line-466"></a><span class='hs-definition'>colon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-467"></a><span class='hs-definition'>colon</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>':'</span>
<a name="line-468"></a><a name="comma"></a><span class='hs-comment'>-- | The document @comma@ contains a comma, \",\".</span>
<a name="line-469"></a><span class='hs-definition'>comma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-470"></a><span class='hs-definition'>comma</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>','</span>
<a name="line-471"></a><a name="space"></a><span class='hs-comment'>-- | The document @space@ contains a single space, \" \".</span>
<a name="line-472"></a><span class='hs-comment'>--</span>
<a name="line-473"></a><span class='hs-comment'>-- &gt; x &lt;+&gt; y   = x &lt;&gt; space &lt;&gt; y</span>
<a name="line-474"></a><span class='hs-definition'>space</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-475"></a><span class='hs-definition'>space</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>' '</span>
<a name="line-476"></a><a name="dot"></a><span class='hs-comment'>-- | The document @dot@ contains a single dot, \".\".</span>
<a name="line-477"></a><span class='hs-definition'>dot</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-478"></a><span class='hs-definition'>dot</span>             <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'.'</span>
<a name="line-479"></a><a name="backslash"></a><span class='hs-comment'>-- | The document @backslash@ contains a back slash, \"\\\".</span>
<a name="line-480"></a><span class='hs-definition'>backslash</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-481"></a><span class='hs-definition'>backslash</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'\\'</span>
<a name="line-482"></a><a name="equals"></a><span class='hs-comment'>-- | The document @equals@ contains an equal sign, \"=\".</span>
<a name="line-483"></a><span class='hs-definition'>equals</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-484"></a><span class='hs-definition'>equals</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'='</span>
<a name="line-485"></a>
<a name="line-486"></a>
<a name="line-487"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-488"></a><span class='hs-comment'>-- Combinators for prelude types</span>
<a name="line-489"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-490"></a>
<a name="line-491"></a><span class='hs-comment'>-- string is like "text" but replaces '\n' by "line"</span>
<a name="line-492"></a>
<a name="line-493"></a><a name="string"></a><span class='hs-comment'>-- | The document @(string s)@ concatenates all characters in @s@</span>
<a name="line-494"></a><span class='hs-comment'>-- using @line@ for newline characters and @char@ for all other</span>
<a name="line-495"></a><span class='hs-comment'>-- characters. It is used instead of 'text' whenever the text contains</span>
<a name="line-496"></a><span class='hs-comment'>-- newline characters.</span>
<a name="line-497"></a><span class='hs-definition'>string</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-498"></a><span class='hs-definition'>string</span> <span class='hs-str'>""</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-499"></a><span class='hs-definition'>string</span> <span class='hs-layout'>(</span><span class='hs-chr'>'\n'</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>line</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>string</span> <span class='hs-varid'>s</span>
<a name="line-500"></a><span class='hs-definition'>string</span> <span class='hs-varid'>s</span>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>span</span> <span class='hs-layout'>(</span><span class='hs-varop'>/=</span><span class='hs-chr'>'\n'</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-501"></a>                    <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>text</span> <span class='hs-varid'>xs</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>string</span> <span class='hs-varid'>ys</span>
<a name="line-502"></a>
<a name="line-503"></a><a name="bool"></a><span class='hs-definition'>bool</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-504"></a><span class='hs-definition'>bool</span> <span class='hs-varid'>b</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-505"></a>
<a name="line-506"></a><a name="int"></a><span class='hs-comment'>-- | The document @(int i)@ shows the literal integer @i@ using</span>
<a name="line-507"></a><span class='hs-comment'>-- 'text'.</span>
<a name="line-508"></a><span class='hs-definition'>int</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-509"></a><span class='hs-definition'>int</span> <span class='hs-varid'>i</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-510"></a>
<a name="line-511"></a><a name="integer"></a><span class='hs-comment'>-- | The document @(integer i)@ shows the literal integer @i@ using</span>
<a name="line-512"></a><span class='hs-comment'>-- 'text'.</span>
<a name="line-513"></a><span class='hs-definition'>integer</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-514"></a><span class='hs-definition'>integer</span> <span class='hs-varid'>i</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-515"></a>
<a name="line-516"></a><a name="float"></a><span class='hs-comment'>-- | The document @(float f)@ shows the literal float @f@ using</span>
<a name="line-517"></a><span class='hs-comment'>-- 'text'.</span>
<a name="line-518"></a><span class='hs-definition'>float</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Float</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-519"></a><span class='hs-definition'>float</span> <span class='hs-varid'>f</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-520"></a>
<a name="line-521"></a><a name="double"></a><span class='hs-comment'>-- | The document @(double d)@ shows the literal double @d@ using</span>
<a name="line-522"></a><span class='hs-comment'>-- 'text'.</span>
<a name="line-523"></a><span class='hs-definition'>double</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Double</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-524"></a><span class='hs-definition'>double</span> <span class='hs-varid'>d</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-525"></a>
<a name="line-526"></a><a name="rational"></a><span class='hs-comment'>-- | The document @(rational r)@ shows the literal rational @r@ using</span>
<a name="line-527"></a><span class='hs-comment'>-- 'text'.</span>
<a name="line-528"></a><span class='hs-definition'>rational</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-529"></a><span class='hs-definition'>rational</span> <span class='hs-varid'>r</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-530"></a>
<a name="line-531"></a>
<a name="line-532"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-533"></a><span class='hs-comment'>-- overloading "pretty"</span>
<a name="line-534"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-535"></a>
<a name="line-536"></a><a name="Pretty"></a><span class='hs-comment'>-- | The member @prettyList@ is only used to define the @instance Pretty</span>
<a name="line-537"></a><a name="Pretty"></a><span class='hs-comment'>-- a =&gt; Pretty [a]@. In normal circumstances only the @pretty@ function</span>
<a name="line-538"></a><a name="Pretty"></a><span class='hs-comment'>-- is used.</span>
<a name="line-539"></a><a name="Pretty"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Pretty</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-540"></a>  <span class='hs-varid'>pretty</span>        <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-541"></a>  <span class='hs-varid'>prettyList</span>    <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-542"></a>  <span class='hs-varid'>prettyList</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>list</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-varid'>pretty</span>
<a name="line-543"></a>
<a name="line-544"></a><a name="instance%20Pretty%20%5ba%5d"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Pretty</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>where</span>
<a name="line-545"></a>  <span class='hs-varid'>pretty</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>prettyList</span>
<a name="line-546"></a>
<a name="line-547"></a><a name="instance%20Pretty%20Doc"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-conid'>Doc</span> <span class='hs-keyword'>where</span>
<a name="line-548"></a>  <span class='hs-varid'>pretty</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-549"></a>
<a name="line-550"></a><a name="instance%20Pretty%20()"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-conid'>()</span> <span class='hs-keyword'>where</span>
<a name="line-551"></a>  <span class='hs-varid'>pretty</span> <span class='hs-conid'>()</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"()"</span>
<a name="line-552"></a>
<a name="line-553"></a><a name="instance%20Pretty%20Bool"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>where</span>
<a name="line-554"></a>  <span class='hs-varid'>pretty</span> <span class='hs-varid'>b</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bool</span> <span class='hs-varid'>b</span>
<a name="line-555"></a>
<a name="line-556"></a><a name="instance%20Pretty%20Char"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-conid'>Char</span> <span class='hs-keyword'>where</span>
<a name="line-557"></a>  <span class='hs-varid'>pretty</span> <span class='hs-varid'>c</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-varid'>c</span>
<a name="line-558"></a>  <span class='hs-varid'>prettyList</span> <span class='hs-varid'>s</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>string</span> <span class='hs-varid'>s</span>
<a name="line-559"></a>
<a name="line-560"></a><a name="instance%20Pretty%20Int"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>where</span>
<a name="line-561"></a>  <span class='hs-varid'>pretty</span> <span class='hs-varid'>i</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>int</span> <span class='hs-varid'>i</span>
<a name="line-562"></a>
<a name="line-563"></a><a name="instance%20Pretty%20Integer"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-conid'>Integer</span> <span class='hs-keyword'>where</span>
<a name="line-564"></a>  <span class='hs-varid'>pretty</span> <span class='hs-varid'>i</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>integer</span> <span class='hs-varid'>i</span>
<a name="line-565"></a>
<a name="line-566"></a><a name="instance%20Pretty%20Float"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-conid'>Float</span> <span class='hs-keyword'>where</span>
<a name="line-567"></a>  <span class='hs-varid'>pretty</span> <span class='hs-varid'>f</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>float</span> <span class='hs-varid'>f</span>
<a name="line-568"></a>
<a name="line-569"></a><a name="instance%20Pretty%20Double"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-conid'>Double</span> <span class='hs-keyword'>where</span>
<a name="line-570"></a>  <span class='hs-varid'>pretty</span> <span class='hs-varid'>d</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>double</span> <span class='hs-varid'>d</span>
<a name="line-571"></a>
<a name="line-572"></a>
<a name="line-573"></a><span class='hs-comment'>--instance Pretty Rational where</span>
<a name="line-574"></a><span class='hs-comment'>--  pretty r      = rational r</span>
<a name="line-575"></a>
<a name="line-576"></a><a name="instance%20Pretty%20(a,b)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pretty</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Pretty</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Pretty</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-577"></a>  <span class='hs-varid'>pretty</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tupled</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>pretty</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>pretty</span> <span class='hs-varid'>y</span><span class='hs-keyglyph'>]</span>
<a name="line-578"></a>
<a name="line-579"></a><a name="instance%20Pretty%20(a,b,c)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pretty</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Pretty</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-conid'>Pretty</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Pretty</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-580"></a>  <span class='hs-varid'>pretty</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>=</span> <span class='hs-varid'>tupled</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>pretty</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>pretty</span> <span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>pretty</span> <span class='hs-varid'>z</span><span class='hs-keyglyph'>]</span>
<a name="line-581"></a>
<a name="line-582"></a><a name="instance%20Pretty%20(Maybe%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Pretty</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Pretty</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-583"></a>  <span class='hs-varid'>pretty</span> <span class='hs-conid'>Nothing</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-584"></a>  <span class='hs-varid'>pretty</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pretty</span> <span class='hs-varid'>x</span>
<a name="line-585"></a>
<a name="line-586"></a>
<a name="line-587"></a>
<a name="line-588"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-589"></a><span class='hs-comment'>-- semi primitive: fill and fillBreak</span>
<a name="line-590"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-591"></a>
<a name="line-592"></a><a name="fillBreak"></a><span class='hs-comment'>-- | The document @(fillBreak i x)@ first renders document @x@. It</span>
<a name="line-593"></a><span class='hs-comment'>-- than appends @space@s until the width is equal to @i@. If the</span>
<a name="line-594"></a><span class='hs-comment'>-- width of @x@ is already larger than @i@, the nesting level is</span>
<a name="line-595"></a><span class='hs-comment'>-- increased by @i@ and a @line@ is appended. When we redefine @ptype@</span>
<a name="line-596"></a><span class='hs-comment'>-- in the previous example to use @fillBreak@, we get a useful</span>
<a name="line-597"></a><span class='hs-comment'>-- variation of the previous output:</span>
<a name="line-598"></a><span class='hs-comment'>--</span>
<a name="line-599"></a><span class='hs-comment'>-- &gt; ptype (name,tp)</span>
<a name="line-600"></a><span class='hs-comment'>-- &gt;        = fillBreak 6 (text name) &lt;+&gt; text "::" &lt;+&gt; text tp</span>
<a name="line-601"></a><span class='hs-comment'>--</span>
<a name="line-602"></a><span class='hs-comment'>-- The output will now be:</span>
<a name="line-603"></a><span class='hs-comment'>--</span>
<a name="line-604"></a><span class='hs-comment'>-- @</span>
<a name="line-605"></a><span class='hs-comment'>-- let empty  :: Doc</span>
<a name="line-606"></a><span class='hs-comment'>--     nest   :: Int -&gt; Doc -&gt; Doc</span>
<a name="line-607"></a><span class='hs-comment'>--     linebreak</span>
<a name="line-608"></a><span class='hs-comment'>--            :: Doc</span>
<a name="line-609"></a><span class='hs-comment'>-- @</span>
<a name="line-610"></a><span class='hs-definition'>fillBreak</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</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-611"></a><span class='hs-definition'>fillBreak</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>width</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-612"></a>                  <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>nest</span> <span class='hs-varid'>f</span> <span class='hs-varid'>linebreak</span>
<a name="line-613"></a>                             <span class='hs-keyword'>else</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>spaces</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-comment'>-</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-614"></a>
<a name="line-615"></a>
<a name="line-616"></a><a name="fill"></a><span class='hs-comment'>-- | The document @(fill i x)@ renders document @x@. It than appends</span>
<a name="line-617"></a><span class='hs-comment'>-- @space@s until the width is equal to @i@. If the width of @x@ is</span>
<a name="line-618"></a><span class='hs-comment'>-- already larger, nothing is appended. This combinator is quite</span>
<a name="line-619"></a><span class='hs-comment'>-- useful in practice to output a list of bindings. The following</span>
<a name="line-620"></a><span class='hs-comment'>-- example demonstrates this.</span>
<a name="line-621"></a><span class='hs-comment'>--</span>
<a name="line-622"></a><span class='hs-comment'>-- &gt; types  = [("empty","Doc")</span>
<a name="line-623"></a><span class='hs-comment'>-- &gt;          ,("nest","Int -&gt; Doc -&gt; Doc")</span>
<a name="line-624"></a><span class='hs-comment'>-- &gt;          ,("linebreak","Doc")]</span>
<a name="line-625"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-626"></a><span class='hs-comment'>-- &gt; ptype (name,tp)</span>
<a name="line-627"></a><span class='hs-comment'>-- &gt;        = fill 6 (text name) &lt;+&gt; text "::" &lt;+&gt; text tp</span>
<a name="line-628"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-629"></a><span class='hs-comment'>-- &gt; test   = text "let" &lt;+&gt; align (vcat (map ptype types))</span>
<a name="line-630"></a><span class='hs-comment'>--</span>
<a name="line-631"></a><span class='hs-comment'>-- Which is layed out as:</span>
<a name="line-632"></a><span class='hs-comment'>--</span>
<a name="line-633"></a><span class='hs-comment'>-- @</span>
<a name="line-634"></a><span class='hs-comment'>-- let empty  :: Doc</span>
<a name="line-635"></a><span class='hs-comment'>--     nest   :: Int -&gt; Doc -&gt; Doc</span>
<a name="line-636"></a><span class='hs-comment'>--     linebreak :: Doc</span>
<a name="line-637"></a><span class='hs-comment'>-- @</span>
<a name="line-638"></a><span class='hs-definition'>fill</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</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-639"></a><span class='hs-definition'>fill</span> <span class='hs-varid'>f</span> <span class='hs-varid'>d</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>width</span> <span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-640"></a>                  <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>empty</span>
<a name="line-641"></a>                              <span class='hs-keyword'>else</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>spaces</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-comment'>-</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-642"></a>
<a name="line-643"></a><a name="width"></a><span class='hs-definition'>width</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-644"></a><span class='hs-definition'>width</span> <span class='hs-varid'>d</span> <span class='hs-varid'>f</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>column</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>d</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>column</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k2</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>k2</span> <span class='hs-comment'>-</span> <span class='hs-varid'>k1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-645"></a>
<a name="line-646"></a>
<a name="line-647"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-648"></a><span class='hs-comment'>-- semi primitive: Alignment and indentation</span>
<a name="line-649"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-650"></a>
<a name="line-651"></a><a name="indent"></a><span class='hs-comment'>-- | The document @(indent i x)@ indents document @x@ with @i@ spaces.</span>
<a name="line-652"></a><span class='hs-comment'>--</span>
<a name="line-653"></a><span class='hs-comment'>-- &gt; test  = indent 4 (fillSep (map text</span>
<a name="line-654"></a><span class='hs-comment'>-- &gt;         (words "the indent combinator indents these words !")))</span>
<a name="line-655"></a><span class='hs-comment'>--</span>
<a name="line-656"></a><span class='hs-comment'>-- Which lays out with a page width of 20 as:</span>
<a name="line-657"></a><span class='hs-comment'>--</span>
<a name="line-658"></a><span class='hs-comment'>-- @</span>
<a name="line-659"></a><span class='hs-comment'>--     the indent</span>
<a name="line-660"></a><span class='hs-comment'>--     combinator</span>
<a name="line-661"></a><span class='hs-comment'>--     indents these</span>
<a name="line-662"></a><span class='hs-comment'>--     words !</span>
<a name="line-663"></a><span class='hs-comment'>-- @</span>
<a name="line-664"></a><span class='hs-definition'>indent</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</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-665"></a><span class='hs-definition'>indent</span> <span class='hs-varid'>i</span> <span class='hs-varid'>d</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hang</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>spaces</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-666"></a>
<a name="line-667"></a><a name="hang"></a><span class='hs-comment'>-- | The hang combinator implements hanging indentation. The document</span>
<a name="line-668"></a><span class='hs-comment'>-- @(hang i x)@ renders document @x@ with a nesting level set to the</span>
<a name="line-669"></a><span class='hs-comment'>-- current column plus @i@. The following example uses hanging</span>
<a name="line-670"></a><span class='hs-comment'>-- indentation for some text:</span>
<a name="line-671"></a><span class='hs-comment'>--</span>
<a name="line-672"></a><span class='hs-comment'>-- &gt; test  = hang 4 (fillSep (map text</span>
<a name="line-673"></a><span class='hs-comment'>-- &gt;         (words "the hang combinator indents these words !")))</span>
<a name="line-674"></a><span class='hs-comment'>--</span>
<a name="line-675"></a><span class='hs-comment'>-- Which lays out on a page with a width of 20 characters as:</span>
<a name="line-676"></a><span class='hs-comment'>--</span>
<a name="line-677"></a><span class='hs-comment'>-- @</span>
<a name="line-678"></a><span class='hs-comment'>-- the hang combinator</span>
<a name="line-679"></a><span class='hs-comment'>--     indents these</span>
<a name="line-680"></a><span class='hs-comment'>--     words !</span>
<a name="line-681"></a><span class='hs-comment'>-- @</span>
<a name="line-682"></a><span class='hs-comment'>--</span>
<a name="line-683"></a><span class='hs-comment'>-- The @hang@ combinator is implemented as:</span>
<a name="line-684"></a><span class='hs-comment'>--</span>
<a name="line-685"></a><span class='hs-comment'>-- &gt; hang i x  = align (nest i x)</span>
<a name="line-686"></a><span class='hs-definition'>hang</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</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-687"></a><span class='hs-definition'>hang</span> <span class='hs-varid'>i</span> <span class='hs-varid'>d</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>align</span> <span class='hs-layout'>(</span><span class='hs-varid'>nest</span> <span class='hs-varid'>i</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-688"></a>
<a name="line-689"></a><a name="align"></a><span class='hs-comment'>-- | The document @(align x)@ renders document @x@ with the nesting</span>
<a name="line-690"></a><span class='hs-comment'>-- level set to the current column. It is used for example to</span>
<a name="line-691"></a><span class='hs-comment'>-- implement 'hang'.</span>
<a name="line-692"></a><span class='hs-comment'>--</span>
<a name="line-693"></a><span class='hs-comment'>-- As an example, we will put a document right above another one,</span>
<a name="line-694"></a><span class='hs-comment'>-- regardless of the current nesting level:</span>
<a name="line-695"></a><span class='hs-comment'>--</span>
<a name="line-696"></a><span class='hs-comment'>-- &gt; x $$ y  = align (x &lt;$&gt; y)</span>
<a name="line-697"></a><span class='hs-comment'>--</span>
<a name="line-698"></a><span class='hs-comment'>-- &gt; test    = text "hi" &lt;+&gt; (text "nice" $$ text "world")</span>
<a name="line-699"></a><span class='hs-comment'>--</span>
<a name="line-700"></a><span class='hs-comment'>-- which will be layed out as:</span>
<a name="line-701"></a><span class='hs-comment'>--</span>
<a name="line-702"></a><span class='hs-comment'>-- @</span>
<a name="line-703"></a><span class='hs-comment'>-- hi nice</span>
<a name="line-704"></a><span class='hs-comment'>--    world</span>
<a name="line-705"></a><span class='hs-comment'>-- @</span>
<a name="line-706"></a><span class='hs-definition'>align</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-707"></a><span class='hs-definition'>align</span> <span class='hs-varid'>d</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>column</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-708"></a>                  <span class='hs-varid'>nesting</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>nest</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-comment'>-</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>   <span class='hs-comment'>--nesting might be negative :-)</span>
<a name="line-709"></a>
<a name="line-710"></a>
<a name="line-711"></a>
<a name="line-712"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-713"></a><span class='hs-comment'>-- Primitives</span>
<a name="line-714"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-715"></a>
<a name="line-716"></a><a name="Doc"></a><span class='hs-comment'>-- | The abstract data type @Doc@ represents pretty documents.</span>
<a name="line-717"></a><a name="Doc"></a><span class='hs-comment'>--</span>
<a name="line-718"></a><a name="Doc"></a><span class='hs-comment'>-- @Doc@ is an instance of the 'Show' class. @(show doc)@ pretty</span>
<a name="line-719"></a><a name="Doc"></a><span class='hs-comment'>-- prints document @doc@ with a page width of 100 characters and a</span>
<a name="line-720"></a><a name="Doc"></a><span class='hs-comment'>-- ribbon width of 40 characters.</span>
<a name="line-721"></a><a name="Doc"></a><span class='hs-comment'>--</span>
<a name="line-722"></a><a name="Doc"></a><span class='hs-comment'>-- &gt; show (text "hello" &lt;$&gt; text "world")</span>
<a name="line-723"></a><a name="Doc"></a><span class='hs-comment'>--</span>
<a name="line-724"></a><a name="Doc"></a><span class='hs-comment'>-- Which would return the string \"hello\\nworld\", i.e.</span>
<a name="line-725"></a><a name="Doc"></a><span class='hs-comment'>--</span>
<a name="line-726"></a><a name="Doc"></a><span class='hs-comment'>-- @</span>
<a name="line-727"></a><a name="Doc"></a><span class='hs-comment'>-- hello</span>
<a name="line-728"></a><a name="Doc"></a><span class='hs-comment'>-- world</span>
<a name="line-729"></a><a name="Doc"></a><span class='hs-comment'>-- @</span>
<a name="line-730"></a><a name="Doc"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Doc</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span>
<a name="line-731"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Empty</span>
<a name="line-732"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Char</span> <span class='hs-conid'>Char</span>             <span class='hs-comment'>-- invariant: char is not '\n'</span>
<a name="line-733"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Text</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <span class='hs-conid'>String</span>      <span class='hs-comment'>-- invariant: text doesn't contain '\n'</span>
<a name="line-734"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Line</span>
<a name="line-735"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FlatAlt</span> <span class='hs-conid'>Doc</span> <span class='hs-conid'>Doc</span>       <span class='hs-comment'>-- Render the first doc, but when</span>
<a name="line-736"></a>                                        <span class='hs-comment'>-- flattened, render the second.</span>
<a name="line-737"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Cat</span> <span class='hs-conid'>Doc</span> <span class='hs-conid'>Doc</span>
<a name="line-738"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Nest</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <span class='hs-conid'>Doc</span>
<a name="line-739"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Union</span> <span class='hs-conid'>Doc</span> <span class='hs-conid'>Doc</span>         <span class='hs-comment'>-- invariant: first lines of first doc longer than the first lines of the second doc</span>
<a name="line-740"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Column</span>  <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span>
<a name="line-741"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Columns</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span>
<a name="line-742"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Nesting</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span>
<a name="line-743"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Color</span> <span class='hs-conid'>ConsoleLayer</span> <span class='hs-conid'>ColorIntensity</span> <span class='hs-comment'>-- Introduces coloring /around/ the embedded document</span>
<a name="line-744"></a>                        <span class='hs-conid'>Color</span> <span class='hs-conid'>Doc</span>
<a name="line-745"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Intensify</span> <span class='hs-conid'>ConsoleIntensity</span> <span class='hs-conid'>Doc</span>
<a name="line-746"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Italicize</span> <span class='hs-conid'>Bool</span> <span class='hs-conid'>Doc</span>
<a name="line-747"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Underline</span> <span class='hs-conid'>Underlining</span> <span class='hs-conid'>Doc</span>
<a name="line-748"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>RestoreFormat</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>ColorIntensity</span><span class='hs-layout'>,</span> <span class='hs-conid'>Color</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- Only used during the rendered phase, to signal a SGR should be issued to restore the terminal formatting.</span>
<a name="line-749"></a>                                <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>ColorIntensity</span><span class='hs-layout'>,</span> <span class='hs-conid'>Color</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- These are the colors to revert the current forecolor/backcolor to (i.e. those from before the start of the Color block).</span>
<a name="line-750"></a>                                <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>ConsoleIntensity</span><span class='hs-layout'>)</span>         <span class='hs-comment'>-- Intensity to revert to.</span>
<a name="line-751"></a>                                <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>                     <span class='hs-comment'>-- Italicization to revert to.</span>
<a name="line-752"></a>                                <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Underlining</span><span class='hs-layout'>)</span>              <span class='hs-comment'>-- Underlining to revert to.</span>
<a name="line-753"></a>
<a name="line-754"></a>
<a name="line-755"></a><a name="SimpleDoc"></a><span class='hs-comment'>-- | The data type @SimpleDoc@ represents rendered documents and is</span>
<a name="line-756"></a><a name="SimpleDoc"></a><span class='hs-comment'>-- used by the display functions.</span>
<a name="line-757"></a><a name="SimpleDoc"></a><span class='hs-comment'>--</span>
<a name="line-758"></a><a name="SimpleDoc"></a><span class='hs-comment'>-- The @Int@ in @SText@ contains the length of the string. The @Int@</span>
<a name="line-759"></a><a name="SimpleDoc"></a><span class='hs-comment'>-- in @SLine@ contains the indentation for that line. The library</span>
<a name="line-760"></a><a name="SimpleDoc"></a><span class='hs-comment'>-- provides two default display functions 'displayS' and</span>
<a name="line-761"></a><a name="SimpleDoc"></a><span class='hs-comment'>-- 'displayIO'. You can provide your own display function by writing a</span>
<a name="line-762"></a><a name="SimpleDoc"></a><span class='hs-comment'>-- function from a @SimpleDoc@ to your own output format.</span>
<a name="line-763"></a><a name="SimpleDoc"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SimpleDoc</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SFail</span>
<a name="line-764"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SEmpty</span>
<a name="line-765"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SChar</span> <span class='hs-conid'>Char</span> <span class='hs-conid'>SimpleDoc</span>
<a name="line-766"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SText</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <span class='hs-conid'>String</span> <span class='hs-conid'>SimpleDoc</span>
<a name="line-767"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SLine</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <span class='hs-conid'>SimpleDoc</span>
<a name="line-768"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SSGR</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SGR</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>SimpleDoc</span>
<a name="line-769"></a>
<a name="line-770"></a>
<a name="line-771"></a><a name="instance%20Monoid%20Doc"></a><span class='hs-comment'>-- MCB: Not in the wl-pprint package that we forked from. I added this when the "pretty" package</span>
<a name="line-772"></a><a name="instance%20Monoid%20Doc"></a><span class='hs-comment'>-- from base gained a Monoid instance (&lt;<a href="http://hackage.haskell.org/trac/ghc/ticket/4378">http://hackage.haskell.org/trac/ghc/ticket/4378</a>&gt;):</span>
<a name="line-773"></a><a name="instance%20Monoid%20Doc"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monoid</span> <span class='hs-conid'>Doc</span> <span class='hs-keyword'>where</span>
<a name="line-774"></a>    <span class='hs-varid'>mempty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-775"></a>    <span class='hs-varid'>mappend</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>)</span>
<a name="line-776"></a>    <span class='hs-varid'>mconcat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hcat</span>
<a name="line-777"></a>
<a name="line-778"></a><a name="instance%20IsString%20Doc"></a><span class='hs-comment'>-- MCB: also added when "pretty" got the corresponding instances:</span>
<a name="line-779"></a><a name="instance%20IsString%20Doc"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>IsString</span> <span class='hs-conid'>Doc</span> <span class='hs-keyword'>where</span>
<a name="line-780"></a>    <span class='hs-varid'>fromString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span>
<a name="line-781"></a>
<a name="line-782"></a>
<a name="line-783"></a><a name="empty"></a><span class='hs-comment'>-- | The empty document is, indeed, empty. Although @empty@ has no</span>
<a name="line-784"></a><span class='hs-comment'>-- content, it does have a \'height\' of 1 and behaves exactly like</span>
<a name="line-785"></a><span class='hs-comment'>-- @(text \"\")@ (and is therefore not a unit of @\&lt;$\&gt;@).</span>
<a name="line-786"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-787"></a><span class='hs-definition'>empty</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Empty</span>
<a name="line-788"></a>
<a name="line-789"></a><a name="char"></a><span class='hs-comment'>-- | The document @(char c)@ contains the literal character @c@. The</span>
<a name="line-790"></a><span class='hs-comment'>-- character shouldn't be a newline (@'\n'@), the function 'line'</span>
<a name="line-791"></a><span class='hs-comment'>-- should be used for line breaks.</span>
<a name="line-792"></a><span class='hs-definition'>char</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-793"></a><span class='hs-definition'>char</span> <span class='hs-chr'>'\n'</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>line</span>
<a name="line-794"></a><span class='hs-definition'>char</span> <span class='hs-varid'>c</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Char</span> <span class='hs-varid'>c</span>
<a name="line-795"></a>
<a name="line-796"></a><a name="text"></a><span class='hs-comment'>-- | The document @(text s)@ contains the literal string @s@. The</span>
<a name="line-797"></a><span class='hs-comment'>-- string shouldn't contain any newline (@'\n'@) characters. If the</span>
<a name="line-798"></a><span class='hs-comment'>-- string contains newline characters, the function 'string' should be</span>
<a name="line-799"></a><span class='hs-comment'>-- used.</span>
<a name="line-800"></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-801"></a><span class='hs-definition'>text</span> <span class='hs-str'>""</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Empty</span>
<a name="line-802"></a><span class='hs-definition'>text</span> <span class='hs-varid'>s</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-803"></a>
<a name="line-804"></a><a name="line"></a><span class='hs-comment'>-- | The @line@ document advances to the next line and indents to the</span>
<a name="line-805"></a><span class='hs-comment'>-- current nesting level. Document @line@ behaves like @(text \" \")@</span>
<a name="line-806"></a><span class='hs-comment'>-- if the line break is undone by 'group'.</span>
<a name="line-807"></a><span class='hs-definition'>line</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-808"></a><span class='hs-definition'>line</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FlatAlt</span> <span class='hs-conid'>Line</span> <span class='hs-varid'>space</span>
<a name="line-809"></a>
<a name="line-810"></a><a name="linebreak"></a><span class='hs-comment'>-- | The @linebreak@ document advances to the next line and indents to</span>
<a name="line-811"></a><span class='hs-comment'>-- the current nesting level. Document @linebreak@ behaves like</span>
<a name="line-812"></a><span class='hs-comment'>-- 'empty' if the line break is undone by 'group'.</span>
<a name="line-813"></a><span class='hs-definition'>linebreak</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-814"></a><span class='hs-definition'>linebreak</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FlatAlt</span> <span class='hs-conid'>Line</span> <span class='hs-varid'>empty</span>
<a name="line-815"></a>
<a name="line-816"></a><a name="hardline"></a><span class='hs-comment'>-- | A linebreak that will never be flattened; it is guaranteed to render</span>
<a name="line-817"></a><span class='hs-comment'>-- as a newline.</span>
<a name="line-818"></a><span class='hs-definition'>hardline</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span>
<a name="line-819"></a><span class='hs-definition'>hardline</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Line</span>
<a name="line-820"></a>
<a name="line-821"></a><a name="beside"></a><span class='hs-definition'>beside</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-822"></a><span class='hs-definition'>beside</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cat</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-823"></a>
<a name="line-824"></a><a name="nest"></a><span class='hs-comment'>-- | The document @(nest i x)@ renders document @x@ with the current</span>
<a name="line-825"></a><span class='hs-comment'>-- indentation level increased by i (See also 'hang', 'align' and</span>
<a name="line-826"></a><span class='hs-comment'>-- 'indent').</span>
<a name="line-827"></a><span class='hs-comment'>--</span>
<a name="line-828"></a><span class='hs-comment'>-- &gt; nest 2 (text "hello" &lt;$&gt; text "world") &lt;$&gt; text "!"</span>
<a name="line-829"></a><span class='hs-comment'>--</span>
<a name="line-830"></a><span class='hs-comment'>-- outputs as:</span>
<a name="line-831"></a><span class='hs-comment'>--</span>
<a name="line-832"></a><span class='hs-comment'>-- @</span>
<a name="line-833"></a><span class='hs-comment'>-- hello</span>
<a name="line-834"></a><span class='hs-comment'>--   world</span>
<a name="line-835"></a><span class='hs-comment'>-- !</span>
<a name="line-836"></a><span class='hs-comment'>-- @</span>
<a name="line-837"></a><span class='hs-definition'>nest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</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-838"></a><span class='hs-definition'>nest</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nest</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-839"></a>
<a name="line-840"></a><a name="column"></a><span class='hs-definition'>column</span><span class='hs-layout'>,</span> <span class='hs-varid'>nesting</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-841"></a><span class='hs-definition'>column</span> <span class='hs-varid'>f</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Column</span> <span class='hs-varid'>f</span>
<a name="line-842"></a><a name="nesting"></a><span class='hs-definition'>nesting</span> <span class='hs-varid'>f</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nesting</span> <span class='hs-varid'>f</span>
<a name="line-843"></a>
<a name="line-844"></a><a name="columns"></a><span class='hs-definition'>columns</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-845"></a><span class='hs-definition'>columns</span> <span class='hs-varid'>f</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Columns</span> <span class='hs-varid'>f</span>
<a name="line-846"></a>
<a name="line-847"></a><a name="group"></a><span class='hs-comment'>-- | The @group@ combinator is used to specify alternative</span>
<a name="line-848"></a><span class='hs-comment'>-- layouts. The document @(group x)@ undoes all line breaks in</span>
<a name="line-849"></a><span class='hs-comment'>-- document @x@. The resulting line is added to the current line if</span>
<a name="line-850"></a><span class='hs-comment'>-- that fits the page. Otherwise, the document @x@ is rendered without</span>
<a name="line-851"></a><span class='hs-comment'>-- any changes.</span>
<a name="line-852"></a><span class='hs-definition'>group</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-853"></a><span class='hs-definition'>group</span> <span class='hs-varid'>x</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Union</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-854"></a>
<a name="line-855"></a><a name="flatAlt"></a><span class='hs-comment'>-- | A document that is normally rendered as the first argument, but</span>
<a name="line-856"></a><span class='hs-comment'>-- when flattened, is rendered as the second document.</span>
<a name="line-857"></a><span class='hs-definition'>flatAlt</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-858"></a><span class='hs-definition'>flatAlt</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FlatAlt</span>
<a name="line-859"></a>
<a name="line-860"></a><a name="flatten"></a><span class='hs-definition'>flatten</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-861"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>FlatAlt</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>y</span>
<a name="line-862"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cat</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cat</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-863"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nest</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nest</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-864"></a><span class='hs-definition'>flatten</span>  <span class='hs-conid'>Line</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span>
<a name="line-865"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Union</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flatten</span> <span class='hs-varid'>x</span>
<a name="line-866"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Column</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Column</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-867"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Columns</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Columns</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-868"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nesting</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nesting</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-869"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Color</span> <span class='hs-varid'>l</span> <span class='hs-varid'>i</span> <span class='hs-varid'>c</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Color</span> <span class='hs-varid'>l</span> <span class='hs-varid'>i</span> <span class='hs-varid'>c</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-870"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Intensify</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Intensify</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-871"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Italicize</span> <span class='hs-varid'>b</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Italicize</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-872"></a><span class='hs-definition'>flatten</span> <span class='hs-layout'>(</span><span class='hs-conid'>Underline</span> <span class='hs-varid'>u</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Underline</span> <span class='hs-varid'>u</span> <span class='hs-layout'>(</span><span class='hs-varid'>flatten</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-873"></a><span class='hs-definition'>flatten</span> <span class='hs-varid'>other</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>other</span>                     <span class='hs-varop'>--Empty,Char,Text,RestoreFormat</span>
<a name="line-874"></a>
<a name="line-875"></a>
<a name="line-876"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-877"></a><span class='hs-comment'>-- Colors</span>
<a name="line-878"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-879"></a>
<a name="line-880"></a><a name="black"></a><span class='hs-comment'>-- | Displays a document with the black forecolor</span>
<a name="line-881"></a><span class='hs-definition'>black</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-882"></a><a name="red"></a><span class='hs-comment'>-- | Displays a document with the red forecolor</span>
<a name="line-883"></a><span class='hs-definition'>red</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-884"></a><a name="green"></a><span class='hs-comment'>-- | Displays a document with the green forecolor</span>
<a name="line-885"></a><span class='hs-definition'>green</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-886"></a><a name="yellow"></a><span class='hs-comment'>-- | Displays a document with the yellow forecolor</span>
<a name="line-887"></a><span class='hs-definition'>yellow</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-888"></a><a name="blue"></a><span class='hs-comment'>-- | Displays a document with the blue forecolor</span>
<a name="line-889"></a><span class='hs-definition'>blue</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-890"></a><a name="magenta"></a><span class='hs-comment'>-- | Displays a document with the magenta forecolor</span>
<a name="line-891"></a><span class='hs-definition'>magenta</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-892"></a><a name="cyan"></a><span class='hs-comment'>-- | Displays a document with the cyan forecolor</span>
<a name="line-893"></a><span class='hs-definition'>cyan</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-894"></a><a name="white"></a><span class='hs-comment'>-- | Displays a document with the white forecolor</span>
<a name="line-895"></a><span class='hs-definition'>white</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-896"></a><a name="dullblack"></a><span class='hs-comment'>-- | Displays a document with the dull black forecolor</span>
<a name="line-897"></a><span class='hs-definition'>dullblack</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-898"></a><a name="dullred"></a><span class='hs-comment'>-- | Displays a document with the dull red forecolor</span>
<a name="line-899"></a><span class='hs-definition'>dullred</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-900"></a><a name="dullgreen"></a><span class='hs-comment'>-- | Displays a document with the dull green forecolor</span>
<a name="line-901"></a><span class='hs-definition'>dullgreen</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-902"></a><a name="dullyellow"></a><span class='hs-comment'>-- | Displays a document with the dull yellow forecolor</span>
<a name="line-903"></a><span class='hs-definition'>dullyellow</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-904"></a><a name="dullblue"></a><span class='hs-comment'>-- | Displays a document with the dull blue forecolor</span>
<a name="line-905"></a><span class='hs-definition'>dullblue</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-906"></a><a name="dullmagenta"></a><span class='hs-comment'>-- | Displays a document with the dull magenta forecolor</span>
<a name="line-907"></a><span class='hs-definition'>dullmagenta</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-908"></a><a name="dullcyan"></a><span class='hs-comment'>-- | Displays a document with the dull cyan forecolor</span>
<a name="line-909"></a><span class='hs-definition'>dullcyan</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-910"></a><a name="dullwhite"></a><span class='hs-comment'>-- | Displays a document with the dull white forecolor</span>
<a name="line-911"></a><span class='hs-definition'>dullwhite</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-912"></a><span class='hs-layout'>(</span><span class='hs-varid'>black</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullblack</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorFunctions</span> <span class='hs-conid'>Black</span>
<a name="line-913"></a><span class='hs-layout'>(</span><span class='hs-varid'>red</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullred</span><span class='hs-layout'>)</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorFunctions</span> <span class='hs-conid'>Red</span>
<a name="line-914"></a><span class='hs-layout'>(</span><span class='hs-varid'>green</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullgreen</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorFunctions</span> <span class='hs-conid'>Green</span>
<a name="line-915"></a><span class='hs-layout'>(</span><span class='hs-varid'>yellow</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullyellow</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorFunctions</span> <span class='hs-conid'>Yellow</span>
<a name="line-916"></a><span class='hs-layout'>(</span><span class='hs-varid'>blue</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullblue</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorFunctions</span> <span class='hs-conid'>Blue</span>
<a name="line-917"></a><span class='hs-layout'>(</span><span class='hs-varid'>magenta</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullmagenta</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorFunctions</span> <span class='hs-conid'>Magenta</span>
<a name="line-918"></a><span class='hs-layout'>(</span><span class='hs-varid'>cyan</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullcyan</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorFunctions</span> <span class='hs-conid'>Cyan</span>
<a name="line-919"></a><span class='hs-layout'>(</span><span class='hs-varid'>white</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullwhite</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>colorFunctions</span> <span class='hs-conid'>White</span>
<a name="line-920"></a>
<a name="line-921"></a><a name="color"></a><span class='hs-comment'>-- | Displays a document with a forecolor given in the first parameter</span>
<a name="line-922"></a><span class='hs-definition'>color</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-923"></a><a name="dullcolor"></a><span class='hs-comment'>-- | Displays a document with a dull forecolor given in the first parameter</span>
<a name="line-924"></a><span class='hs-definition'>dullcolor</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-925"></a><span class='hs-definition'>color</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Color</span> <span class='hs-conid'>Foreground</span> <span class='hs-conid'>Vivid</span>
<a name="line-926"></a><span class='hs-definition'>dullcolor</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Color</span> <span class='hs-conid'>Foreground</span> <span class='hs-conid'>Dull</span>
<a name="line-927"></a>
<a name="line-928"></a><a name="colorFunctions"></a><span class='hs-definition'>colorFunctions</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Color</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</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-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span>
<a name="line-929"></a><span class='hs-definition'>colorFunctions</span> <span class='hs-varid'>what</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>color</span> <span class='hs-varid'>what</span><span class='hs-layout'>,</span> <span class='hs-varid'>dullcolor</span> <span class='hs-varid'>what</span><span class='hs-layout'>)</span>
<a name="line-930"></a>
<a name="line-931"></a><a name="onblack"></a><span class='hs-comment'>-- | Displays a document with the black backcolor</span>
<a name="line-932"></a><span class='hs-definition'>onblack</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-933"></a><a name="onred"></a><span class='hs-comment'>-- | Displays a document with the red backcolor</span>
<a name="line-934"></a><span class='hs-definition'>onred</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-935"></a><a name="ongreen"></a><span class='hs-comment'>-- | Displays a document with the green backcolor</span>
<a name="line-936"></a><span class='hs-definition'>ongreen</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-937"></a><a name="onyellow"></a><span class='hs-comment'>-- | Displays a document with the yellow backcolor</span>
<a name="line-938"></a><span class='hs-definition'>onyellow</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-939"></a><a name="onblue"></a><span class='hs-comment'>-- | Displays a document with the blue backcolor</span>
<a name="line-940"></a><span class='hs-definition'>onblue</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-941"></a><a name="onmagenta"></a><span class='hs-comment'>-- | Displays a document with the magenta backcolor</span>
<a name="line-942"></a><span class='hs-definition'>onmagenta</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-943"></a><a name="oncyan"></a><span class='hs-comment'>-- | Displays a document with the cyan backcolor</span>
<a name="line-944"></a><span class='hs-definition'>oncyan</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-945"></a><a name="onwhite"></a><span class='hs-comment'>-- | Displays a document with the white backcolor</span>
<a name="line-946"></a><span class='hs-definition'>onwhite</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-947"></a><a name="ondullblack"></a><span class='hs-comment'>-- | Displays a document with the dull block backcolor</span>
<a name="line-948"></a><span class='hs-definition'>ondullblack</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-949"></a><a name="ondullred"></a><span class='hs-comment'>-- | Displays a document with the dull red backcolor</span>
<a name="line-950"></a><span class='hs-definition'>ondullred</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-951"></a><a name="ondullgreen"></a><span class='hs-comment'>-- | Displays a document with the dull green backcolor</span>
<a name="line-952"></a><span class='hs-definition'>ondullgreen</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-953"></a><a name="ondullyellow"></a><span class='hs-comment'>-- | Displays a document with the dull yellow backcolor</span>
<a name="line-954"></a><span class='hs-definition'>ondullyellow</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-955"></a><a name="ondullblue"></a><span class='hs-comment'>-- | Displays a document with the dull blue backcolor</span>
<a name="line-956"></a><span class='hs-definition'>ondullblue</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-957"></a><a name="ondullmagenta"></a><span class='hs-comment'>-- | Displays a document with the dull magenta backcolor</span>
<a name="line-958"></a><span class='hs-definition'>ondullmagenta</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-959"></a><a name="ondullcyan"></a><span class='hs-comment'>-- | Displays a document with the dull cyan backcolor</span>
<a name="line-960"></a><span class='hs-definition'>ondullcyan</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-961"></a><a name="ondullwhite"></a><span class='hs-comment'>-- | Displays a document with the dull white backcolor</span>
<a name="line-962"></a><span class='hs-definition'>ondullwhite</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-963"></a><span class='hs-layout'>(</span><span class='hs-varid'>onblack</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullblack</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oncolorFunctions</span> <span class='hs-conid'>Black</span>
<a name="line-964"></a><span class='hs-layout'>(</span><span class='hs-varid'>onred</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullred</span><span class='hs-layout'>)</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oncolorFunctions</span> <span class='hs-conid'>Red</span>
<a name="line-965"></a><span class='hs-layout'>(</span><span class='hs-varid'>ongreen</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullgreen</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oncolorFunctions</span> <span class='hs-conid'>Green</span>
<a name="line-966"></a><span class='hs-layout'>(</span><span class='hs-varid'>onyellow</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullyellow</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oncolorFunctions</span> <span class='hs-conid'>Yellow</span>
<a name="line-967"></a><span class='hs-layout'>(</span><span class='hs-varid'>onblue</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullblue</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oncolorFunctions</span> <span class='hs-conid'>Blue</span>
<a name="line-968"></a><span class='hs-layout'>(</span><span class='hs-varid'>onmagenta</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullmagenta</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oncolorFunctions</span> <span class='hs-conid'>Magenta</span>
<a name="line-969"></a><span class='hs-layout'>(</span><span class='hs-varid'>oncyan</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullcyan</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oncolorFunctions</span> <span class='hs-conid'>Cyan</span>
<a name="line-970"></a><span class='hs-layout'>(</span><span class='hs-varid'>onwhite</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullwhite</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oncolorFunctions</span> <span class='hs-conid'>White</span>
<a name="line-971"></a>
<a name="line-972"></a><a name="oncolor"></a><span class='hs-comment'>-- | Displays a document with a backcolor given in the first parameter</span>
<a name="line-973"></a><span class='hs-definition'>oncolor</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-974"></a><a name="ondullcolor"></a><span class='hs-comment'>-- | Displays a document with a dull backcolor given in the first parameter</span>
<a name="line-975"></a><span class='hs-definition'>ondullcolor</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-976"></a><span class='hs-definition'>oncolor</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Color</span> <span class='hs-conid'>Background</span> <span class='hs-conid'>Vivid</span>
<a name="line-977"></a><span class='hs-definition'>ondullcolor</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Color</span> <span class='hs-conid'>Background</span> <span class='hs-conid'>Dull</span>
<a name="line-978"></a>
<a name="line-979"></a><a name="oncolorFunctions"></a><span class='hs-definition'>oncolorFunctions</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Color</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</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-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>)</span>
<a name="line-980"></a><span class='hs-definition'>oncolorFunctions</span> <span class='hs-varid'>what</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>oncolor</span> <span class='hs-varid'>what</span><span class='hs-layout'>,</span> <span class='hs-varid'>ondullcolor</span> <span class='hs-varid'>what</span><span class='hs-layout'>)</span>
<a name="line-981"></a>
<a name="line-982"></a>
<a name="line-983"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-984"></a><span class='hs-comment'>-- Console Intensity</span>
<a name="line-985"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-986"></a>
<a name="line-987"></a><a name="bold"></a><span class='hs-comment'>-- | Displays a document in a heavier font weight</span>
<a name="line-988"></a><span class='hs-definition'>bold</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-989"></a><span class='hs-definition'>bold</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Intensify</span> <span class='hs-conid'>BoldIntensity</span>
<a name="line-990"></a>
<a name="line-991"></a><a name="debold"></a><span class='hs-comment'>-- | Displays a document in the normal font weight</span>
<a name="line-992"></a><span class='hs-definition'>debold</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-993"></a><span class='hs-definition'>debold</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Intensify</span> <span class='hs-conid'>NormalIntensity</span>
<a name="line-994"></a>
<a name="line-995"></a><span class='hs-comment'>-- NB: I don't support FaintIntensity here because it is not widely supported by terminals.</span>
<a name="line-996"></a>
<a name="line-997"></a>
<a name="line-998"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-999"></a><span class='hs-comment'>-- Italicization</span>
<a name="line-1000"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1001"></a>
<a name="line-1002"></a><span class='hs-comment'>{-
<a name="line-1003"></a>
<a name="line-1004"></a>I'm in two minds about providing these functions, since italicization is so rarely implemented.
<a name="line-1005"></a>It is especially bad because "italicization" may cause the meaning of colors to flip, which will
<a name="line-1006"></a>look a bit weird, to say the least...
<a name="line-1007"></a>
<a name="line-1008"></a>
<a name="line-1009"></a>-- | Displays a document in italics. This is not widely supported, and it's use is not recommended
<a name="line-1010"></a>italicize :: Doc -&gt; Doc
<a name="line-1011"></a>italicize = Italicize True
<a name="line-1012"></a>
<a name="line-1013"></a>-- | Displays a document with no italics
<a name="line-1014"></a>deitalicize :: Doc -&gt; Doc
<a name="line-1015"></a>deitalicize = Italicize False
<a name="line-1016"></a>
<a name="line-1017"></a>-}</span>
<a name="line-1018"></a>
<a name="line-1019"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1020"></a><span class='hs-comment'>-- Underlining</span>
<a name="line-1021"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1022"></a>
<a name="line-1023"></a><a name="underline"></a><span class='hs-comment'>-- | Displays a document with underlining</span>
<a name="line-1024"></a><span class='hs-definition'>underline</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-1025"></a><span class='hs-definition'>underline</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Underline</span> <span class='hs-conid'>SingleUnderline</span>
<a name="line-1026"></a>
<a name="line-1027"></a><a name="deunderline"></a><span class='hs-comment'>-- | Displays a document with no underlining</span>
<a name="line-1028"></a><span class='hs-definition'>deunderline</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-1029"></a><span class='hs-definition'>deunderline</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Underline</span> <span class='hs-conid'>NoUnderline</span>
<a name="line-1030"></a>
<a name="line-1031"></a><span class='hs-comment'>-- NB: I don't support DoubleUnderline here because it is not widely supported by terminals.</span>
<a name="line-1032"></a>
<a name="line-1033"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1034"></a><span class='hs-comment'>-- Removing formatting</span>
<a name="line-1035"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1036"></a>
<a name="line-1037"></a><a name="plain"></a><span class='hs-comment'>-- | Removes all colorisation, emboldening and underlining from a document</span>
<a name="line-1038"></a><span class='hs-definition'>plain</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-1039"></a><span class='hs-definition'>plain</span> <span class='hs-conid'>Fail</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span>
<a name="line-1040"></a><span class='hs-definition'>plain</span> <span class='hs-varid'>e</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Empty</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>e</span>
<a name="line-1041"></a><span class='hs-definition'>plain</span> <span class='hs-varid'>c</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Char</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span>
<a name="line-1042"></a><span class='hs-definition'>plain</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Text</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span>
<a name="line-1043"></a><span class='hs-definition'>plain</span> <span class='hs-varid'>l</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Line</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span>
<a name="line-1044"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>FlatAlt</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FlatAlt</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-1045"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cat</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cat</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-1046"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nest</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nest</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-1047"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Union</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Union</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-1048"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Column</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Column</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-1049"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Columns</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Columns</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-1050"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nesting</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nesting</span> <span class='hs-layout'>(</span><span class='hs-varid'>plain</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-1051"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Color</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>plain</span> <span class='hs-varid'>x</span>
<a name="line-1052"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Intensify</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>plain</span> <span class='hs-varid'>x</span>
<a name="line-1053"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Italicize</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>plain</span> <span class='hs-varid'>x</span>
<a name="line-1054"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>Underline</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>plain</span> <span class='hs-varid'>x</span>
<a name="line-1055"></a><span class='hs-definition'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>RestoreFormat</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Empty</span>
<a name="line-1056"></a>
<a name="line-1057"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1058"></a><span class='hs-comment'>-- Renderers</span>
<a name="line-1059"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1060"></a>
<a name="line-1061"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1062"></a><span class='hs-comment'>-- renderPretty: the default pretty printing algorithm</span>
<a name="line-1063"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1064"></a>
<a name="line-1065"></a><a name="Docs"></a><span class='hs-comment'>-- list of indentation/document pairs; saves an indirection over [(Int,Doc)]</span>
<a name="line-1066"></a><a name="Docs"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Docs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nil</span>
<a name="line-1067"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Cons</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <span class='hs-conid'>Doc</span> <span class='hs-conid'>Docs</span>
<a name="line-1068"></a>
<a name="line-1069"></a>
<a name="line-1070"></a><a name="renderPretty"></a><span class='hs-comment'>-- | This is the default pretty printer which is used by 'show',</span>
<a name="line-1071"></a><span class='hs-comment'>-- 'putDoc' and 'hPutDoc'. @(renderPretty ribbonfrac width x)@ renders</span>
<a name="line-1072"></a><span class='hs-comment'>-- document @x@ with a page width of @width@ and a ribbon width of</span>
<a name="line-1073"></a><span class='hs-comment'>-- @(ribbonfrac * width)@ characters. The ribbon width is the maximal</span>
<a name="line-1074"></a><span class='hs-comment'>-- amount of non-indentation characters on a line. The parameter</span>
<a name="line-1075"></a><span class='hs-comment'>-- @ribbonfrac@ should be between @0.0@ and @1.0@. If it is lower or</span>
<a name="line-1076"></a><span class='hs-comment'>-- higher, the ribbon width will be 0 or @width@ respectively.</span>
<a name="line-1077"></a><span class='hs-definition'>renderPretty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Float</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SimpleDoc</span>
<a name="line-1078"></a><span class='hs-definition'>renderPretty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderFits</span> <span class='hs-varid'>fits1</span>
<a name="line-1079"></a>
<a name="line-1080"></a><a name="renderSmart"></a><span class='hs-comment'>-- | A slightly smarter rendering algorithm with more lookahead. It provides</span>
<a name="line-1081"></a><span class='hs-comment'>-- provide earlier breaking on deeply nested structures</span>
<a name="line-1082"></a><span class='hs-comment'>-- For example, consider this python-ish pseudocode:</span>
<a name="line-1083"></a><span class='hs-comment'>-- @fun(fun(fun(fun(fun([abcdefg, abcdefg])))))@</span>
<a name="line-1084"></a><span class='hs-comment'>-- If we put a softbreak (+ nesting 2) after each open parenthesis, and align</span>
<a name="line-1085"></a><span class='hs-comment'>-- the elements of the list to match the opening brackets, this will render with</span>
<a name="line-1086"></a><span class='hs-comment'>-- @renderPretty@ and a page width of 20 as:</span>
<a name="line-1087"></a><span class='hs-comment'>-- @</span>
<a name="line-1088"></a><span class='hs-comment'>-- fun(fun(fun(fun(fun([</span>
<a name="line-1089"></a><span class='hs-comment'>--                     | abcdef,</span>
<a name="line-1090"></a><span class='hs-comment'>--                     | abcdef,</span>
<a name="line-1091"></a><span class='hs-comment'>--                     ]</span>
<a name="line-1092"></a><span class='hs-comment'>--   )))))             |</span>
<a name="line-1093"></a><span class='hs-comment'>-- @</span>
<a name="line-1094"></a><span class='hs-comment'>-- Where the 20c. boundary has been marked with |.</span>
<a name="line-1095"></a><span class='hs-comment'>-- Because @renderPretty@ only uses one-line lookahead, it sees that the first</span>
<a name="line-1096"></a><span class='hs-comment'>-- line fits, and is stuck putting the second and third lines after the 20-c</span>
<a name="line-1097"></a><span class='hs-comment'>-- mark. In contrast, @renderSmart@ will continue to check that the potential</span>
<a name="line-1098"></a><span class='hs-comment'>-- document up to the end of the indentation level. Thus, it will format the</span>
<a name="line-1099"></a><span class='hs-comment'>-- document as:</span>
<a name="line-1100"></a><span class='hs-comment'>--</span>
<a name="line-1101"></a><span class='hs-comment'>-- @</span>
<a name="line-1102"></a><span class='hs-comment'>-- fun(                |</span>
<a name="line-1103"></a><span class='hs-comment'>--   fun(              |</span>
<a name="line-1104"></a><span class='hs-comment'>--     fun(            |</span>
<a name="line-1105"></a><span class='hs-comment'>--       fun(          |</span>
<a name="line-1106"></a><span class='hs-comment'>--         fun([       |</span>
<a name="line-1107"></a><span class='hs-comment'>--               abcdef,</span>
<a name="line-1108"></a><span class='hs-comment'>--               abcdef,</span>
<a name="line-1109"></a><span class='hs-comment'>--             ]       |</span>
<a name="line-1110"></a><span class='hs-comment'>--   )))))             |</span>
<a name="line-1111"></a><span class='hs-comment'>-- @</span>
<a name="line-1112"></a><span class='hs-comment'>-- Which fits within the 20c. boundary.</span>
<a name="line-1113"></a><span class='hs-definition'>renderSmart</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Float</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SimpleDoc</span>
<a name="line-1114"></a><span class='hs-definition'>renderSmart</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderFits</span> <span class='hs-varid'>fitsR</span>
<a name="line-1115"></a>
<a name="line-1116"></a><a name="renderFits"></a><span class='hs-definition'>renderFits</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SimpleDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>
<a name="line-1117"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Float</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SimpleDoc</span>
<a name="line-1118"></a><span class='hs-definition'>renderFits</span> <span class='hs-varid'>fits</span> <span class='hs-varid'>rfrac</span> <span class='hs-varid'>w</span> <span class='hs-varid'>x</span>
<a name="line-1119"></a>    <span class='hs-comment'>-- I used to do a @SSGR [Reset]@ here, but if you do that it will result</span>
<a name="line-1120"></a>    <span class='hs-comment'>-- in any rendered @Doc@ containing at least some ANSI control codes. This</span>
<a name="line-1121"></a>    <span class='hs-comment'>-- may be undesirable if you want to render to non-ANSI devices by simply</span>
<a name="line-1122"></a>    <span class='hs-comment'>-- not making use of the ANSI color combinators I provide.</span>
<a name="line-1123"></a>    <span class='hs-comment'>--</span>
<a name="line-1124"></a>    <span class='hs-comment'>-- What I "really" want to do here is do an initial Reset iff there is some</span>
<a name="line-1125"></a>    <span class='hs-comment'>-- ANSI color within the Doc, but that's a bit fiddly. I'll fix it if someone</span>
<a name="line-1126"></a>    <span class='hs-comment'>-- complains!</span>
<a name="line-1127"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>best</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-num'>0</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Nil</span><span class='hs-layout'>)</span>
<a name="line-1128"></a>    <span class='hs-keyword'>where</span>
<a name="line-1129"></a>      <span class='hs-comment'>-- r :: the ribbon width in characters</span>
<a name="line-1130"></a>      <span class='hs-varid'>r</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>max</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>min</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-varid'>round</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>w</span> <span class='hs-varop'>*</span> <span class='hs-varid'>rfrac</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1131"></a>
<a name="line-1132"></a>      <span class='hs-comment'>-- best :: n = indentation of current line</span>
<a name="line-1133"></a>      <span class='hs-comment'>--         k = current column</span>
<a name="line-1134"></a>      <span class='hs-comment'>--        (ie. (k &gt;= n) &amp;&amp; (k - n == count of inserted characters)</span>
<a name="line-1135"></a>      <span class='hs-varid'>best</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>mb_fc</span> <span class='hs-varid'>mb_bc</span> <span class='hs-varid'>mb_in</span> <span class='hs-varid'>mb_it</span> <span class='hs-varid'>mb_un</span> <span class='hs-conid'>Nil</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SEmpty</span>
<a name="line-1136"></a>      <span class='hs-varid'>best</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>mb_fc</span> <span class='hs-varid'>mb_bc</span> <span class='hs-varid'>mb_in</span> <span class='hs-varid'>mb_it</span> <span class='hs-varid'>mb_un</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>d</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1137"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>d</span> <span class='hs-keyword'>of</span>
<a name="line-1138"></a>            <span class='hs-conid'>Fail</span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SFail</span>
<a name="line-1139"></a>            <span class='hs-conid'>Empty</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>ds</span>
<a name="line-1140"></a>            <span class='hs-conid'>Char</span> <span class='hs-varid'>c</span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>k'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span><span class='hs-varop'>+</span><span class='hs-num'>1</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>seq</span> <span class='hs-varid'>k'</span> <span class='hs-layout'>(</span><span class='hs-conid'>SChar</span> <span class='hs-varid'>c</span> <span class='hs-layout'>(</span><span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k'</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1141"></a>            <span class='hs-conid'>Text</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>k'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span><span class='hs-varop'>+</span><span class='hs-varid'>l</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>seq</span> <span class='hs-varid'>k'</span> <span class='hs-layout'>(</span><span class='hs-conid'>SText</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k'</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1142"></a>            <span class='hs-conid'>Line</span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SLine</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>best_typical</span> <span class='hs-varid'>i</span> <span class='hs-varid'>i</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1143"></a>            <span class='hs-conid'>FlatAlt</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1144"></a>            <span class='hs-conid'>Cat</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>y</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1145"></a>            <span class='hs-conid'>Nest</span> <span class='hs-varid'>j</span> <span class='hs-varid'>x</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-varid'>j</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>seq</span> <span class='hs-varid'>i'</span> <span class='hs-layout'>(</span><span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>x</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1146"></a>            <span class='hs-conid'>Union</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>nicest</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1147"></a>                                        <span class='hs-layout'>(</span><span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>y</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1148"></a>            <span class='hs-conid'>Column</span> <span class='hs-varid'>f</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1149"></a>            <span class='hs-conid'>Columns</span> <span class='hs-varid'>f</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1150"></a>            <span class='hs-conid'>Nesting</span> <span class='hs-varid'>f</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>best_typical</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1151"></a>            <span class='hs-conid'>Color</span> <span class='hs-varid'>l</span> <span class='hs-varid'>t</span> <span class='hs-varid'>c</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SSGR</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SetColor</span> <span class='hs-varid'>l</span> <span class='hs-varid'>t</span> <span class='hs-varid'>c</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-varid'>best</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>mb_fc'</span> <span class='hs-varid'>mb_bc'</span> <span class='hs-varid'>mb_in</span> <span class='hs-varid'>mb_it</span> <span class='hs-varid'>mb_un</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-varid'>ds_restore</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1152"></a>              <span class='hs-keyword'>where</span>
<a name="line-1153"></a>                <span class='hs-varid'>mb_fc'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>Background</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mb_fc</span><span class='hs-layout'>;</span> <span class='hs-conid'>Foreground</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-1154"></a>                <span class='hs-varid'>mb_bc'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>Background</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-layout'>;</span> <span class='hs-conid'>Foreground</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mb_bc</span> <span class='hs-layout'>}</span>
<a name="line-1155"></a>            <span class='hs-conid'>Intensify</span> <span class='hs-varid'>t</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SSGR</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SetConsoleIntensity</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-varid'>best</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>mb_fc</span> <span class='hs-varid'>mb_bc</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_it</span> <span class='hs-varid'>mb_un</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-varid'>ds_restore</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1156"></a>            <span class='hs-conid'>Italicize</span> <span class='hs-varid'>t</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SSGR</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SetItalicized</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-varid'>best</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>mb_fc</span> <span class='hs-varid'>mb_bc</span> <span class='hs-varid'>mb_in</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_un</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-varid'>ds_restore</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1157"></a>            <span class='hs-conid'>Underline</span> <span class='hs-varid'>u</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SSGR</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SetUnderlining</span> <span class='hs-varid'>u</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-varid'>best</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>mb_fc</span> <span class='hs-varid'>mb_bc</span> <span class='hs-varid'>mb_in</span> <span class='hs-varid'>mb_it</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-varid'>ds_restore</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1158"></a>            <span class='hs-conid'>RestoreFormat</span> <span class='hs-varid'>mb_fc'</span> <span class='hs-varid'>mb_bc'</span> <span class='hs-varid'>mb_in'</span> <span class='hs-varid'>mb_it'</span> <span class='hs-varid'>mb_un'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SSGR</span> <span class='hs-varid'>sgrs</span> <span class='hs-layout'>(</span><span class='hs-varid'>best</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>mb_fc'</span> <span class='hs-varid'>mb_bc'</span> <span class='hs-varid'>mb_in'</span> <span class='hs-varid'>mb_it'</span> <span class='hs-varid'>mb_un'</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1159"></a>              <span class='hs-keyword'>where</span>
<a name="line-1160"></a>                <span class='hs-comment'>-- We need to be able to restore the entire SGR state, hence we carry around what we believe</span>
<a name="line-1161"></a>                <span class='hs-comment'>-- that state should be in all the arguments to this function. Note that in some cases we could</span>
<a name="line-1162"></a>                <span class='hs-comment'>-- avoid the Reset of the entire state, but not in general.</span>
<a name="line-1163"></a>                <span class='hs-varid'>sgrs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Reset</span> <span class='hs-conop'>:</span> <span class='hs-varid'>catMaybes</span> <span class='hs-keyglyph'>[</span>
<a name="line-1164"></a>                    <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>uncurry</span> <span class='hs-layout'>(</span><span class='hs-conid'>SetColor</span> <span class='hs-conid'>Foreground</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_fc'</span><span class='hs-layout'>,</span>
<a name="line-1165"></a>                    <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>uncurry</span> <span class='hs-layout'>(</span><span class='hs-conid'>SetColor</span> <span class='hs-conid'>Background</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_bc'</span><span class='hs-layout'>,</span>
<a name="line-1166"></a>                    <span class='hs-varid'>fmap</span> <span class='hs-conid'>SetConsoleIntensity</span> <span class='hs-varid'>mb_in'</span><span class='hs-layout'>,</span>
<a name="line-1167"></a>                    <span class='hs-varid'>fmap</span> <span class='hs-conid'>SetItalicized</span> <span class='hs-varid'>mb_it'</span><span class='hs-layout'>,</span>
<a name="line-1168"></a>                    <span class='hs-varid'>fmap</span> <span class='hs-conid'>SetUnderlining</span> <span class='hs-varid'>mb_un'</span>
<a name="line-1169"></a>                  <span class='hs-keyglyph'>]</span>
<a name="line-1170"></a>        <span class='hs-keyword'>where</span>
<a name="line-1171"></a>          <span class='hs-varid'>best_typical</span> <span class='hs-varid'>n'</span> <span class='hs-varid'>k'</span> <span class='hs-varid'>ds'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>best</span> <span class='hs-varid'>n'</span> <span class='hs-varid'>k'</span> <span class='hs-varid'>mb_fc</span> <span class='hs-varid'>mb_bc</span> <span class='hs-varid'>mb_in</span> <span class='hs-varid'>mb_it</span> <span class='hs-varid'>mb_un</span> <span class='hs-varid'>ds'</span>
<a name="line-1172"></a>          <span class='hs-varid'>ds_restore</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cons</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-conid'>RestoreFormat</span> <span class='hs-varid'>mb_fc</span> <span class='hs-varid'>mb_bc</span> <span class='hs-varid'>mb_in</span> <span class='hs-varid'>mb_it</span> <span class='hs-varid'>mb_un</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span>
<a name="line-1173"></a>
<a name="line-1174"></a>      <span class='hs-comment'>--nicest :: r = ribbon width, w = page width,</span>
<a name="line-1175"></a>      <span class='hs-comment'>--          n = indentation of current line, k = current column</span>
<a name="line-1176"></a>      <span class='hs-comment'>--          x and y, the (simple) documents to chose from.</span>
<a name="line-1177"></a>      <span class='hs-comment'>--          precondition: first lines of x are longer than the first lines of y.</span>
<a name="line-1178"></a>      <span class='hs-varid'>nicest</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>fits</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-varid'>min</span> <span class='hs-varid'>n</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-varid'>width</span> <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span>
<a name="line-1179"></a>                        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>y</span>
<a name="line-1180"></a>                        <span class='hs-keyword'>where</span>
<a name="line-1181"></a>                          <span class='hs-varid'>width</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>min</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-comment'>-</span> <span class='hs-varid'>k</span> <span class='hs-varop'>+</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-1182"></a>
<a name="line-1183"></a><a name="fits1"></a><span class='hs-comment'>-- @fits1@ does 1 line lookahead.</span>
<a name="line-1184"></a><span class='hs-definition'>fits1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SimpleDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-1185"></a><span class='hs-definition'>fits1</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>w</span> <span class='hs-varid'>x</span>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>w</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-1186"></a><span class='hs-definition'>fits1</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>w</span> <span class='hs-conid'>SFail</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-1187"></a><span class='hs-definition'>fits1</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>w</span> <span class='hs-conid'>SEmpty</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-1188"></a><span class='hs-definition'>fits1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-conid'>SChar</span> <span class='hs-varid'>c</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fits1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-1189"></a><span class='hs-definition'>fits1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-conid'>SText</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fits1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-1190"></a><span class='hs-definition'>fits1</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-conid'>SLine</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-1191"></a><span class='hs-definition'>fits1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-conid'>SSGR</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fits1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-varid'>x</span>
<a name="line-1192"></a>
<a name="line-1193"></a><a name="fitsR"></a><span class='hs-comment'>-- @fitsR@ has a little more lookahead: assuming that nesting roughly</span>
<a name="line-1194"></a><span class='hs-comment'>-- corresponds to syntactic depth, @fitsR@ checks that not only the current line</span>
<a name="line-1195"></a><span class='hs-comment'>-- fits, but the entire syntactic structure being formatted at this level of</span>
<a name="line-1196"></a><span class='hs-comment'>-- indentation fits. If we were to remove the second case for @SLine@, we would</span>
<a name="line-1197"></a><span class='hs-comment'>-- check that not only the current structure fits, but also the rest of the</span>
<a name="line-1198"></a><span class='hs-comment'>-- document, which would be slightly more intelligent but would have exponential</span>
<a name="line-1199"></a><span class='hs-comment'>-- runtime (and is prohibitively expensive in practice).</span>
<a name="line-1200"></a><span class='hs-comment'>-- p = pagewidth</span>
<a name="line-1201"></a><span class='hs-comment'>-- m = minimum nesting level to fit in</span>
<a name="line-1202"></a><span class='hs-comment'>-- w = the width in which to fit the first line</span>
<a name="line-1203"></a><span class='hs-definition'>fitsR</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SimpleDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-1204"></a><span class='hs-definition'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-varid'>x</span>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>w</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-1205"></a><span class='hs-definition'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-conid'>SFail</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-1206"></a><span class='hs-definition'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-conid'>SEmpty</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-1207"></a><span class='hs-definition'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-conid'>SChar</span> <span class='hs-varid'>c</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-1208"></a><span class='hs-definition'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-conid'>SText</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-1209"></a><span class='hs-definition'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-conid'>SLine</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>m</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>i</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-comment'>-</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-1210"></a>                        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-1211"></a><span class='hs-definition'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-conid'>SSGR</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fitsR</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <span class='hs-varid'>w</span> <span class='hs-varid'>x</span>
<a name="line-1212"></a>
<a name="line-1213"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1214"></a><span class='hs-comment'>-- renderCompact: renders documents without indentation</span>
<a name="line-1215"></a><span class='hs-comment'>--  fast and fewer characters output, good for machines</span>
<a name="line-1216"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1217"></a>
<a name="line-1218"></a>
<a name="line-1219"></a><a name="renderCompact"></a><span class='hs-comment'>-- | @(renderCompact x)@ renders document @x@ without adding any</span>
<a name="line-1220"></a><span class='hs-comment'>-- indentation. Since no \'pretty\' printing is involved, this</span>
<a name="line-1221"></a><span class='hs-comment'>-- renderer is very fast. The resulting output contains fewer</span>
<a name="line-1222"></a><span class='hs-comment'>-- characters than a pretty printed version and can be used for output</span>
<a name="line-1223"></a><span class='hs-comment'>-- that is read by other programs.</span>
<a name="line-1224"></a><span class='hs-comment'>--</span>
<a name="line-1225"></a><span class='hs-comment'>-- This rendering function does not add any colorisation information.</span>
<a name="line-1226"></a><span class='hs-definition'>renderCompact</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SimpleDoc</span>
<a name="line-1227"></a><span class='hs-definition'>renderCompact</span> <span class='hs-varid'>x</span>
<a name="line-1228"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>scan</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span>
<a name="line-1229"></a>    <span class='hs-keyword'>where</span>
<a name="line-1230"></a>      <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SEmpty</span>
<a name="line-1231"></a>      <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</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-keyword'>of</span>
<a name="line-1232"></a>                        <span class='hs-conid'>Fail</span>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SFail</span>
<a name="line-1233"></a>                        <span class='hs-conid'>Empty</span>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-varid'>ds</span>
<a name="line-1234"></a>                        <span class='hs-conid'>Char</span> <span class='hs-varid'>c</span>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>k'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span><span class='hs-varop'>+</span><span class='hs-num'>1</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>seq</span> <span class='hs-varid'>k'</span> <span class='hs-layout'>(</span><span class='hs-conid'>SChar</span> <span class='hs-varid'>c</span> <span class='hs-layout'>(</span><span class='hs-varid'>scan</span> <span class='hs-varid'>k'</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1235"></a>                        <span class='hs-conid'>Text</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>k'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span><span class='hs-varop'>+</span><span class='hs-varid'>l</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>seq</span> <span class='hs-varid'>k'</span> <span class='hs-layout'>(</span><span class='hs-conid'>SText</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-varid'>scan</span> <span class='hs-varid'>k'</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-1236"></a>                        <span class='hs-conid'>FlatAlt</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1237"></a>                        <span class='hs-conid'>Line</span>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SLine</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>scan</span> <span class='hs-num'>0</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1238"></a>                        <span class='hs-conid'>Cat</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1239"></a>                        <span class='hs-conid'>Nest</span> <span class='hs-varid'>j</span> <span class='hs-varid'>x</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1240"></a>                        <span class='hs-conid'>Union</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1241"></a>                        <span class='hs-conid'>Column</span> <span class='hs-varid'>f</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>k</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1242"></a>                        <span class='hs-conid'>Columns</span> <span class='hs-varid'>f</span>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-conid'>Nothing</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1243"></a>                        <span class='hs-conid'>Nesting</span> <span class='hs-varid'>f</span>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-num'>0</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1244"></a>                        <span class='hs-conid'>Color</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1245"></a>                        <span class='hs-conid'>Intensify</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1246"></a>                        <span class='hs-conid'>Italicize</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1247"></a>                        <span class='hs-conid'>Underline</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-1248"></a>                        <span class='hs-conid'>RestoreFormat</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>k</span> <span class='hs-varid'>ds</span>
<a name="line-1249"></a>
<a name="line-1250"></a>
<a name="line-1251"></a>
<a name="line-1252"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1253"></a><span class='hs-comment'>-- Displayers:  displayS and displayIO</span>
<a name="line-1254"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1255"></a>
<a name="line-1256"></a>
<a name="line-1257"></a><a name="displayS"></a><span class='hs-comment'>-- | @(displayS simpleDoc)@ takes the output @simpleDoc@ from a</span>
<a name="line-1258"></a><span class='hs-comment'>-- rendering function and transforms it to a 'ShowS' type (for use in</span>
<a name="line-1259"></a><span class='hs-comment'>-- the 'Show' class).</span>
<a name="line-1260"></a><span class='hs-comment'>--</span>
<a name="line-1261"></a><span class='hs-comment'>-- &gt; showWidth :: Int -&gt; Doc -&gt; String</span>
<a name="line-1262"></a><span class='hs-comment'>-- &gt; showWidth w x   = displayS (renderPretty 0.4 w x) ""</span>
<a name="line-1263"></a><span class='hs-comment'>--</span>
<a name="line-1264"></a><span class='hs-comment'>-- ANSI color information will be discarded by this function unless</span>
<a name="line-1265"></a><span class='hs-comment'>-- you are running on a Unix-like operating system. This is due to</span>
<a name="line-1266"></a><span class='hs-comment'>-- a technical limitation in Windows ANSI support.</span>
<a name="line-1267"></a><span class='hs-definition'>displayS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SimpleDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ShowS</span>
<a name="line-1268"></a><span class='hs-definition'>displayS</span> <span class='hs-conid'>SFail</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-str'>"@SFail@ can not appear uncaught in a "</span> <span class='hs-varop'>++</span>
<a name="line-1269"></a>                              <span class='hs-str'>"rendered @SimpleDoc@"</span>
<a name="line-1270"></a><span class='hs-definition'>displayS</span> <span class='hs-conid'>SEmpty</span>             <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-1271"></a><span class='hs-definition'>displayS</span> <span class='hs-layout'>(</span><span class='hs-conid'>SChar</span> <span class='hs-varid'>c</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showChar</span> <span class='hs-varid'>c</span> <span class='hs-varop'>.</span> <span class='hs-varid'>displayS</span> <span class='hs-varid'>x</span>
<a name="line-1272"></a><span class='hs-definition'>displayS</span> <span class='hs-layout'>(</span><span class='hs-conid'>SText</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showString</span> <span class='hs-varid'>s</span> <span class='hs-varop'>.</span> <span class='hs-varid'>displayS</span> <span class='hs-varid'>x</span>
<a name="line-1273"></a><span class='hs-definition'>displayS</span> <span class='hs-layout'>(</span><span class='hs-conid'>SLine</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showString</span> <span class='hs-layout'>(</span><span class='hs-chr'>'\n'</span><span class='hs-conop'>:</span><span class='hs-varid'>indentation</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>displayS</span> <span class='hs-varid'>x</span>
<a name="line-1274"></a><span class='hs-definition'>displayS</span> <span class='hs-layout'>(</span><span class='hs-conid'>SSGR</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showString</span> <span class='hs-layout'>(</span><span class='hs-varid'>setSGRCode</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>displayS</span> <span class='hs-varid'>x</span>
<a name="line-1275"></a>
<a name="line-1276"></a>
<a name="line-1277"></a><a name="displayIO"></a><span class='hs-comment'>-- | @(displayIO handle simpleDoc)@ writes @simpleDoc@ to the file</span>
<a name="line-1278"></a><span class='hs-comment'>-- handle @handle@. This function is used for example by 'hPutDoc':</span>
<a name="line-1279"></a><span class='hs-comment'>--</span>
<a name="line-1280"></a><span class='hs-comment'>-- &gt; hPutDoc handle doc  = displayIO handle (renderPretty 0.4 100 doc)</span>
<a name="line-1281"></a><span class='hs-comment'>--</span>
<a name="line-1282"></a><span class='hs-comment'>-- Any ANSI colorisation in @simpleDoc@ will be output.</span>
<a name="line-1283"></a><span class='hs-definition'>displayIO</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SimpleDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-1284"></a><span class='hs-definition'>displayIO</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>simpleDoc</span>
<a name="line-1285"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>display</span> <span class='hs-varid'>simpleDoc</span>
<a name="line-1286"></a>    <span class='hs-keyword'>where</span>
<a name="line-1287"></a>      <span class='hs-varid'>display</span> <span class='hs-conid'>SFail</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-str'>"@SFail@ can not appear uncaught in a "</span> <span class='hs-varop'>++</span>
<a name="line-1288"></a>                              <span class='hs-str'>"rendered @SimpleDoc@"</span>
<a name="line-1289"></a>      <span class='hs-varid'>display</span> <span class='hs-conid'>SEmpty</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-1290"></a>      <span class='hs-varid'>display</span> <span class='hs-layout'>(</span><span class='hs-conid'>SChar</span> <span class='hs-varid'>c</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span><span class='hs-layout'>{</span> <span class='hs-varid'>hPutChar</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>c</span><span class='hs-layout'>;</span> <span class='hs-varid'>display</span> <span class='hs-varid'>x</span><span class='hs-layout'>}</span>
<a name="line-1291"></a>      <span class='hs-varid'>display</span> <span class='hs-layout'>(</span><span class='hs-conid'>SText</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span><span class='hs-layout'>{</span> <span class='hs-varid'>hPutStr</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>s</span><span class='hs-layout'>;</span> <span class='hs-varid'>display</span> <span class='hs-varid'>x</span><span class='hs-layout'>}</span>
<a name="line-1292"></a>      <span class='hs-varid'>display</span> <span class='hs-layout'>(</span><span class='hs-conid'>SLine</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span><span class='hs-layout'>{</span> <span class='hs-varid'>hPutStr</span> <span class='hs-varid'>handle</span> <span class='hs-layout'>(</span><span class='hs-chr'>'\n'</span><span class='hs-conop'>:</span><span class='hs-varid'>indentation</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span><span class='hs-layout'>;</span> <span class='hs-varid'>display</span> <span class='hs-varid'>x</span><span class='hs-layout'>}</span>
<a name="line-1293"></a>      <span class='hs-varid'>display</span> <span class='hs-layout'>(</span><span class='hs-conid'>SSGR</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span><span class='hs-layout'>{</span> <span class='hs-varid'>hSetSGR</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>s</span><span class='hs-layout'>;</span> <span class='hs-varid'>display</span> <span class='hs-varid'>x</span><span class='hs-layout'>}</span>
<a name="line-1294"></a>
<a name="line-1295"></a><a name="instance%20Show%20Doc"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1296"></a><a name="instance%20Show%20Doc"></a><span class='hs-comment'>-- default pretty printers: show, putDoc and hPutDoc</span>
<a name="line-1297"></a><a name="instance%20Show%20Doc"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1298"></a><a name="instance%20Show%20Doc"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>Doc</span> <span class='hs-keyword'>where</span>
<a name="line-1299"></a>  <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>d</span> <span class='hs-varid'>doc</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>displayS</span> <span class='hs-layout'>(</span><span class='hs-varid'>renderPretty</span> <span class='hs-num'>0.4</span> <span class='hs-num'>80</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span>
<a name="line-1300"></a>
<a name="line-1301"></a><a name="putDoc"></a><span class='hs-comment'>-- | The action @(putDoc doc)@ pretty prints document @doc@ to the</span>
<a name="line-1302"></a><span class='hs-comment'>-- standard output, with a page width of 100 characters and a ribbon</span>
<a name="line-1303"></a><span class='hs-comment'>-- width of 40 characters.</span>
<a name="line-1304"></a><span class='hs-comment'>--</span>
<a name="line-1305"></a><span class='hs-comment'>-- &gt; main :: IO ()</span>
<a name="line-1306"></a><span class='hs-comment'>-- &gt; main = do{ putDoc (text "hello" &lt;+&gt; text "world") }</span>
<a name="line-1307"></a><span class='hs-comment'>--</span>
<a name="line-1308"></a><span class='hs-comment'>-- Which would output</span>
<a name="line-1309"></a><span class='hs-comment'>--</span>
<a name="line-1310"></a><span class='hs-comment'>-- @</span>
<a name="line-1311"></a><span class='hs-comment'>-- hello world</span>
<a name="line-1312"></a><span class='hs-comment'>-- @</span>
<a name="line-1313"></a><span class='hs-comment'>--</span>
<a name="line-1314"></a><span class='hs-comment'>-- Any ANSI colorisation in @doc@ will be output.</span>
<a name="line-1315"></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-1316"></a><span class='hs-definition'>putDoc</span> <span class='hs-varid'>doc</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPutDoc</span> <span class='hs-varid'>stdout</span> <span class='hs-varid'>doc</span>
<a name="line-1317"></a>
<a name="line-1318"></a><a name="hPutDoc"></a><span class='hs-comment'>-- | @(hPutDoc handle doc)@ pretty prints document @doc@ to the file</span>
<a name="line-1319"></a><span class='hs-comment'>-- handle @handle@ with a page width of 100 characters and a ribbon</span>
<a name="line-1320"></a><span class='hs-comment'>-- width of 40 characters.</span>
<a name="line-1321"></a><span class='hs-comment'>--</span>
<a name="line-1322"></a><span class='hs-comment'>-- &gt; main = do{ handle &lt;- openFile "MyFile" WriteMode</span>
<a name="line-1323"></a><span class='hs-comment'>-- &gt;          ; hPutDoc handle (vcat (map text</span>
<a name="line-1324"></a><span class='hs-comment'>-- &gt;                            ["vertical","text"]))</span>
<a name="line-1325"></a><span class='hs-comment'>-- &gt;          ; hClose handle</span>
<a name="line-1326"></a><span class='hs-comment'>-- &gt;          }</span>
<a name="line-1327"></a><span class='hs-comment'>--</span>
<a name="line-1328"></a><span class='hs-comment'>-- Any ANSI colorisation in @doc@ will be output.</span>
<a name="line-1329"></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-1330"></a><span class='hs-definition'>hPutDoc</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>doc</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>displayIO</span> <span class='hs-varid'>handle</span> <span class='hs-layout'>(</span><span class='hs-varid'>renderPretty</span> <span class='hs-num'>0.4</span> <span class='hs-num'>80</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span>
<a name="line-1331"></a>
<a name="line-1332"></a>
<a name="line-1333"></a>
<a name="line-1334"></a><a name="spaces"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1335"></a><span class='hs-comment'>-- insert spaces</span>
<a name="line-1336"></a><span class='hs-comment'>-- "indentation" used to insert tabs but tabs seem to cause</span>
<a name="line-1337"></a><span class='hs-comment'>-- more trouble than they solve :-)</span>
<a name="line-1338"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-1339"></a><span class='hs-definition'>spaces</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-1340"></a><span class='hs-definition'>spaces</span> <span class='hs-varid'>n</span>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <span class='hs-str'>""</span>
<a name="line-1341"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>replicate</span> <span class='hs-varid'>n</span> <span class='hs-chr'>' '</span>
<a name="line-1342"></a>
<a name="line-1343"></a><a name="indentation"></a><span class='hs-definition'>indentation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-1344"></a><span class='hs-definition'>indentation</span> <span class='hs-varid'>n</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>spaces</span> <span class='hs-varid'>n</span>
<a name="line-1345"></a>
<a name="line-1346"></a><span class='hs-comment'>--indentation n   | n &gt;= 8    = '\t' : indentation (n-8)</span>
<a name="line-1347"></a><span class='hs-comment'>--                | otherwise = spaces n</span>
<a name="line-1348"></a>
<a name="line-1349"></a><span class='hs-comment'>--  LocalWords:  PPrint combinators Wadler Wadler's encloseSep</span>
</pre></body>
</html>