Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1792

ghc-ghc-devel-6.12.3-5.fc14.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://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>utils/Outputable.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP Project, Glasgow University, 1992-1998
%

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- | This module defines classes and functions for pretty-printing. It also</span>
<a name="line-2"></a><span class='hs-comment'>-- exports a number of helpful debugging and other utilities such as 'trace' and 'panic'.</span>
<a name="line-3"></a><span class='hs-comment'>--</span>
<a name="line-4"></a><span class='hs-comment'>-- The interface to this module is very similar to the standard Hughes-PJ pretty printing</span>
<a name="line-5"></a><span class='hs-comment'>-- module, except that it exports a number of additional functions that are rarely used,</span>
<a name="line-6"></a><span class='hs-comment'>-- and works over the 'SDoc' type.</span>
<a name="line-7"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Outputable</span> <span class='hs-layout'>(</span>
<a name="line-8"></a>	<span class='hs-comment'>-- * Type classes</span>
<a name="line-9"></a>	<span class='hs-conid'>Outputable</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'>OutputableBndr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-10"></a>
<a name="line-11"></a>        <span class='hs-comment'>-- * Pretty printing combinators</span>
<a name="line-12"></a>	<span class='hs-conid'>SDoc</span><span class='hs-layout'>,</span>
<a name="line-13"></a>	<span class='hs-varid'>docToSDoc</span><span class='hs-layout'>,</span>
<a name="line-14"></a>	<span class='hs-varid'>interppSP</span><span class='hs-layout'>,</span> <span class='hs-varid'>interpp'SP</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprQuotedList</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprWithCommas</span><span class='hs-layout'>,</span>
<a name="line-15"></a>	<span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-varid'>nest</span><span class='hs-layout'>,</span>
<a name="line-16"></a>	<span class='hs-varid'>char</span><span class='hs-layout'>,</span>
<a name="line-17"></a>	<span class='hs-varid'>text</span><span class='hs-layout'>,</span> <span class='hs-varid'>ftext</span><span class='hs-layout'>,</span> <span class='hs-varid'>ptext</span><span class='hs-layout'>,</span>
<a name="line-18"></a>	<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-19"></a>	<span class='hs-varid'>parens</span><span class='hs-layout'>,</span> <span class='hs-varid'>cparen</span><span class='hs-layout'>,</span> <span class='hs-varid'>brackets</span><span class='hs-layout'>,</span> <span class='hs-varid'>braces</span><span class='hs-layout'>,</span> <span class='hs-varid'>quotes</span><span class='hs-layout'>,</span> <span class='hs-varid'>doubleQuotes</span><span class='hs-layout'>,</span> <span class='hs-varid'>angleBrackets</span><span class='hs-layout'>,</span>
<a name="line-20"></a>	<span class='hs-varid'>semi</span><span class='hs-layout'>,</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span> <span class='hs-varid'>colon</span><span class='hs-layout'>,</span> <span class='hs-varid'>dcolon</span><span class='hs-layout'>,</span> <span class='hs-varid'>space</span><span class='hs-layout'>,</span> <span class='hs-varid'>equals</span><span class='hs-layout'>,</span> <span class='hs-varid'>dot</span><span class='hs-layout'>,</span> <span class='hs-varid'>arrow</span><span class='hs-layout'>,</span>
<a name="line-21"></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'>lbrack</span><span class='hs-layout'>,</span> <span class='hs-varid'>rbrack</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'>underscore</span><span class='hs-layout'>,</span>
<a name="line-22"></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-varid'>hcat</span><span class='hs-layout'>,</span> <span class='hs-varid'>hsep</span><span class='hs-layout'>,</span> 
<a name="line-23"></a>	<span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>$+$</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>vcat</span><span class='hs-layout'>,</span>
<a name="line-24"></a>	<span class='hs-varid'>sep</span><span class='hs-layout'>,</span> <span class='hs-varid'>cat</span><span class='hs-layout'>,</span> 
<a name="line-25"></a>	<span class='hs-varid'>fsep</span><span class='hs-layout'>,</span> <span class='hs-varid'>fcat</span><span class='hs-layout'>,</span> 
<a name="line-26"></a>	<span class='hs-varid'>hang</span><span class='hs-layout'>,</span> <span class='hs-varid'>punctuate</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppWhen</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppUnless</span><span class='hs-layout'>,</span>
<a name="line-27"></a>	<span class='hs-varid'>speakNth</span><span class='hs-layout'>,</span> <span class='hs-varid'>speakNTimes</span><span class='hs-layout'>,</span> <span class='hs-varid'>speakN</span><span class='hs-layout'>,</span> <span class='hs-varid'>speakNOf</span><span class='hs-layout'>,</span> <span class='hs-varid'>plural</span><span class='hs-layout'>,</span>
<a name="line-28"></a>
<a name="line-29"></a>        <span class='hs-comment'>-- * Converting 'SDoc' into strings and outputing it</span>
<a name="line-30"></a>	<span class='hs-varid'>printSDoc</span><span class='hs-layout'>,</span> <span class='hs-varid'>printErrs</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPrintDump</span><span class='hs-layout'>,</span> <span class='hs-varid'>printDump</span><span class='hs-layout'>,</span>
<a name="line-31"></a>	<span class='hs-varid'>printForC</span><span class='hs-layout'>,</span> <span class='hs-varid'>printForAsm</span><span class='hs-layout'>,</span> <span class='hs-varid'>printForUser</span><span class='hs-layout'>,</span> <span class='hs-varid'>printForUserPartWay</span><span class='hs-layout'>,</span>
<a name="line-32"></a>	<span class='hs-varid'>pprCode</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkCodeStyle</span><span class='hs-layout'>,</span>
<a name="line-33"></a>	<span class='hs-varid'>showSDoc</span><span class='hs-layout'>,</span> <span class='hs-varid'>showSDocOneLine</span><span class='hs-layout'>,</span>
<a name="line-34"></a>        <span class='hs-varid'>showSDocForUser</span><span class='hs-layout'>,</span> <span class='hs-varid'>showSDocDebug</span><span class='hs-layout'>,</span> <span class='hs-varid'>showSDocDump</span><span class='hs-layout'>,</span> <span class='hs-varid'>showSDocDumpOneLine</span><span class='hs-layout'>,</span>
<a name="line-35"></a>        <span class='hs-varid'>showPpr</span><span class='hs-layout'>,</span>
<a name="line-36"></a>	<span class='hs-varid'>showSDocUnqual</span><span class='hs-layout'>,</span> <span class='hs-varid'>showsPrecSDoc</span><span class='hs-layout'>,</span>
<a name="line-37"></a>
<a name="line-38"></a>	<span class='hs-varid'>pprInfixVar</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprPrefixVar</span><span class='hs-layout'>,</span>
<a name="line-39"></a>	<span class='hs-varid'>pprHsChar</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprHsString</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprHsInfix</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprHsVar</span><span class='hs-layout'>,</span>
<a name="line-40"></a>        <span class='hs-varid'>pprFastFilePath</span><span class='hs-layout'>,</span>
<a name="line-41"></a>
<a name="line-42"></a>        <span class='hs-comment'>-- * Controlling the style in which output is printed</span>
<a name="line-43"></a>	<span class='hs-conid'>BindingSite</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-44"></a>
<a name="line-45"></a>	<span class='hs-conid'>PprStyle</span><span class='hs-layout'>,</span> <span class='hs-conid'>CodeStyle</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'>PrintUnqualified</span><span class='hs-layout'>,</span> <span class='hs-varid'>alwaysQualify</span><span class='hs-layout'>,</span> <span class='hs-varid'>neverQualify</span><span class='hs-layout'>,</span>
<a name="line-46"></a>        <span class='hs-conid'>QualifyName</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-47"></a>	<span class='hs-varid'>getPprStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>withPprStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>withPprStyleDoc</span><span class='hs-layout'>,</span> 
<a name="line-48"></a>	<span class='hs-varid'>pprDeeper</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprDeeperList</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprSetDepth</span><span class='hs-layout'>,</span>
<a name="line-49"></a>	<span class='hs-varid'>codeStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>userStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>debugStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>dumpStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>asmStyle</span><span class='hs-layout'>,</span>
<a name="line-50"></a>	<span class='hs-varid'>ifPprDebug</span><span class='hs-layout'>,</span> <span class='hs-varid'>qualName</span><span class='hs-layout'>,</span> <span class='hs-varid'>qualModule</span><span class='hs-layout'>,</span>
<a name="line-51"></a>	<span class='hs-varid'>mkErrStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>defaultErrStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>defaultDumpStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>defaultUserStyle</span><span class='hs-layout'>,</span>
<a name="line-52"></a>        <span class='hs-varid'>mkUserStyle</span><span class='hs-layout'>,</span> <span class='hs-conid'>Depth</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-53"></a>
<a name="line-54"></a>	<span class='hs-comment'>-- * Error handling and debugging utilities</span>
<a name="line-55"></a>	<span class='hs-varid'>pprPanic</span><span class='hs-layout'>,</span> <span class='hs-varid'>assertPprPanic</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprPanicFastInt</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprPgmError</span><span class='hs-layout'>,</span> 
<a name="line-56"></a>	<span class='hs-varid'>pprTrace</span><span class='hs-layout'>,</span> <span class='hs-varid'>warnPprTrace</span><span class='hs-layout'>,</span>
<a name="line-57"></a>	<span class='hs-varid'>trace</span><span class='hs-layout'>,</span> <span class='hs-varid'>pgmError</span><span class='hs-layout'>,</span> <span class='hs-varid'>panic</span><span class='hs-layout'>,</span> <span class='hs-varid'>panicFastInt</span><span class='hs-layout'>,</span> <span class='hs-varid'>assertPanic</span>
<a name="line-58"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> 	<span class='hs-conid'>Module</span><span class='hs-layout'>(</span> <span class='hs-conid'>Module</span><span class='hs-layout'>,</span> <span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span> <span class='hs-varid'>moduleName</span> <span class='hs-layout'>)</span>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> 	<span class='hs-conid'>OccName</span><span class='hs-layout'>(</span> <span class='hs-conid'>OccName</span> <span class='hs-layout'>)</span>
<a name="line-62"></a>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>StaticFlags</span>
<a name="line-64"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span> 
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastTypes</span>
<a name="line-66"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Pretty</span>
<a name="line-67"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Pretty</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>,</span> <span class='hs-conid'>Mode</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-68"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Panic</span>
<a name="line-69"></a>
<a name="line-70"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span>
<a name="line-71"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Word</span>
<a name="line-72"></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'>stderr</span><span class='hs-layout'>,</span> <span class='hs-varid'>stdout</span><span class='hs-layout'>,</span> <span class='hs-varid'>hFlush</span> <span class='hs-layout'>)</span>
<a name="line-73"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>FilePath</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{The @PprStyle@ data type}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="PprStyle"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PprStyle</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PprUser</span> <span class='hs-conid'>PrintUnqualified</span> <span class='hs-conid'>Depth</span>
<a name="line-4"></a>		<span class='hs-comment'>-- Pretty-print in a way that will make sense to the</span>
<a name="line-5"></a>		<span class='hs-comment'>-- ordinary user; must be very close to Haskell</span>
<a name="line-6"></a>		<span class='hs-comment'>-- syntax, etc.</span>
<a name="line-7"></a>		<span class='hs-comment'>-- Assumes printing tidied code: non-system names are</span>
<a name="line-8"></a>		<span class='hs-comment'>-- printed without uniques.</span>
<a name="line-9"></a>
<a name="line-10"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PprCode</span> <span class='hs-conid'>CodeStyle</span>
<a name="line-11"></a>		<span class='hs-comment'>-- Print code; either C or assembler</span>
<a name="line-12"></a>
<a name="line-13"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PprDump</span>	<span class='hs-comment'>-- For -ddump-foo; less verbose than PprDebug.</span>
<a name="line-14"></a>		<span class='hs-comment'>-- Does not assume tidied code: non-external names</span>
<a name="line-15"></a>		<span class='hs-comment'>-- are printed with uniques.</span>
<a name="line-16"></a>
<a name="line-17"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PprDebug</span>	<span class='hs-comment'>-- Full debugging output</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="CodeStyle"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CodeStyle</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CStyle</span>		<span class='hs-comment'>-- The format of labels differs for C and assembler</span>
<a name="line-20"></a>	       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>AsmStyle</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="Depth"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Depth</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AllTheWay</span>
<a name="line-23"></a>           <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PartWay</span> <span class='hs-conid'>Int</span>	<span class='hs-comment'>-- 0 =&gt; stop</span>
<a name="line-24"></a>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-27"></a><span class='hs-comment'>-- Printing original names</span>
<a name="line-28"></a>
<a name="line-29"></a><span class='hs-comment'>-- When printing code that contains original names, we need to map the</span>
<a name="line-30"></a><span class='hs-comment'>-- original names back to something the user understands.  This is the</span>
<a name="line-31"></a><span class='hs-comment'>-- purpose of the pair of functions that gets passed around</span>
<a name="line-32"></a><span class='hs-comment'>-- when rendering 'SDoc'.</span>
<a name="line-33"></a>
<a name="line-34"></a><a name="QueryQualifyName"></a><span class='hs-comment'>-- | given an /original/ name, this function tells you which module</span>
<a name="line-35"></a><a name="QueryQualifyName"></a><span class='hs-comment'>-- name it should be qualified with when printing for the user, if</span>
<a name="line-36"></a><a name="QueryQualifyName"></a><span class='hs-comment'>-- any.  For example, given @Control.Exception.catch@, which is in scope</span>
<a name="line-37"></a><a name="QueryQualifyName"></a><span class='hs-comment'>-- as @Exception.catch@, this fuction will return @Just "Exception"@.</span>
<a name="line-38"></a><a name="QueryQualifyName"></a><span class='hs-comment'>-- Note that the return value is a ModuleName, not a Module, because</span>
<a name="line-39"></a><a name="QueryQualifyName"></a><span class='hs-comment'>-- in source code, names are qualified by ModuleNames.</span>
<a name="line-40"></a><a name="QueryQualifyName"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>QueryQualifyName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Module</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>QualifyName</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="QualifyName"></a><span class='hs-comment'>-- See Note [Printing original names] in HscTypes</span>
<a name="line-43"></a><a name="QualifyName"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>QualifyName</span>                        <span class='hs-comment'>-- given P:M.T</span>
<a name="line-44"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameUnqual</span>                    <span class='hs-comment'>-- refer to it as "T"</span>
<a name="line-45"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NameQual</span> <span class='hs-conid'>ModuleName</span>           <span class='hs-comment'>-- refer to it as "X.T" for the supplied X</span>
<a name="line-46"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NameNotInScope1</span>               
<a name="line-47"></a>                <span class='hs-comment'>-- it is not in scope at all, but M.T is not bound in the current</span>
<a name="line-48"></a>                <span class='hs-comment'>-- scope, so we can refer to it as "M.T"</span>
<a name="line-49"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NameNotInScope2</span>
<a name="line-50"></a>                <span class='hs-comment'>-- it is not in scope at all, and M.T is already bound in the</span>
<a name="line-51"></a>                <span class='hs-comment'>-- current scope, so we must refer to it as "P:M.T"</span>
<a name="line-52"></a>
<a name="line-53"></a>
<a name="line-54"></a><a name="QueryQualifyModule"></a><span class='hs-comment'>-- | For a given module, we need to know whether to print it with</span>
<a name="line-55"></a><a name="QueryQualifyModule"></a><span class='hs-comment'>-- a package name to disambiguate it.</span>
<a name="line-56"></a><a name="QueryQualifyModule"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>QueryQualifyModule</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Module</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-57"></a>
<a name="line-58"></a><a name="PrintUnqualified"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PrintUnqualified</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>QueryQualifyName</span><span class='hs-layout'>,</span> <span class='hs-conid'>QueryQualifyModule</span><span class='hs-layout'>)</span>
<a name="line-59"></a>
<a name="line-60"></a><a name="alwaysQualifyNames"></a><span class='hs-definition'>alwaysQualifyNames</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QueryQualifyName</span>
<a name="line-61"></a><span class='hs-definition'>alwaysQualifyNames</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameQual</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="neverQualifyNames"></a><span class='hs-definition'>neverQualifyNames</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QueryQualifyName</span>
<a name="line-64"></a><span class='hs-definition'>neverQualifyNames</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameUnqual</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="alwaysQualifyModules"></a><span class='hs-definition'>alwaysQualifyModules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QueryQualifyModule</span>
<a name="line-67"></a><span class='hs-definition'>alwaysQualifyModules</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-68"></a>
<a name="line-69"></a><a name="neverQualifyModules"></a><span class='hs-definition'>neverQualifyModules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QueryQualifyModule</span>
<a name="line-70"></a><span class='hs-definition'>neverQualifyModules</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-71"></a>
<a name="line-72"></a><a name="alwaysQualify"></a><span class='hs-definition'>alwaysQualify</span><span class='hs-layout'>,</span> <span class='hs-varid'>neverQualify</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrintUnqualified</span>
<a name="line-73"></a><span class='hs-definition'>alwaysQualify</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>alwaysQualifyNames</span><span class='hs-layout'>,</span> <span class='hs-varid'>alwaysQualifyModules</span><span class='hs-layout'>)</span>
<a name="line-74"></a><a name="neverQualify"></a><span class='hs-definition'>neverQualify</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>neverQualifyNames</span><span class='hs-layout'>,</span>  <span class='hs-varid'>neverQualifyModules</span><span class='hs-layout'>)</span>
<a name="line-75"></a>
<a name="line-76"></a><a name="defaultUserStyle"></a><span class='hs-definition'>defaultUserStyle</span><span class='hs-layout'>,</span> <span class='hs-varid'>defaultDumpStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span>
<a name="line-77"></a>
<a name="line-78"></a><span class='hs-definition'>defaultUserStyle</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUserStyle</span> <span class='hs-varid'>alwaysQualify</span> <span class='hs-conid'>AllTheWay</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="defaultDumpStyle"></a><span class='hs-definition'>defaultDumpStyle</span> <span class='hs-keyglyph'>|</span>  <span class='hs-varid'>opt_PprStyle_Debug</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PprDebug</span>
<a name="line-81"></a>		 <span class='hs-keyglyph'>|</span>  <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PprDump</span>
<a name="line-82"></a>
<a name="line-83"></a><a name="mkErrStyle"></a><span class='hs-comment'>-- | Style for printing error messages</span>
<a name="line-84"></a><span class='hs-definition'>mkErrStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrintUnqualified</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PprStyle</span>
<a name="line-85"></a><span class='hs-definition'>mkErrStyle</span> <span class='hs-varid'>qual</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUserStyle</span> <span class='hs-varid'>qual</span> <span class='hs-layout'>(</span><span class='hs-conid'>PartWay</span> <span class='hs-varid'>opt_PprUserLength</span><span class='hs-layout'>)</span>
<a name="line-86"></a>
<a name="line-87"></a><a name="defaultErrStyle"></a><span class='hs-definition'>defaultErrStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span>
<a name="line-88"></a><span class='hs-comment'>-- Default style for error messages</span>
<a name="line-89"></a><span class='hs-comment'>-- It's a bit of a hack because it doesn't take into account what's in scope</span>
<a name="line-90"></a><span class='hs-comment'>-- Only used for desugarer warnings, and typechecker errors in interface sigs</span>
<a name="line-91"></a><span class='hs-definition'>defaultErrStyle</span> 
<a name="line-92"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>opt_PprStyle_Debug</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUserStyle</span> <span class='hs-varid'>alwaysQualify</span> <span class='hs-conid'>AllTheWay</span>
<a name="line-93"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUserStyle</span> <span class='hs-varid'>alwaysQualify</span> <span class='hs-layout'>(</span><span class='hs-conid'>PartWay</span> <span class='hs-varid'>opt_PprUserLength</span><span class='hs-layout'>)</span>
<a name="line-94"></a>
<a name="line-95"></a><a name="mkUserStyle"></a><span class='hs-definition'>mkUserStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrintUnqualified</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Depth</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PprStyle</span>
<a name="line-96"></a><span class='hs-definition'>mkUserStyle</span> <span class='hs-varid'>unqual</span> <span class='hs-varid'>depth</span>
<a name="line-97"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>opt_PprStyle_Debug</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PprDebug</span>
<a name="line-98"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PprUser</span> <span class='hs-varid'>unqual</span> <span class='hs-varid'>depth</span>
</pre>\end{code}

Orthogonal to the above printing styles are (possibly) some
command-line flags that affect printing (often carried with the
style).  The most likely ones are variations on how much type info is
shown.

The following test decides whether or not we are actually generating
code (either C or assembly), or generating interface files.

%************************************************************************
%*									*
\subsection{The @SDoc@ data type}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="SDoc"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="withPprStyle"></a><span class='hs-definition'>withPprStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-4"></a><span class='hs-definition'>withPprStyle</span> <span class='hs-varid'>sty</span> <span class='hs-varid'>d</span> <span class='hs-sel'>_sty'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="withPprStyleDoc"></a><span class='hs-definition'>withPprStyleDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-7"></a><span class='hs-definition'>withPprStyleDoc</span> <span class='hs-varid'>sty</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="pprDeeper"></a><span class='hs-definition'>pprDeeper</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-10"></a><span class='hs-definition'>pprDeeper</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>PartWay</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>text</span> <span class='hs-str'>"..."</span>
<a name="line-11"></a><span class='hs-definition'>pprDeeper</span> <span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-varid'>q</span> <span class='hs-layout'>(</span><span class='hs-conid'>PartWay</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-varid'>q</span> <span class='hs-layout'>(</span><span class='hs-conid'>PartWay</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-12"></a><span class='hs-definition'>pprDeeper</span> <span class='hs-varid'>d</span> <span class='hs-varid'>other_sty</span>        	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-varid'>other_sty</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="pprDeeperList"></a><span class='hs-definition'>pprDeeperList</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-15"></a><span class='hs-comment'>-- Truncate a list that list that is longer than the current depth</span>
<a name="line-16"></a><span class='hs-definition'>pprDeeperList</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ds</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-varid'>q</span> <span class='hs-layout'>(</span><span class='hs-conid'>PartWay</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-17"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span><span class='hs-varop'>==</span><span class='hs-num'>0</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>text</span> <span class='hs-str'>"..."</span>
<a name="line-18"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-num'>0</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-varid'>q</span> <span class='hs-layout'>(</span><span class='hs-conid'>PartWay</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-19"></a>  <span class='hs-keyword'>where</span>
<a name="line-20"></a>    <span class='hs-varid'>go</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-21"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>i</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-varid'>i</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>n</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"...."</span><span class='hs-keyglyph'>]</span>
<a name="line-22"></a>		<span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-conop'>:</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>ds</span>
<a name="line-23"></a>
<a name="line-24"></a><span class='hs-definition'>pprDeeperList</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>other_sty</span>
<a name="line-25"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>other_sty</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="pprSetDepth"></a><span class='hs-definition'>pprSetDepth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Depth</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-28"></a><span class='hs-definition'>pprSetDepth</span> <span class='hs-varid'>depth</span>  <span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-varid'>q</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-varid'>q</span> <span class='hs-varid'>depth</span><span class='hs-layout'>)</span>
<a name="line-29"></a><span class='hs-definition'>pprSetDepth</span> <span class='hs-sel'>_depth</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>other_sty</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>other_sty</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="getPprStyle"></a><span class='hs-definition'>getPprStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-32"></a><span class='hs-definition'>getPprStyle</span> <span class='hs-varid'>df</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>df</span> <span class='hs-varid'>sty</span> <span class='hs-varid'>sty</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="qualName"></a><span class='hs-definition'>qualName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>QueryQualifyName</span>
<a name="line-2"></a><span class='hs-definition'>qualName</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-layout'>(</span><span class='hs-varid'>qual_name</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span>  <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>qual_name</span> <span class='hs-varid'>m</span> <span class='hs-varid'>n</span>
<a name="line-3"></a><span class='hs-definition'>qualName</span> <span class='hs-sel'>_other</span>		           <span class='hs-varid'>m</span> <span class='hs-sel'>_n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameQual</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="qualModule"></a><span class='hs-definition'>qualModule</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>QueryQualifyModule</span>
<a name="line-6"></a><span class='hs-definition'>qualModule</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>qual_mod</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>qual_mod</span> <span class='hs-varid'>m</span>
<a name="line-7"></a><span class='hs-definition'>qualModule</span> <span class='hs-sel'>_other</span>                   <span class='hs-sel'>_m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="codeStyle"></a><span class='hs-definition'>codeStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-10"></a><span class='hs-definition'>codeStyle</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprCode</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-11"></a><span class='hs-definition'>codeStyle</span> <span class='hs-keyword'>_</span>		  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="asmStyle"></a><span class='hs-definition'>asmStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-14"></a><span class='hs-definition'>asmStyle</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprCode</span> <span class='hs-conid'>AsmStyle</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-15"></a><span class='hs-definition'>asmStyle</span> <span class='hs-sel'>_other</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="dumpStyle"></a><span class='hs-definition'>dumpStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-18"></a><span class='hs-definition'>dumpStyle</span> <span class='hs-conid'>PprDump</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-19"></a><span class='hs-definition'>dumpStyle</span> <span class='hs-sel'>_other</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="debugStyle"></a><span class='hs-definition'>debugStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-22"></a><span class='hs-definition'>debugStyle</span> <span class='hs-conid'>PprDebug</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-23"></a><span class='hs-definition'>debugStyle</span> <span class='hs-sel'>_other</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="userStyle"></a><span class='hs-definition'>userStyle</span> <span class='hs-keyglyph'>::</span>  <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-26"></a><span class='hs-definition'>userStyle</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprUser</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'>True</span>
<a name="line-27"></a><span class='hs-definition'>userStyle</span> <span class='hs-sel'>_other</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="ifPprDebug"></a><span class='hs-definition'>ifPprDebug</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>	  <span class='hs-comment'>-- Empty for non-debug style</span>
<a name="line-30"></a><span class='hs-definition'>ifPprDebug</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>PprDebug</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>
<a name="line-31"></a><span class='hs-definition'>ifPprDebug</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span>  	  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="printSDoc"></a><span class='hs-comment'>-- Unused [7/02 sof]</span>
<a name="line-2"></a><span class='hs-definition'>printSDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PprStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-3"></a><span class='hs-definition'>printSDoc</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-4"></a>  <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>printDoc</span> <span class='hs-conid'>PageMode</span> <span class='hs-varid'>stdout</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-5"></a>  <span class='hs-varid'>hFlush</span> <span class='hs-varid'>stdout</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="printErrs"></a><span class='hs-comment'>-- I'm not sure whether the direct-IO approach of Pretty.printDoc</span>
<a name="line-8"></a><span class='hs-comment'>-- above is better or worse than the put-big-string approach here</span>
<a name="line-9"></a><span class='hs-definition'>printErrs</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-10"></a><span class='hs-definition'>printErrs</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>printDoc</span> <span class='hs-conid'>PageMode</span> <span class='hs-varid'>stderr</span> <span class='hs-varid'>doc</span>
<a name="line-11"></a>		   <span class='hs-varid'>hFlush</span> <span class='hs-varid'>stderr</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="printDump"></a><span class='hs-definition'>printDump</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-14"></a><span class='hs-definition'>printDump</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hPrintDump</span> <span class='hs-varid'>stdout</span> <span class='hs-varid'>doc</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="hPrintDump"></a><span class='hs-definition'>hPrintDump</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-17"></a><span class='hs-definition'>hPrintDump</span> <span class='hs-varid'>h</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-18"></a>   <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>printDoc</span> <span class='hs-conid'>PageMode</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-varid'>better_doc</span> <span class='hs-varid'>defaultDumpStyle</span><span class='hs-layout'>)</span>
<a name="line-19"></a>   <span class='hs-varid'>hFlush</span> <span class='hs-varid'>h</span>
<a name="line-20"></a> <span class='hs-keyword'>where</span>
<a name="line-21"></a>   <span class='hs-varid'>better_doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doc</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>""</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="printForUser"></a><span class='hs-definition'>printForUser</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrintUnqualified</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-24"></a><span class='hs-definition'>printForUser</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>unqual</span> <span class='hs-varid'>doc</span> 
<a name="line-25"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>printDoc</span> <span class='hs-conid'>PageMode</span> <span class='hs-varid'>handle</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkUserStyle</span> <span class='hs-varid'>unqual</span> <span class='hs-conid'>AllTheWay</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="printForUserPartWay"></a><span class='hs-definition'>printForUserPartWay</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrintUnqualified</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-28"></a><span class='hs-definition'>printForUserPartWay</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>d</span> <span class='hs-varid'>unqual</span> <span class='hs-varid'>doc</span>
<a name="line-29"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>printDoc</span> <span class='hs-conid'>PageMode</span> <span class='hs-varid'>handle</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkUserStyle</span> <span class='hs-varid'>unqual</span> <span class='hs-layout'>(</span><span class='hs-conid'>PartWay</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="printForC"></a><span class='hs-comment'>-- printForC, printForAsm do what they sound like</span>
<a name="line-32"></a><span class='hs-definition'>printForC</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-33"></a><span class='hs-definition'>printForC</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>printDoc</span> <span class='hs-conid'>LeftMode</span> <span class='hs-varid'>handle</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprCode</span> <span class='hs-conid'>CStyle</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="printForAsm"></a><span class='hs-definition'>printForAsm</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-36"></a><span class='hs-definition'>printForAsm</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>printDoc</span> <span class='hs-conid'>LeftMode</span> <span class='hs-varid'>handle</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprCode</span> <span class='hs-conid'>AsmStyle</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="pprCode"></a><span class='hs-definition'>pprCode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CodeStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-39"></a><span class='hs-definition'>pprCode</span> <span class='hs-varid'>cs</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withPprStyle</span> <span class='hs-layout'>(</span><span class='hs-conid'>PprCode</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span> <span class='hs-varid'>d</span>
<a name="line-40"></a>
<a name="line-41"></a><a name="mkCodeStyle"></a><span class='hs-definition'>mkCodeStyle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CodeStyle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PprStyle</span>
<a name="line-42"></a><span class='hs-definition'>mkCodeStyle</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PprCode</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="showSDoc"></a><span class='hs-comment'>-- Can't make SDoc an instance of Show because SDoc is just a function type</span>
<a name="line-45"></a><span class='hs-comment'>-- However, Doc *is* an instance of Show</span>
<a name="line-46"></a><span class='hs-comment'>-- showSDoc just blasts it out as a string</span>
<a name="line-47"></a><span class='hs-definition'>showSDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-48"></a><span class='hs-definition'>showSDoc</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>showDocWith</span> <span class='hs-conid'>PageMode</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>defaultUserStyle</span><span class='hs-layout'>)</span>
<a name="line-49"></a>
<a name="line-50"></a><a name="showSDocOneLine"></a><span class='hs-comment'>-- This shows an SDoc, but on one line only. It's cheaper than a full</span>
<a name="line-51"></a><span class='hs-comment'>-- showSDoc, designed for when we're getting results like "Foo.bar"</span>
<a name="line-52"></a><span class='hs-comment'>-- and "foo{uniq strictness}" so we don't want fancy layout anyway.</span>
<a name="line-53"></a><span class='hs-definition'>showSDocOneLine</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-54"></a><span class='hs-definition'>showSDocOneLine</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>showDocWith</span> <span class='hs-conid'>PageMode</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>defaultUserStyle</span><span class='hs-layout'>)</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="showSDocForUser"></a><span class='hs-definition'>showSDocForUser</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrintUnqualified</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-57"></a><span class='hs-definition'>showSDocForUser</span> <span class='hs-varid'>unqual</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkUserStyle</span> <span class='hs-varid'>unqual</span> <span class='hs-conid'>AllTheWay</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="showSDocUnqual"></a><span class='hs-definition'>showSDocUnqual</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-60"></a><span class='hs-comment'>-- Only used in the gruesome isOperator</span>
<a name="line-61"></a><span class='hs-definition'>showSDocUnqual</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkUserStyle</span> <span class='hs-varid'>neverQualify</span> <span class='hs-conid'>AllTheWay</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="showsPrecSDoc"></a><span class='hs-definition'>showsPrecSDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ShowS</span>
<a name="line-64"></a><span class='hs-definition'>showsPrecSDoc</span> <span class='hs-varid'>p</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>defaultUserStyle</span><span class='hs-layout'>)</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="showSDocDump"></a><span class='hs-definition'>showSDocDump</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-67"></a><span class='hs-definition'>showSDocDump</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>showDocWith</span> <span class='hs-conid'>PageMode</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-conid'>PprDump</span><span class='hs-layout'>)</span>
<a name="line-68"></a>
<a name="line-69"></a><a name="showSDocDumpOneLine"></a><span class='hs-definition'>showSDocDumpOneLine</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-70"></a><span class='hs-definition'>showSDocDumpOneLine</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>showDocWith</span> <span class='hs-conid'>OneLineMode</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-conid'>PprDump</span><span class='hs-layout'>)</span>
<a name="line-71"></a>
<a name="line-72"></a><a name="showSDocDebug"></a><span class='hs-definition'>showSDocDebug</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-73"></a><span class='hs-definition'>showSDocDebug</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-conid'>PprDebug</span><span class='hs-layout'>)</span>
<a name="line-74"></a>
<a name="line-75"></a><a name="showPpr"></a><span class='hs-definition'>showPpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-76"></a><span class='hs-definition'>showPpr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showSDoc</span> <span class='hs-varop'>.</span> <span class='hs-varid'>ppr</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="docToSDoc"></a><span class='hs-definition'>docToSDoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-2"></a><span class='hs-definition'>docToSDoc</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>d</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="empty"></a><span class='hs-definition'>empty</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>
<a name="line-5"></a><a name="char"></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'>SDoc</span>
<a name="line-6"></a><a name="text"></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'>SDoc</span>
<a name="line-7"></a><a name="ftext"></a><span class='hs-definition'>ftext</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-8"></a><a name="ptext"></a><span class='hs-definition'>ptext</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LitString</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-9"></a><a name="int"></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'>SDoc</span>
<a name="line-10"></a><a name="integer"></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'>SDoc</span>
<a name="line-11"></a><a name="float"></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'>SDoc</span>
<a name="line-12"></a><a name="double"></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'>SDoc</span>
<a name="line-13"></a><a name="rational"></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'>SDoc</span>
<a name="line-14"></a>
<a name="line-15"></a><span class='hs-definition'>empty</span> <span class='hs-sel'>_sty</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-16"></a><span class='hs-definition'>char</span> <span class='hs-varid'>c</span> <span class='hs-sel'>_sty</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>char</span> <span class='hs-varid'>c</span>
<a name="line-17"></a><span class='hs-definition'>text</span> <span class='hs-varid'>s</span> <span class='hs-sel'>_sty</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>text</span> <span class='hs-varid'>s</span>
<a name="line-18"></a><span class='hs-definition'>ftext</span> <span class='hs-varid'>s</span> <span class='hs-sel'>_sty</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>ftext</span> <span class='hs-varid'>s</span>
<a name="line-19"></a><span class='hs-definition'>ptext</span> <span class='hs-varid'>s</span> <span class='hs-sel'>_sty</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>ptext</span> <span class='hs-varid'>s</span>
<a name="line-20"></a><span class='hs-definition'>int</span> <span class='hs-varid'>n</span> <span class='hs-sel'>_sty</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>int</span> <span class='hs-varid'>n</span>
<a name="line-21"></a><span class='hs-definition'>integer</span> <span class='hs-varid'>n</span> <span class='hs-sel'>_sty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>integer</span> <span class='hs-varid'>n</span>
<a name="line-22"></a><span class='hs-definition'>float</span> <span class='hs-varid'>n</span> <span class='hs-sel'>_sty</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>float</span> <span class='hs-varid'>n</span>
<a name="line-23"></a><span class='hs-definition'>double</span> <span class='hs-varid'>n</span> <span class='hs-sel'>_sty</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>double</span> <span class='hs-varid'>n</span>
<a name="line-24"></a><span class='hs-definition'>rational</span> <span class='hs-varid'>n</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>rational</span> <span class='hs-varid'>n</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="parens"></a><span class='hs-definition'>parens</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> <span class='hs-varid'>quotes</span><span class='hs-layout'>,</span> <span class='hs-varid'>doubleQuotes</span><span class='hs-layout'>,</span> <span class='hs-varid'>angleBrackets</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-27"></a>
<a name="line-28"></a><span class='hs-definition'>parens</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-29"></a><a name="braces"></a><span class='hs-definition'>braces</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>braces</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-30"></a><a name="brackets"></a><span class='hs-definition'>brackets</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>brackets</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-31"></a><a name="doubleQuotes"></a><span class='hs-definition'>doubleQuotes</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>doubleQuotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-32"></a><a name="angleBrackets"></a><span class='hs-definition'>angleBrackets</span> <span class='hs-varid'>d</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'&lt;'</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'>char</span> <span class='hs-chr'>'&gt;'</span>
<a name="line-33"></a>
<a name="line-34"></a><a name="cparen"></a><span class='hs-definition'>cparen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-definition'>cparen</span> <span class='hs-varid'>b</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>cparen</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="quotes"></a><span class='hs-comment'>-- quotes encloses something in single quotes...</span>
<a name="line-39"></a><span class='hs-comment'>-- but it omits them if the thing ends in a single quote</span>
<a name="line-40"></a><span class='hs-comment'>-- so that we don't get `foo''.  Instead we just have foo'.</span>
<a name="line-41"></a><span class='hs-definition'>quotes</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>show</span> <span class='hs-varid'>pp_d</span> <span class='hs-keyword'>of</span>
<a name="line-42"></a>		 <span class='hs-layout'>(</span><span class='hs-chr'>'\''</span> <span class='hs-conop'>:</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pp_d</span>
<a name="line-43"></a>		 <span class='hs-sel'>_other</span>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>quotes</span> <span class='hs-varid'>pp_d</span>
<a name="line-44"></a>	     <span class='hs-keyword'>where</span>
<a name="line-45"></a>	       <span class='hs-varid'>pp_d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="semi"></a><span class='hs-definition'>semi</span><span class='hs-layout'>,</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span> <span class='hs-varid'>colon</span><span class='hs-layout'>,</span> <span class='hs-varid'>equals</span><span class='hs-layout'>,</span> <span class='hs-varid'>space</span><span class='hs-layout'>,</span> <span class='hs-varid'>dcolon</span><span class='hs-layout'>,</span> <span class='hs-varid'>arrow</span><span class='hs-layout'>,</span> <span class='hs-varid'>underscore</span><span class='hs-layout'>,</span> <span class='hs-varid'>dot</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>
<a name="line-48"></a><a name="lparen"></a><span class='hs-definition'>lparen</span><span class='hs-layout'>,</span> <span class='hs-varid'>rparen</span><span class='hs-layout'>,</span> <span class='hs-varid'>lbrack</span><span class='hs-layout'>,</span> <span class='hs-varid'>rbrack</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-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>
<a name="line-49"></a>
<a name="line-50"></a><span class='hs-definition'>semi</span> <span class='hs-sel'>_sty</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>semi</span>
<a name="line-51"></a><a name="comma"></a><span class='hs-definition'>comma</span> <span class='hs-sel'>_sty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>comma</span>
<a name="line-52"></a><a name="colon"></a><span class='hs-definition'>colon</span> <span class='hs-sel'>_sty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>colon</span>
<a name="line-53"></a><a name="equals"></a><span class='hs-definition'>equals</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>equals</span>
<a name="line-54"></a><a name="space"></a><span class='hs-definition'>space</span> <span class='hs-sel'>_sty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>space</span>
<a name="line-55"></a><a name="dcolon"></a><span class='hs-definition'>dcolon</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"::"</span><span class='hs-layout'>)</span>
<a name="line-56"></a><a name="arrow"></a><span class='hs-definition'>arrow</span>  <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"-&gt;"</span><span class='hs-layout'>)</span>
<a name="line-57"></a><a name="underscore"></a><span class='hs-definition'>underscore</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'_'</span>
<a name="line-58"></a><a name="dot"></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-59"></a><span class='hs-definition'>lparen</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>lparen</span>
<a name="line-60"></a><a name="rparen"></a><span class='hs-definition'>rparen</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>rparen</span>
<a name="line-61"></a><a name="lbrack"></a><span class='hs-definition'>lbrack</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>lbrack</span>
<a name="line-62"></a><a name="rbrack"></a><span class='hs-definition'>rbrack</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>rbrack</span>
<a name="line-63"></a><a name="lbrace"></a><span class='hs-definition'>lbrace</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>lbrace</span>
<a name="line-64"></a><a name="rbrace"></a><span class='hs-definition'>rbrace</span> <span class='hs-sel'>_sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>rbrace</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="nest"></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'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-67"></a><a name="<>"></a><span class='hs-comment'>-- ^ Indent 'SDoc' some specified amount</span>
<a name="line-68"></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'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-69"></a><a name="<+>"></a><span class='hs-comment'>-- ^ Join two 'SDoc' together horizontally without a gap</span>
<a name="line-70"></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'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-71"></a><a name="$$"></a><span class='hs-comment'>-- ^ Join two 'SDoc' together horizontally with a gap between them</span>
<a name="line-72"></a><span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-73"></a><a name="$+$"></a><span class='hs-comment'>-- ^ Join two 'SDoc' together vertically; if there is </span>
<a name="line-74"></a><span class='hs-comment'>-- no vertical overlap it "dovetails" the two onto one line</span>
<a name="line-75"></a><span class='hs-layout'>(</span><span class='hs-varop'>$+$</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-76"></a><span class='hs-comment'>-- ^ Join two 'SDoc' together vertically</span>
<a name="line-77"></a>
<a name="line-78"></a><span class='hs-definition'>nest</span> <span class='hs-varid'>n</span> <span class='hs-varid'>d</span> <span class='hs-varid'>sty</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>nest</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-79"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>)</span> <span class='hs-varid'>d1</span> <span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pretty</span><span class='hs-varop'>.&lt;&gt;</span><span class='hs-layout'>)</span>  <span class='hs-layout'>(</span><span class='hs-varid'>d1</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-80"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;+&gt;</span><span class='hs-layout'>)</span> <span class='hs-varid'>d1</span> <span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pretty</span><span class='hs-varop'>.&lt;+&gt;</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>d1</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-81"></a><span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span> <span class='hs-varid'>d1</span> <span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pretty</span><span class='hs-varop'>.$$</span><span class='hs-layout'>)</span>  <span class='hs-layout'>(</span><span class='hs-varid'>d1</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-82"></a><span class='hs-layout'>(</span><span class='hs-varop'>$+$</span><span class='hs-layout'>)</span> <span class='hs-varid'>d1</span> <span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pretty</span><span class='hs-varop'>.$+$</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>d1</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-83"></a>
<a name="line-84"></a><a name="hcat"></a><span class='hs-definition'>hcat</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-85"></a><a name="hsep"></a><span class='hs-comment'>-- ^ Concatenate 'SDoc' horizontally</span>
<a name="line-86"></a><span class='hs-definition'>hsep</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-87"></a><a name="vcat"></a><span class='hs-comment'>-- ^ Concatenate 'SDoc' horizontally with a space between each one</span>
<a name="line-88"></a><span class='hs-definition'>vcat</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-89"></a><a name="sep"></a><span class='hs-comment'>-- ^ Concatenate 'SDoc' vertically with dovetailing</span>
<a name="line-90"></a><span class='hs-definition'>sep</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-91"></a><a name="cat"></a><span class='hs-comment'>-- ^ Separate: is either like 'hsep' or like 'vcat', depending on what fits</span>
<a name="line-92"></a><span class='hs-definition'>cat</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-93"></a><a name="fsep"></a><span class='hs-comment'>-- ^ Catenate: is either like 'hcat' or like 'vcat', depending on what fits</span>
<a name="line-94"></a><span class='hs-definition'>fsep</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-95"></a><a name="fcat"></a><span class='hs-comment'>-- ^ A paragraph-fill combinator. It's much like sep, only it</span>
<a name="line-96"></a><span class='hs-comment'>-- keeps fitting things on one line until it can't fit any more.</span>
<a name="line-97"></a><span class='hs-definition'>fcat</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-98"></a><span class='hs-comment'>-- ^ This behaves like 'fsep', but it uses '&lt;&gt;' for horizontal conposition rather than '&lt;+&gt;'</span>
<a name="line-99"></a>
<a name="line-100"></a>
<a name="line-101"></a><span class='hs-definition'>hcat</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>hcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span><span class='hs-keyglyph'>]</span>
<a name="line-102"></a><span class='hs-definition'>hsep</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>hsep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span><span class='hs-keyglyph'>]</span>
<a name="line-103"></a><span class='hs-definition'>vcat</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span><span class='hs-keyglyph'>]</span>
<a name="line-104"></a><span class='hs-definition'>sep</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>sty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>sep</span>  <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span><span class='hs-keyglyph'>]</span>
<a name="line-105"></a><span class='hs-definition'>cat</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>sty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>cat</span>  <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span><span class='hs-keyglyph'>]</span>
<a name="line-106"></a><span class='hs-definition'>fsep</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>fsep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span><span class='hs-keyglyph'>]</span>
<a name="line-107"></a><span class='hs-definition'>fcat</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>fcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span><span class='hs-keyglyph'>]</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="hang"></a><span class='hs-definition'>hang</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>  <span class='hs-comment'>-- ^ The header</span>
<a name="line-110"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>  <span class='hs-comment'>-- ^ Amount to indent the hung body</span>
<a name="line-111"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-comment'>-- ^ The hung body, indented and placed below the header</span>
<a name="line-112"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-113"></a><span class='hs-definition'>hang</span> <span class='hs-varid'>d1</span> <span class='hs-varid'>n</span> <span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pretty</span><span class='hs-varop'>.</span><span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>d1</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>d2</span> <span class='hs-varid'>sty</span><span class='hs-layout'>)</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="punctuate"></a><span class='hs-definition'>punctuate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>   <span class='hs-comment'>-- ^ The punctuation</span>
<a name="line-116"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ The list that will have punctuation added between every adjacent pair of elements</span>
<a name="line-117"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SDoc</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ Punctuated list</span>
<a name="line-118"></a><span class='hs-definition'>punctuate</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-119"></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-varid'>go</span> <span class='hs-varid'>d</span> <span class='hs-varid'>ds</span>
<a name="line-120"></a>		   <span class='hs-keyword'>where</span>
<a name="line-121"></a>		     <span class='hs-varid'>go</span> <span class='hs-varid'>d</span> <span class='hs-conid'>[]</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-122"></a>		     <span class='hs-varid'>go</span> <span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span><span class='hs-conop'>:</span><span class='hs-varid'>es</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'>go</span> <span class='hs-varid'>e</span> <span class='hs-varid'>es</span>
<a name="line-123"></a>
<a name="line-124"></a><a name="ppWhen"></a><span class='hs-definition'>ppWhen</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppUnless</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-125"></a><span class='hs-definition'>ppWhen</span> <span class='hs-conid'>True</span>  <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doc</span>
<a name="line-126"></a><span class='hs-definition'>ppWhen</span> <span class='hs-conid'>False</span> <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-127"></a>
<a name="line-128"></a><a name="ppUnless"></a><span class='hs-definition'>ppUnless</span> <span class='hs-conid'>True</span>  <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-129"></a><span class='hs-definition'>ppUnless</span> <span class='hs-conid'>False</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doc</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection[Outputable-class]{The @Outputable@ class}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- | Class designating that some type has an 'SDoc' representation</span>
<a name="line-2"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-3"></a>	<span class='hs-varid'>ppr</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>True</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"True"</span><span class='hs-layout'>)</span>
<a name="line-3"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"False"</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>where</span>
<a name="line-6"></a>   <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>int</span> <span class='hs-varid'>n</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Word16</span> <span class='hs-keyword'>where</span>
<a name="line-9"></a>   <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>integer</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>n</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Word32</span> <span class='hs-keyword'>where</span>
<a name="line-12"></a>   <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>integer</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>n</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Word</span> <span class='hs-keyword'>where</span>
<a name="line-15"></a>   <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>integer</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>n</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>()</span> <span class='hs-keyword'>where</span>
<a name="line-18"></a>   <span class='hs-varid'>ppr</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"()"</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Outputable</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-21"></a>    <span class='hs-varid'>ppr</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>brackets</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsep</span> <span class='hs-layout'>(</span><span class='hs-varid'>punctuate</span> <span class='hs-varid'>comma</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Outputable</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-24"></a>    <span class='hs-varid'>ppr</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'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>y</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Outputable</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-27"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Nothing"</span><span class='hs-layout'>)</span>
<a name="line-28"></a>  <span class='hs-varid'>ppr</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'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Just"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span>
<a name="line-29"></a>
<a name="line-30"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Outputable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-31"></a>  <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Left"</span><span class='hs-layout'>)</span>  <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span>
<a name="line-32"></a>  <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Right"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>y</span>
<a name="line-33"></a>
<a name="line-34"></a><span class='hs-comment'>-- ToDo: may not be used</span>
<a name="line-35"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Outputable</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-36"></a>    <span class='hs-varid'>ppr</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>
<a name="line-37"></a>      <span class='hs-varid'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-38"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>y</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-39"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-40"></a>
<a name="line-41"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-42"></a>	 <span class='hs-conid'>Outputable</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-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-43"></a>    <span class='hs-varid'>ppr</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-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-44"></a>      <span class='hs-varid'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-45"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>b</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-46"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-47"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>d</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-48"></a>
<a name="line-49"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-50"></a>	 <span class='hs-conid'>Outputable</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-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-51"></a>    <span class='hs-varid'>ppr</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-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-52"></a>      <span class='hs-varid'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-53"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>b</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-54"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-55"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>d</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-56"></a>		   <span class='hs-varid'>ppr</span> <span class='hs-varid'>e</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-57"></a>
<a name="line-58"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>FastString</span> <span class='hs-keyword'>where</span>
<a name="line-59"></a>    <span class='hs-varid'>ppr</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ftext</span> <span class='hs-varid'>fs</span>		<span class='hs-comment'>-- Prints an unadorned string,</span>
<a name="line-60"></a>				<span class='hs-comment'>-- no double quotes or anything</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{The @OutputableBndr@ class}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="BindingSite"></a><span class='hs-comment'>-- | 'BindingSite' is used to tell the thing that prints binder what</span>
<a name="line-2"></a><a name="BindingSite"></a><span class='hs-comment'>-- language construct is binding the identifier.  This can be used</span>
<a name="line-3"></a><a name="BindingSite"></a><span class='hs-comment'>-- to decide how much info to print.</span>
<a name="line-4"></a><a name="BindingSite"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>BindingSite</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LambdaBind</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CaseBind</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>LetBind</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="OutputableBndr"></a><span class='hs-comment'>-- | When we print a binder, we often want to print its type too.</span>
<a name="line-7"></a><a name="OutputableBndr"></a><span class='hs-comment'>-- The @OutputableBndr@ class encapsulates this idea.</span>
<a name="line-8"></a><a name="OutputableBndr"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>OutputableBndr</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-9"></a>   <span class='hs-varid'>pprBndr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BindingSite</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-10"></a>   <span class='hs-varid'>pprBndr</span> <span class='hs-sel'>_b</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Random printing helpers}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- We have 31-bit Chars and will simply use Show instances of Char and String.</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="pprHsChar"></a><span class='hs-comment'>-- | Special combinator for showing character literals.</span>
<a name="line-4"></a><span class='hs-definition'>pprHsChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-5"></a><span class='hs-definition'>pprHsChar</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;</span> <span class='hs-chr'>'\x10ffff'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'\\'</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-6"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</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'>c</span><span class='hs-layout'>)</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="pprHsString"></a><span class='hs-comment'>-- | Special combinator for showing string literals.</span>
<a name="line-9"></a><span class='hs-definition'>pprHsString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-10"></a><span class='hs-definition'>pprHsString</span> <span class='hs-varid'>fs</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-layout'>(</span><span class='hs-varid'>unpackFS</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="pprPrefixVar"></a><span class='hs-comment'>---------------------</span>
<a name="line-13"></a><span class='hs-comment'>-- Put a name in parens if it's an operator</span>
<a name="line-14"></a><span class='hs-definition'>pprPrefixVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-15"></a><span class='hs-definition'>pprPrefixVar</span> <span class='hs-varid'>is_operator</span> <span class='hs-varid'>pp_v</span>
<a name="line-16"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>is_operator</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>parens</span> <span class='hs-varid'>pp_v</span>
<a name="line-17"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>pp_v</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="pprInfixVar"></a><span class='hs-comment'>-- Put a name in backquotes if it's not an operator</span>
<a name="line-20"></a><span class='hs-definition'>pprInfixVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-21"></a><span class='hs-definition'>pprInfixVar</span> <span class='hs-varid'>is_operator</span> <span class='hs-varid'>pp_v</span> 
<a name="line-22"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>is_operator</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pp_v</span>
<a name="line-23"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'`'</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>pp_v</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'`'</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="pprHsVar"></a><span class='hs-comment'>---------------------</span>
<a name="line-26"></a><span class='hs-comment'>-- pprHsVar and pprHsInfix use the gruesome isOperator, which</span>
<a name="line-27"></a><span class='hs-comment'>-- in turn uses (showSDoc (ppr v)), rather than isSymOcc (getOccName v).</span>
<a name="line-28"></a><span class='hs-comment'>-- Reason: it means that pprHsVar doesn't need a NamedThing context,</span>
<a name="line-29"></a><span class='hs-comment'>--         which none of the HsSyn printing functions do</span>
<a name="line-30"></a><span class='hs-definition'>pprHsVar</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprHsInfix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-31"></a><span class='hs-definition'>pprHsVar</span>   <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPrefixVar</span> <span class='hs-layout'>(</span><span class='hs-varid'>isOperator</span> <span class='hs-varid'>pp_v</span><span class='hs-layout'>)</span> <span class='hs-varid'>pp_v</span>  
<a name="line-32"></a>	     <span class='hs-keyword'>where</span> <span class='hs-varid'>pp_v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>v</span>
<a name="line-33"></a><a name="pprHsInfix"></a><span class='hs-definition'>pprHsInfix</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprInfixVar</span>  <span class='hs-layout'>(</span><span class='hs-varid'>isOperator</span> <span class='hs-varid'>pp_v</span><span class='hs-layout'>)</span> <span class='hs-varid'>pp_v</span>
<a name="line-34"></a>	     <span class='hs-keyword'>where</span> <span class='hs-varid'>pp_v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>v</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="isOperator"></a><span class='hs-definition'>isOperator</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-37"></a><span class='hs-definition'>isOperator</span> <span class='hs-varid'>ppr_v</span> 
<a name="line-38"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>showSDocUnqual</span> <span class='hs-varid'>ppr_v</span> <span class='hs-keyword'>of</span>
<a name="line-39"></a>        <span class='hs-layout'>(</span><span class='hs-chr'>'('</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>              <span class='hs-comment'>-- (), (,) etc</span>
<a name="line-40"></a>        <span class='hs-layout'>(</span><span class='hs-chr'>'['</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>              <span class='hs-comment'>-- []</span>
<a name="line-41"></a>        <span class='hs-layout'>(</span><span class='hs-chr'>'$'</span><span class='hs-conop'>:</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isAlpha</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>    <span class='hs-comment'>-- Don't treat $d as an operator</span>
<a name="line-42"></a>        <span class='hs-layout'>(</span><span class='hs-chr'>':'</span><span class='hs-conop'>:</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isAlpha</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>    <span class='hs-comment'>-- Don't treat :T as an operator</span>
<a name="line-43"></a>        <span class='hs-layout'>(</span><span class='hs-chr'>'_'</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>              <span class='hs-comment'>-- Not an operator</span>
<a name="line-44"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isAlpha</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>    <span class='hs-comment'>-- Starts with non-alpha</span>
<a name="line-45"></a>        <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="pprFastFilePath"></a><span class='hs-definition'>pprFastFilePath</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-48"></a><span class='hs-definition'>pprFastFilePath</span> <span class='hs-varid'>path</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-varop'>$</span> <span class='hs-varid'>normalise</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unpackFS</span> <span class='hs-varid'>path</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Other helper functions}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="pprWithCommas"></a><span class='hs-definition'>pprWithCommas</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ The pretty printing function to use</span>
<a name="line-2"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>         <span class='hs-comment'>-- ^ The things to be pretty printed</span>
<a name="line-3"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>        <span class='hs-comment'>-- ^ 'SDoc' where the things have been pretty printed,</span>
<a name="line-4"></a>                             <span class='hs-comment'>-- comma-separated and finally packed into a paragraph.</span>
<a name="line-5"></a><span class='hs-definition'>pprWithCommas</span> <span class='hs-varid'>pp</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fsep</span> <span class='hs-layout'>(</span><span class='hs-varid'>punctuate</span> <span class='hs-varid'>comma</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>pp</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="interppSP"></a><span class='hs-comment'>-- | Returns the seperated concatenation of the pretty printed things.</span>
<a name="line-8"></a><span class='hs-definition'>interppSP</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</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'>SDoc</span>
<a name="line-9"></a><span class='hs-definition'>interppSP</span>  <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="interpp'SP"></a><span class='hs-comment'>-- | Returns the comma-seperated concatenation of the pretty printed things.</span>
<a name="line-12"></a><span class='hs-definition'>interpp'SP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</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'>SDoc</span>
<a name="line-13"></a><span class='hs-definition'>interpp'SP</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-layout'>(</span><span class='hs-varid'>punctuate</span> <span class='hs-varid'>comma</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="pprQuotedList"></a><span class='hs-comment'>-- | Returns the comma-seperated concatenation of the quoted pretty printed things.</span>
<a name="line-16"></a><span class='hs-comment'>--</span>
<a name="line-17"></a><span class='hs-comment'>-- &gt; [x,y,z]  ==&gt;  `x', `y', `z'</span>
<a name="line-18"></a><span class='hs-definition'>pprQuotedList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</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'>SDoc</span>
<a name="line-19"></a><span class='hs-definition'>pprQuotedList</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsep</span> <span class='hs-layout'>(</span><span class='hs-varid'>punctuate</span> <span class='hs-varid'>comma</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>quotes</span> <span class='hs-varop'>.</span> <span class='hs-varid'>ppr</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Printing numbers verbally}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="speakNth"></a><span class='hs-comment'>-- | Converts an integer to a verbal index:</span>
<a name="line-2"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><span class='hs-comment'>-- &gt; speakNth 1 = text "first"</span>
<a name="line-4"></a><span class='hs-comment'>-- &gt; speakNth 5 = text "fifth"</span>
<a name="line-5"></a><span class='hs-comment'>-- &gt; speakNth 21 = text "21st"</span>
<a name="line-6"></a><span class='hs-definition'>speakNth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-7"></a><span class='hs-definition'>speakNth</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"first"</span><span class='hs-layout'>)</span>
<a name="line-8"></a><span class='hs-definition'>speakNth</span> <span class='hs-num'>2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"second"</span><span class='hs-layout'>)</span>
<a name="line-9"></a><span class='hs-definition'>speakNth</span> <span class='hs-num'>3</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"third"</span><span class='hs-layout'>)</span>
<a name="line-10"></a><span class='hs-definition'>speakNth</span> <span class='hs-num'>4</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"fourth"</span><span class='hs-layout'>)</span>
<a name="line-11"></a><span class='hs-definition'>speakNth</span> <span class='hs-num'>5</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"fifth"</span><span class='hs-layout'>)</span>
<a name="line-12"></a><span class='hs-definition'>speakNth</span> <span class='hs-num'>6</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"sixth"</span><span class='hs-layout'>)</span>
<a name="line-13"></a><span class='hs-definition'>speakNth</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hcat</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>int</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span> <span class='hs-varid'>suffix</span> <span class='hs-keyglyph'>]</span>
<a name="line-14"></a>  <span class='hs-keyword'>where</span>
<a name="line-15"></a>    <span class='hs-varid'>suffix</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>20</span>       <span class='hs-keyglyph'>=</span> <span class='hs-str'>"th"</span>	<span class='hs-comment'>-- 11,12,13 are non-std</span>
<a name="line-16"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>last_dig</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"st"</span>
<a name="line-17"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>last_dig</span> <span class='hs-varop'>==</span> <span class='hs-num'>2</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"nd"</span>
<a name="line-18"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>last_dig</span> <span class='hs-varop'>==</span> <span class='hs-num'>3</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"rd"</span>
<a name="line-19"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>     <span class='hs-keyglyph'>=</span> <span class='hs-str'>"th"</span>
<a name="line-20"></a>
<a name="line-21"></a>    <span class='hs-varid'>last_dig</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span> <span class='hs-varop'>`rem`</span> <span class='hs-num'>10</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="speakN"></a><span class='hs-comment'>-- | Converts an integer to a verbal multiplicity:</span>
<a name="line-24"></a><span class='hs-comment'>-- </span>
<a name="line-25"></a><span class='hs-comment'>-- &gt; speakN 0 = text "none"</span>
<a name="line-26"></a><span class='hs-comment'>-- &gt; speakN 5 = text "five"</span>
<a name="line-27"></a><span class='hs-comment'>-- &gt; speakN 10 = text "10"</span>
<a name="line-28"></a><span class='hs-definition'>speakN</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-29"></a><span class='hs-definition'>speakN</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"none"</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- E.g.  "he has none"</span>
<a name="line-30"></a><span class='hs-definition'>speakN</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"one"</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- E.g.  "he has one"</span>
<a name="line-31"></a><span class='hs-definition'>speakN</span> <span class='hs-num'>2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"two"</span><span class='hs-layout'>)</span>
<a name="line-32"></a><span class='hs-definition'>speakN</span> <span class='hs-num'>3</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"three"</span><span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-definition'>speakN</span> <span class='hs-num'>4</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"four"</span><span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-definition'>speakN</span> <span class='hs-num'>5</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"five"</span><span class='hs-layout'>)</span>
<a name="line-35"></a><span class='hs-definition'>speakN</span> <span class='hs-num'>6</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"six"</span><span class='hs-layout'>)</span>
<a name="line-36"></a><span class='hs-definition'>speakN</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>int</span> <span class='hs-varid'>n</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="speakNOf"></a><span class='hs-comment'>-- | Converts an integer and object description to a statement about the</span>
<a name="line-39"></a><span class='hs-comment'>-- multiplicity of those objects:</span>
<a name="line-40"></a><span class='hs-comment'>--</span>
<a name="line-41"></a><span class='hs-comment'>-- &gt; speakNOf 0 (text "melon") = text "no melons"</span>
<a name="line-42"></a><span class='hs-comment'>-- &gt; speakNOf 1 (text "melon") = text "one melon"</span>
<a name="line-43"></a><span class='hs-comment'>-- &gt; speakNOf 3 (text "melon") = text "three melons"</span>
<a name="line-44"></a><span class='hs-definition'>speakNOf</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-45"></a><span class='hs-definition'>speakNOf</span> <span class='hs-num'>0</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"no"</span><span class='hs-layout'>)</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'>char</span> <span class='hs-chr'>'s'</span>
<a name="line-46"></a><span class='hs-definition'>speakNOf</span> <span class='hs-num'>1</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"one"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>d</span>			<span class='hs-comment'>-- E.g. "one argument"</span>
<a name="line-47"></a><span class='hs-definition'>speakNOf</span> <span class='hs-varid'>n</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>speakN</span> <span class='hs-varid'>n</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'>char</span> <span class='hs-chr'>'s'</span>		<span class='hs-comment'>-- E.g. "three arguments"</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="speakNTimes"></a><span class='hs-comment'>-- | Converts a strictly positive integer into a number of times:</span>
<a name="line-50"></a><span class='hs-comment'>--</span>
<a name="line-51"></a><span class='hs-comment'>-- &gt; speakNTimes 1 = text "once"</span>
<a name="line-52"></a><span class='hs-comment'>-- &gt; speakNTimes 2 = text "twice"</span>
<a name="line-53"></a><span class='hs-comment'>-- &gt; speakNTimes 4 = text "4 times"</span>
<a name="line-54"></a><span class='hs-definition'>speakNTimes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-comment'>{- &gt;=1 -}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-55"></a><span class='hs-definition'>speakNTimes</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>t</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span> 	   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"once"</span><span class='hs-layout'>)</span>
<a name="line-56"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-varid'>t</span> <span class='hs-varop'>==</span> <span class='hs-num'>2</span> 	   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"twice"</span><span class='hs-layout'>)</span>
<a name="line-57"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>speakN</span> <span class='hs-varid'>t</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"times"</span><span class='hs-layout'>)</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="plural"></a><span class='hs-comment'>-- | Determines the pluralisation suffix appropriate for the length of a list:</span>
<a name="line-60"></a><span class='hs-comment'>--</span>
<a name="line-61"></a><span class='hs-comment'>-- &gt; plural [] = char 's'</span>
<a name="line-62"></a><span class='hs-comment'>-- &gt; plural ["Hello"] = empty</span>
<a name="line-63"></a><span class='hs-comment'>-- &gt; plural ["Hello", "World"] = char 's'</span>
<a name="line-64"></a><span class='hs-definition'>plural</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'>SDoc</span>
<a name="line-65"></a><span class='hs-definition'>plural</span> <span class='hs-keyglyph'>[</span><span class='hs-keyword'>_</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>  <span class='hs-comment'>-- a bit frightening, but there you are</span>
<a name="line-66"></a><span class='hs-definition'>plural</span> <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'s'</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Error handling}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="pprPanic"></a><span class='hs-definition'>pprPanic</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-2"></a><a name="pprPgmError"></a><span class='hs-comment'>-- ^ Throw an exception saying "bug in GHC"</span>
<a name="line-3"></a><span class='hs-definition'>pprPgmError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-4"></a><a name="pprTrace"></a><span class='hs-comment'>-- ^ Throw an exception saying "bug in pgm being compiled" (used for unusual program errors)</span>
<a name="line-5"></a><span class='hs-definition'>pprTrace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-6"></a><span class='hs-comment'>-- ^ If debug output is on, show some 'SDoc' on the screen</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-definition'>pprPanic</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprAndThen</span> <span class='hs-varid'>panic</span>
<a name="line-9"></a>
<a name="line-10"></a><span class='hs-definition'>pprPgmError</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprAndThen</span> <span class='hs-varid'>pgmError</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-definition'>pprTrace</span> <span class='hs-varid'>str</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>x</span>
<a name="line-13"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>opt_NoDebugOutput</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span>
<a name="line-14"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprAndThen</span> <span class='hs-varid'>trace</span> <span class='hs-varid'>str</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>x</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="pprPanicFastInt"></a><span class='hs-definition'>pprPanicFastInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FastInt</span>
<a name="line-17"></a><span class='hs-comment'>-- ^ Specialization of pprPanic that can be safely used with 'FastInt'</span>
<a name="line-18"></a><span class='hs-definition'>pprPanicFastInt</span> <span class='hs-varid'>heading</span> <span class='hs-varid'>pretty_msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panicFastInt</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-conid'>PprDebug</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-19"></a>			     <span class='hs-keyword'>where</span>
<a name="line-20"></a>			       <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-varid'>heading</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>pretty_msg</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="pprAndThen"></a><span class='hs-definition'>pprAndThen</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-23"></a><span class='hs-definition'>pprAndThen</span> <span class='hs-varid'>cont</span> <span class='hs-varid'>heading</span> <span class='hs-varid'>pretty_msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cont</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-conid'>PprDebug</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-24"></a>    <span class='hs-keyword'>where</span>
<a name="line-25"></a>     <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-varid'>heading</span><span class='hs-layout'>,</span> <span class='hs-varid'>nest</span> <span class='hs-num'>4</span> <span class='hs-varid'>pretty_msg</span><span class='hs-keyglyph'>]</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="assertPprPanic"></a><span class='hs-definition'>assertPprPanic</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-28"></a><span class='hs-comment'>-- ^ Panic with an assertation failure, recording the given file and line number.</span>
<a name="line-29"></a><span class='hs-comment'>-- Should typically be accessed with the ASSERT family of macros</span>
<a name="line-30"></a><span class='hs-definition'>assertPprPanic</span> <span class='hs-varid'>file</span> <span class='hs-varid'>line</span> <span class='hs-varid'>msg</span>
<a name="line-31"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-conid'>PprDebug</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-32"></a>  <span class='hs-keyword'>where</span>
<a name="line-33"></a>    <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>hsep</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"ASSERT failed! file"</span><span class='hs-layout'>,</span> 
<a name="line-34"></a>		 	   <span class='hs-varid'>text</span> <span class='hs-varid'>file</span><span class='hs-layout'>,</span> 
<a name="line-35"></a>			   <span class='hs-varid'>text</span> <span class='hs-str'>"line"</span><span class='hs-layout'>,</span> <span class='hs-varid'>int</span> <span class='hs-varid'>line</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> 
<a name="line-36"></a>		    <span class='hs-varid'>msg</span><span class='hs-keyglyph'>]</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="warnPprTrace"></a><span class='hs-definition'>warnPprTrace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-39"></a><span class='hs-comment'>-- ^ Just warn about an assertion failure, recording the given file and line number.</span>
<a name="line-40"></a><span class='hs-comment'>-- Should typically be accessed with the WARN macros</span>
<a name="line-41"></a><span class='hs-definition'>warnPprTrace</span> <span class='hs-keyword'>_</span>     <span class='hs-sel'>_file</span> <span class='hs-sel'>_line</span> <span class='hs-sel'>_msg</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>opt_NoDebugOutput</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span>
<a name="line-42"></a><span class='hs-definition'>warnPprTrace</span> <span class='hs-conid'>False</span> <span class='hs-sel'>_file</span> <span class='hs-sel'>_line</span> <span class='hs-sel'>_msg</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span>
<a name="line-43"></a><span class='hs-definition'>warnPprTrace</span> <span class='hs-conid'>True</span>   <span class='hs-varid'>file</span>  <span class='hs-varid'>line</span>  <span class='hs-varid'>msg</span> <span class='hs-varid'>x</span>
<a name="line-44"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>trace</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>doc</span> <span class='hs-conid'>PprDebug</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-45"></a>  <span class='hs-keyword'>where</span>
<a name="line-46"></a>    <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>hsep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"WARNING: file"</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span> <span class='hs-varid'>file</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span> <span class='hs-str'>"line"</span><span class='hs-layout'>,</span> <span class='hs-varid'>int</span> <span class='hs-varid'>line</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-47"></a>	       <span class='hs-varid'>msg</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}
</body>
</html>