Sophie

Sophie

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

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>basicTypes/OccName.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- |</span>
<a name="line-2"></a><span class='hs-comment'>-- #name_types#</span>
<a name="line-3"></a><span class='hs-comment'>-- GHC uses several kinds of name internally:</span>
<a name="line-4"></a><span class='hs-comment'>--</span>
<a name="line-5"></a><span class='hs-comment'>-- * 'OccName.OccName' represents names as strings with just a little more information:</span>
<a name="line-6"></a><span class='hs-comment'>--   the \"namespace\" that the name came from, e.g. the namespace of value, type constructors or</span>
<a name="line-7"></a><span class='hs-comment'>--   data constructors</span>
<a name="line-8"></a><span class='hs-comment'>--</span>
<a name="line-9"></a><span class='hs-comment'>-- * 'RdrName.RdrName': see "RdrName#name_types"</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- * 'Name.Name': see "Name#name_types"</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>-- * 'Id.Id': see "Id#name_types"</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- * 'Var.Var': see "Var#name_types"</span>
<a name="line-16"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>OccName</span> <span class='hs-layout'>(</span>
<a name="line-17"></a>	<span class='hs-comment'>-- * The 'NameSpace' type</span>
<a name="line-18"></a>	<span class='hs-conid'>NameSpace</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- Abstract</span>
<a name="line-19"></a>	
<a name="line-20"></a>	<span class='hs-comment'>-- ** Construction</span>
<a name="line-21"></a>	<span class='hs-comment'>-- $real_vs_source_data_constructors</span>
<a name="line-22"></a>	<span class='hs-varid'>tcName</span><span class='hs-layout'>,</span> <span class='hs-varid'>clsName</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcClsName</span><span class='hs-layout'>,</span> <span class='hs-varid'>dataName</span><span class='hs-layout'>,</span> <span class='hs-varid'>varName</span><span class='hs-layout'>,</span> 
<a name="line-23"></a>	<span class='hs-varid'>tvName</span><span class='hs-layout'>,</span> <span class='hs-varid'>srcDataName</span><span class='hs-layout'>,</span>
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-comment'>-- ** Pretty Printing</span>
<a name="line-26"></a>	<span class='hs-varid'>pprNameSpace</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprNonVarNameSpace</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprNameSpaceBrief</span><span class='hs-layout'>,</span>
<a name="line-27"></a>
<a name="line-28"></a>	<span class='hs-comment'>-- * The 'OccName' type</span>
<a name="line-29"></a>	<span class='hs-conid'>OccName</span><span class='hs-layout'>,</span> 	<span class='hs-comment'>-- Abstract, instance of Outputable</span>
<a name="line-30"></a>	<span class='hs-varid'>pprOccName</span><span class='hs-layout'>,</span> 
<a name="line-31"></a>
<a name="line-32"></a>	<span class='hs-comment'>-- ** Construction	</span>
<a name="line-33"></a>	<span class='hs-varid'>mkOccName</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkOccNameFS</span><span class='hs-layout'>,</span> 
<a name="line-34"></a>	<span class='hs-varid'>mkVarOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVarOccFS</span><span class='hs-layout'>,</span>
<a name="line-35"></a>	<span class='hs-varid'>mkDataOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDataOccFS</span><span class='hs-layout'>,</span>
<a name="line-36"></a>	<span class='hs-varid'>mkTyVarOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTyVarOccFS</span><span class='hs-layout'>,</span>
<a name="line-37"></a>	<span class='hs-varid'>mkTcOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTcOccFS</span><span class='hs-layout'>,</span>
<a name="line-38"></a>	<span class='hs-varid'>mkClsOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkClsOccFS</span><span class='hs-layout'>,</span>
<a name="line-39"></a>	<span class='hs-varid'>mkDFunOcc</span><span class='hs-layout'>,</span>
<a name="line-40"></a>	<span class='hs-varid'>mkTupleOcc</span><span class='hs-layout'>,</span> 
<a name="line-41"></a>	<span class='hs-varid'>setOccNameSpace</span><span class='hs-layout'>,</span>
<a name="line-42"></a>
<a name="line-43"></a>	<span class='hs-comment'>-- ** Derived 'OccName's</span>
<a name="line-44"></a>        <span class='hs-varid'>isDerivedOccName</span><span class='hs-layout'>,</span>
<a name="line-45"></a>	<span class='hs-varid'>mkDataConWrapperOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkWorkerOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDefaultMethodOcc</span><span class='hs-layout'>,</span>
<a name="line-46"></a>	<span class='hs-varid'>mkDerivedTyConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkNewTyCoOcc</span><span class='hs-layout'>,</span> 
<a name="line-47"></a>        <span class='hs-varid'>mkCon2TagOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTag2ConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkMaxTagOcc</span><span class='hs-layout'>,</span>
<a name="line-48"></a>  	<span class='hs-varid'>mkClassTyConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkClassDataConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDictOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkIPOcc</span><span class='hs-layout'>,</span> 
<a name="line-49"></a> 	<span class='hs-varid'>mkSpecOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkForeignExportOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkGenOcc1</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkGenOcc2</span><span class='hs-layout'>,</span>
<a name="line-50"></a>	<span class='hs-varid'>mkDataTOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDataCOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDataConWorkerOcc</span><span class='hs-layout'>,</span>
<a name="line-51"></a>	<span class='hs-varid'>mkSuperDictSelOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkLocalOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkMethodOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkInstTyTcOcc</span><span class='hs-layout'>,</span>
<a name="line-52"></a>	<span class='hs-varid'>mkInstTyCoOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkEqPredCoOcc</span><span class='hs-layout'>,</span>
<a name="line-53"></a>        <span class='hs-varid'>mkVectOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVectTyConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVectDataConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVectIsoOcc</span><span class='hs-layout'>,</span>
<a name="line-54"></a>        <span class='hs-varid'>mkPDataTyConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkPDataDataConOcc</span><span class='hs-layout'>,</span>
<a name="line-55"></a>        <span class='hs-varid'>mkPReprTyConOcc</span><span class='hs-layout'>,</span>
<a name="line-56"></a>        <span class='hs-varid'>mkPADFunOcc</span><span class='hs-layout'>,</span>
<a name="line-57"></a>
<a name="line-58"></a>	<span class='hs-comment'>-- ** Deconstruction</span>
<a name="line-59"></a>	<span class='hs-varid'>occNameFS</span><span class='hs-layout'>,</span> <span class='hs-varid'>occNameString</span><span class='hs-layout'>,</span> <span class='hs-varid'>occNameSpace</span><span class='hs-layout'>,</span> 
<a name="line-60"></a>
<a name="line-61"></a>	<span class='hs-varid'>isVarOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isTvOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isTcOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDataOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDataSymOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isSymOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isValOcc</span><span class='hs-layout'>,</span>
<a name="line-62"></a>	<span class='hs-varid'>parenSymOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>startsWithUnderscore</span><span class='hs-layout'>,</span> 
<a name="line-63"></a>	
<a name="line-64"></a>	<span class='hs-varid'>isTcClsNameSpace</span><span class='hs-layout'>,</span> <span class='hs-varid'>isTvNameSpace</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDataConNameSpace</span><span class='hs-layout'>,</span> <span class='hs-varid'>isVarNameSpace</span><span class='hs-layout'>,</span> <span class='hs-varid'>isValNameSpace</span><span class='hs-layout'>,</span>
<a name="line-65"></a>
<a name="line-66"></a>	<span class='hs-varid'>isTupleOcc_maybe</span><span class='hs-layout'>,</span>
<a name="line-67"></a>
<a name="line-68"></a>	<span class='hs-comment'>-- * The 'OccEnv' type</span>
<a name="line-69"></a>	<span class='hs-conid'>OccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>unitOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>mapOccEnv</span><span class='hs-layout'>,</span>
<a name="line-70"></a>	<span class='hs-varid'>lookupOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkOccEnv_C</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendOccEnvList</span><span class='hs-layout'>,</span> <span class='hs-varid'>elemOccEnv</span><span class='hs-layout'>,</span>
<a name="line-71"></a>	<span class='hs-varid'>occEnvElts</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusOccEnv_C</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendOccEnv_C</span><span class='hs-layout'>,</span>
<a name="line-72"></a>        <span class='hs-varid'>filterOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>delListFromOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>delFromOccEnv</span><span class='hs-layout'>,</span>
<a name="line-73"></a>
<a name="line-74"></a>	<span class='hs-comment'>-- * The 'OccSet' type</span>
<a name="line-75"></a>	<span class='hs-conid'>OccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyOccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>unitOccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkOccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendOccSet</span><span class='hs-layout'>,</span> 
<a name="line-76"></a>	<span class='hs-varid'>extendOccSetList</span><span class='hs-layout'>,</span>
<a name="line-77"></a>	<span class='hs-varid'>unionOccSets</span><span class='hs-layout'>,</span> <span class='hs-varid'>unionManyOccSets</span><span class='hs-layout'>,</span> <span class='hs-varid'>minusOccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>elemOccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>occSetElts</span><span class='hs-layout'>,</span> 
<a name="line-78"></a>	<span class='hs-varid'>foldOccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>isEmptyOccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>intersectOccSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>intersectsOccSet</span><span class='hs-layout'>,</span>
<a name="line-79"></a>                  
<a name="line-80"></a>	<span class='hs-comment'>-- * Tidying up</span>
<a name="line-81"></a>	<span class='hs-conid'>TidyOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyTidyOccEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>tidyOccName</span><span class='hs-layout'>,</span> <span class='hs-varid'>initTidyOccEnv</span><span class='hs-layout'>,</span>
<a name="line-82"></a>
<a name="line-83"></a>	<span class='hs-comment'>-- * Lexical characteristics of Haskell names</span>
<a name="line-84"></a>	<span class='hs-varid'>isLexCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexVar</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexSym</span><span class='hs-layout'>,</span>
<a name="line-85"></a>	<span class='hs-varid'>isLexConId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexConSym</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexVarId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexVarSym</span><span class='hs-layout'>,</span>
<a name="line-86"></a>	<span class='hs-varid'>startsVarSym</span><span class='hs-layout'>,</span> <span class='hs-varid'>startsVarId</span><span class='hs-layout'>,</span> <span class='hs-varid'>startsConSym</span><span class='hs-layout'>,</span> <span class='hs-varid'>startsConId</span>
<a name="line-87"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-88"></a>
<a name="line-89"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>
<a name="line-90"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unique</span>
<a name="line-91"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-92"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqFM</span>
<a name="line-93"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSet</span>
<a name="line-94"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-95"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastTypes</span>
<a name="line-96"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-97"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Binary</span>
<a name="line-98"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>StaticFlags</span><span class='hs-layout'>(</span> <span class='hs-varid'>opt_SuppressUniques</span> <span class='hs-layout'>)</span>
<a name="line-99"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- Unicode TODO: put isSymbol in libcompat</span>
<a name="line-2"></a><span class='hs-cpp'>#if !defined(__GLASGOW_HASKELL__) || __GLASGOW_HASKELL__ &gt; 604</span>
<a name="line-3"></a><span class='hs-cpp'>#else</span>
<a name="line-4"></a><a name="isSymbol"></a><span class='hs-definition'>isSymbol</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-5"></a><span class='hs-definition'>isSymbol</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>const</span> <span class='hs-conid'>False</span>
<a name="line-6"></a><span class='hs-cpp'>#endif</span>
<a name="line-7"></a>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Name space}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="NameSpace"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VarName</span>	<span class='hs-comment'>-- Variables, including "real" data constructors</span>
<a name="line-2"></a>	       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DataName</span>	<span class='hs-comment'>-- "Source" data constructors </span>
<a name="line-3"></a>	       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TvName</span>		<span class='hs-comment'>-- Type variables</span>
<a name="line-4"></a>	       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TcClsName</span>	<span class='hs-comment'>-- Type constructors and classes; Haskell has them</span>
<a name="line-5"></a>				<span class='hs-comment'>-- in the same name space for now.</span>
<a name="line-6"></a>	       <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-layout'>)</span>
<a name="line-7"></a>   <span class='hs-comment'>{-! derive: Binary !-}</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-comment'>-- Note [Data Constructors]  </span>
<a name="line-10"></a><span class='hs-comment'>-- see also: Note [Data Constructor Naming] in DataCon.lhs</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- $real_vs_source_data_constructors</span>
<a name="line-13"></a><span class='hs-comment'>-- There are two forms of data constructor:</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>--	[Source data constructors] The data constructors mentioned in Haskell source code</span>
<a name="line-16"></a><span class='hs-comment'>--</span>
<a name="line-17"></a><span class='hs-comment'>--	[Real data constructors] The data constructors of the representation type, which may not be the same as the source type</span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- For example:</span>
<a name="line-20"></a><span class='hs-comment'>--</span>
<a name="line-21"></a><span class='hs-comment'>-- &gt; data T = T !(Int, Int)</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>-- The source datacon has type @(Int, Int) -&gt; T@</span>
<a name="line-24"></a><span class='hs-comment'>-- The real   datacon has type @Int -&gt; Int -&gt; T@</span>
<a name="line-25"></a><span class='hs-comment'>--</span>
<a name="line-26"></a><span class='hs-comment'>-- GHC chooses a representation based on the strictness etc.</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="tcName"></a><span class='hs-definition'>tcName</span><span class='hs-layout'>,</span> <span class='hs-varid'>clsName</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcClsName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span>
<a name="line-29"></a><a name="dataName"></a><span class='hs-definition'>dataName</span><span class='hs-layout'>,</span> <span class='hs-varid'>srcDataName</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span>
<a name="line-30"></a><a name="tvName"></a><span class='hs-definition'>tvName</span><span class='hs-layout'>,</span> <span class='hs-varid'>varName</span>            <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-comment'>-- Though type constructors and classes are in the same name space now,</span>
<a name="line-33"></a><span class='hs-comment'>-- the NameSpace type is abstract, so we can easily separate them later</span>
<a name="line-34"></a><span class='hs-definition'>tcName</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TcClsName</span>		<span class='hs-comment'>-- Type constructors</span>
<a name="line-35"></a><a name="clsName"></a><span class='hs-definition'>clsName</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TcClsName</span>		<span class='hs-comment'>-- Classes</span>
<a name="line-36"></a><a name="tcClsName"></a><span class='hs-definition'>tcClsName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TcClsName</span>		<span class='hs-comment'>-- Not sure which!</span>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-definition'>dataName</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DataName</span>
<a name="line-39"></a><a name="srcDataName"></a><span class='hs-definition'>srcDataName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DataName</span>	<span class='hs-comment'>-- Haskell-source data constructors should be</span>
<a name="line-40"></a>			<span class='hs-comment'>-- in the Data name space</span>
<a name="line-41"></a>
<a name="line-42"></a><span class='hs-definition'>tvName</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TvName</span>
<a name="line-43"></a><a name="varName"></a><span class='hs-definition'>varName</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VarName</span>
<a name="line-44"></a>
<a name="line-45"></a><a name="isDataConNameSpace"></a><span class='hs-definition'>isDataConNameSpace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-46"></a><span class='hs-definition'>isDataConNameSpace</span> <span class='hs-conid'>DataName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-47"></a><span class='hs-definition'>isDataConNameSpace</span> <span class='hs-keyword'>_</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="isTcClsNameSpace"></a><span class='hs-definition'>isTcClsNameSpace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-50"></a><span class='hs-definition'>isTcClsNameSpace</span> <span class='hs-conid'>TcClsName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-51"></a><span class='hs-definition'>isTcClsNameSpace</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="isTvNameSpace"></a><span class='hs-definition'>isTvNameSpace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-54"></a><span class='hs-definition'>isTvNameSpace</span> <span class='hs-conid'>TvName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-55"></a><span class='hs-definition'>isTvNameSpace</span> <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-56"></a>
<a name="line-57"></a><a name="isVarNameSpace"></a><span class='hs-definition'>isVarNameSpace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>	<span class='hs-comment'>-- Variables or type variables, but not constructors</span>
<a name="line-58"></a><span class='hs-definition'>isVarNameSpace</span> <span class='hs-conid'>TvName</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-59"></a><span class='hs-definition'>isVarNameSpace</span> <span class='hs-conid'>VarName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-60"></a><span class='hs-definition'>isVarNameSpace</span> <span class='hs-keyword'>_</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-61"></a>
<a name="line-62"></a><a name="isValNameSpace"></a><span class='hs-definition'>isValNameSpace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-63"></a><span class='hs-definition'>isValNameSpace</span> <span class='hs-conid'>DataName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-64"></a><span class='hs-definition'>isValNameSpace</span> <span class='hs-conid'>VarName</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-65"></a><span class='hs-definition'>isValNameSpace</span> <span class='hs-keyword'>_</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-66"></a>
<a name="line-67"></a><a name="pprNameSpace"></a><span class='hs-definition'>pprNameSpace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-68"></a><span class='hs-definition'>pprNameSpace</span> <span class='hs-conid'>DataName</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'>"data constructor"</span><span class='hs-layout'>)</span>
<a name="line-69"></a><span class='hs-definition'>pprNameSpace</span> <span class='hs-conid'>VarName</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'>"variable"</span><span class='hs-layout'>)</span>
<a name="line-70"></a><span class='hs-definition'>pprNameSpace</span> <span class='hs-conid'>TvName</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'>"type variable"</span><span class='hs-layout'>)</span>
<a name="line-71"></a><span class='hs-definition'>pprNameSpace</span> <span class='hs-conid'>TcClsName</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'>"type constructor or class"</span><span class='hs-layout'>)</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="pprNonVarNameSpace"></a><span class='hs-definition'>pprNonVarNameSpace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-74"></a><span class='hs-definition'>pprNonVarNameSpace</span> <span class='hs-conid'>VarName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-75"></a><span class='hs-definition'>pprNonVarNameSpace</span> <span class='hs-varid'>ns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprNameSpace</span> <span class='hs-varid'>ns</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="pprNameSpaceBrief"></a><span class='hs-definition'>pprNameSpaceBrief</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-78"></a><span class='hs-definition'>pprNameSpaceBrief</span> <span class='hs-conid'>DataName</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'d'</span>
<a name="line-79"></a><span class='hs-definition'>pprNameSpaceBrief</span> <span class='hs-conid'>VarName</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'v'</span>
<a name="line-80"></a><span class='hs-definition'>pprNameSpaceBrief</span> <span class='hs-conid'>TvName</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'>"tv"</span><span class='hs-layout'>)</span>
<a name="line-81"></a><span class='hs-definition'>pprNameSpaceBrief</span> <span class='hs-conid'>TcClsName</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'>"tc"</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection[Name-pieces-datatypes]{The @OccName@ datatypes}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="OccName"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OccName</span> 
<a name="line-2"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>occNameSpace</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>NameSpace</span>
<a name="line-3"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>occNameFS</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>FastString</span>
<a name="line-4"></a>    <span class='hs-layout'>}</span>
</pre>\end{code}


\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>OccName</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>    <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>sp1</span> <span class='hs-varid'>s1</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>sp2</span> <span class='hs-varid'>s2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>s2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>sp1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sp2</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Ord</span> <span class='hs-conid'>OccName</span> <span class='hs-keyword'>where</span>
<a name="line-5"></a>	<span class='hs-comment'>-- Compares lexicographically, *not* by Unique of the string</span>
<a name="line-6"></a>    <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>sp1</span> <span class='hs-varid'>s1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>sp2</span> <span class='hs-varid'>s2</span><span class='hs-layout'>)</span> 
<a name="line-7"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>s1</span>  <span class='hs-varop'>`compare`</span> <span class='hs-varid'>s2</span><span class='hs-layout'>)</span> <span class='hs-varop'>`thenCmp`</span> <span class='hs-layout'>(</span><span class='hs-varid'>sp1</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>sp2</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Printing}
%*									*
%************************************************************************
 
\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>OccName</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>    <span class='hs-varid'>ppr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprOccName</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="pprOccName"></a><span class='hs-definition'>pprOccName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-5"></a><span class='hs-definition'>pprOccName</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>sp</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span> 
<a name="line-6"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getPprStyle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-7"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>codeStyle</span> <span class='hs-varid'>sty</span> 
<a name="line-8"></a>    <span class='hs-keyword'>then</span> <span class='hs-varid'>ftext</span> <span class='hs-layout'>(</span><span class='hs-varid'>zEncodeFS</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
<a name="line-9"></a>    <span class='hs-keyword'>else</span> <span class='hs-varid'>pp_occ</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>pp_debug</span> <span class='hs-varid'>sty</span>
<a name="line-10"></a>  <span class='hs-keyword'>where</span>
<a name="line-11"></a>    <span class='hs-varid'>pp_debug</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>debugStyle</span> <span class='hs-varid'>sty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>braces</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprNameSpaceBrief</span> <span class='hs-varid'>sp</span><span class='hs-layout'>)</span>
<a name="line-12"></a>	         <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-13"></a>
<a name="line-14"></a>    <span class='hs-varid'>pp_occ</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>opt_SuppressUniques</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>strip_th_unique</span> <span class='hs-layout'>(</span><span class='hs-varid'>unpackFS</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-15"></a>           <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ftext</span> <span class='hs-varid'>occ</span>
<a name="line-16"></a>
<a name="line-17"></a>	<span class='hs-comment'>-- See Note [Suppressing uniques in OccNames]</span>
<a name="line-18"></a>    <span class='hs-varid'>strip_th_unique</span> <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'>|</span> <span class='hs-varid'>isAlphaNum</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-19"></a>    <span class='hs-varid'>strip_th_unique</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-conop'>:</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-conop'>:</span> <span class='hs-varid'>strip_th_unique</span> <span class='hs-varid'>cs</span>
<a name="line-20"></a>    <span class='hs-varid'>strip_th_unique</span> <span class='hs-conid'>[]</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
</pre>\end{code}

Note [Suppressing uniques in OccNames]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is a hack to de-wobblify the OccNames that contain uniques from
Template Haskell that have been turned into a string in the OccName.
See Note [Unique OccNames from Template Haskell] in Convert.hs

%************************************************************************
%*									*
\subsection{Construction}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="mkOccName"></a><span class='hs-definition'>mkOccName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-2"></a><span class='hs-definition'>mkOccName</span> <span class='hs-varid'>occ_sp</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OccName</span> <span class='hs-varid'>occ_sp</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkFastString</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="mkOccNameFS"></a><span class='hs-definition'>mkOccNameFS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-5"></a><span class='hs-definition'>mkOccNameFS</span> <span class='hs-varid'>occ_sp</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OccName</span> <span class='hs-varid'>occ_sp</span> <span class='hs-varid'>fs</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="mkVarOcc"></a><span class='hs-definition'>mkVarOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-8"></a><span class='hs-definition'>mkVarOcc</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccName</span> <span class='hs-varid'>varName</span> <span class='hs-varid'>s</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="mkVarOccFS"></a><span class='hs-definition'>mkVarOccFS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-11"></a><span class='hs-definition'>mkVarOccFS</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccNameFS</span> <span class='hs-varid'>varName</span> <span class='hs-varid'>fs</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="mkDataOcc"></a><span class='hs-definition'>mkDataOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-14"></a><span class='hs-definition'>mkDataOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccName</span> <span class='hs-varid'>dataName</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="mkDataOccFS"></a><span class='hs-definition'>mkDataOccFS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-17"></a><span class='hs-definition'>mkDataOccFS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccNameFS</span> <span class='hs-varid'>dataName</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="mkTyVarOcc"></a><span class='hs-definition'>mkTyVarOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-20"></a><span class='hs-definition'>mkTyVarOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccName</span> <span class='hs-varid'>tvName</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="mkTyVarOccFS"></a><span class='hs-definition'>mkTyVarOccFS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-23"></a><span class='hs-definition'>mkTyVarOccFS</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccNameFS</span> <span class='hs-varid'>tvName</span> <span class='hs-varid'>fs</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="mkTcOcc"></a><span class='hs-definition'>mkTcOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-26"></a><span class='hs-definition'>mkTcOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccName</span> <span class='hs-varid'>tcName</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="mkTcOccFS"></a><span class='hs-definition'>mkTcOccFS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-29"></a><span class='hs-definition'>mkTcOccFS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccNameFS</span> <span class='hs-varid'>tcName</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="mkClsOcc"></a><span class='hs-definition'>mkClsOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-32"></a><span class='hs-definition'>mkClsOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccName</span> <span class='hs-varid'>clsName</span>
<a name="line-33"></a>
<a name="line-34"></a><a name="mkClsOccFS"></a><span class='hs-definition'>mkClsOccFS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-35"></a><span class='hs-definition'>mkClsOccFS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccNameFS</span> <span class='hs-varid'>clsName</span>
</pre>\end{code}


%************************************************************************
%*									*
		Environments
%*									*
%************************************************************************

OccEnvs are used mainly for the envts in ModIfaces.

They are efficient, because FastStrings have unique Int# keys.  We assume
this key is less than 2^24, so we can make a Unique using
	mkUnique ns key  :: Unique
where 'ns' is a Char reprsenting the name space.  This in turn makes it
easy to build an OccEnv.

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Uniquable</span> <span class='hs-conid'>OccName</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>  <span class='hs-varid'>getUnique</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>ns</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-3"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUnique</span> <span class='hs-varid'>char</span> <span class='hs-layout'>(</span><span class='hs-varid'>iBox</span> <span class='hs-layout'>(</span><span class='hs-varid'>uniqueOfFS</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-4"></a>      <span class='hs-keyword'>where</span>	<span class='hs-comment'>-- See notes above about this getUnique function</span>
<a name="line-5"></a>        <span class='hs-varid'>char</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>ns</span> <span class='hs-keyword'>of</span>
<a name="line-6"></a>		<span class='hs-conid'>VarName</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-chr'>'i'</span>
<a name="line-7"></a>		<span class='hs-conid'>DataName</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-chr'>'d'</span>
<a name="line-8"></a>		<span class='hs-conid'>TvName</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-chr'>'v'</span>
<a name="line-9"></a>		<span class='hs-conid'>TcClsName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-chr'>'t'</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="OccEnv"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-layout'>(</span><span class='hs-conid'>UniqFM</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="emptyOccEnv"></a><span class='hs-definition'>emptyOccEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-14"></a><a name="unitOccEnv"></a><span class='hs-definition'>unitOccEnv</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-15"></a><a name="extendOccEnv"></a><span class='hs-definition'>extendOccEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-16"></a><a name="extendOccEnvList"></a><span class='hs-definition'>extendOccEnvList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-17"></a><a name="lookupOccEnv"></a><span class='hs-definition'>lookupOccEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span>
<a name="line-18"></a><a name="mkOccEnv"></a><span class='hs-definition'>mkOccEnv</span>     <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-19"></a><a name="mkOccEnv_C"></a><span class='hs-definition'>mkOccEnv_C</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-varid'>a</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-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-20"></a><a name="elemOccEnv"></a><span class='hs-definition'>elemOccEnv</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-21"></a><a name="foldOccEnv"></a><span class='hs-definition'>foldOccEnv</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-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-22"></a><a name="occEnvElts"></a><span class='hs-definition'>occEnvElts</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccEnv</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>
<a name="line-23"></a><a name="extendOccEnv_C"></a><span class='hs-definition'>extendOccEnv_C</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-varid'>a</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'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-24"></a><a name="plusOccEnv"></a><span class='hs-definition'>plusOccEnv</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-25"></a><a name="plusOccEnv_C"></a><span class='hs-definition'>plusOccEnv_C</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-varid'>a</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'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-26"></a><a name="mapOccEnv"></a><span class='hs-definition'>mapOccEnv</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-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>b</span>
<a name="line-27"></a><a name="delFromOccEnv"></a><span class='hs-definition'>delFromOccEnv</span> 	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-28"></a><a name="delListFromOccEnv"></a><span class='hs-definition'>delListFromOccEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OccName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>a</span>
<a name="line-29"></a><a name="filterOccEnv"></a><span class='hs-definition'>filterOccEnv</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>elt</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>elt</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccEnv</span> <span class='hs-varid'>elt</span>
<a name="line-30"></a>
<a name="line-31"></a><span class='hs-definition'>emptyOccEnv</span>  	 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varid'>emptyUFM</span>
<a name="line-32"></a><span class='hs-definition'>unitOccEnv</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unitUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> 
<a name="line-33"></a><span class='hs-definition'>extendOccEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>addToUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varid'>z</span>
<a name="line-34"></a><span class='hs-definition'>extendOccEnvList</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>addListToUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span>
<a name="line-35"></a><span class='hs-definition'>lookupOccEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-36"></a><span class='hs-definition'>mkOccEnv</span>     <span class='hs-varid'>l</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>listToUFM</span> <span class='hs-varid'>l</span>
<a name="line-37"></a><span class='hs-definition'>elemOccEnv</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> 	 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>elemUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-38"></a><span class='hs-definition'>foldOccEnv</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>	 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldUFM</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-varid'>c</span> 
<a name="line-39"></a><span class='hs-definition'>occEnvElts</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>	 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eltsUFM</span> <span class='hs-varid'>x</span>
<a name="line-40"></a><span class='hs-definition'>plusOccEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>	 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>plusUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> 
<a name="line-41"></a><span class='hs-definition'>plusOccEnv_C</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>	 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>plusUFM_C</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> 
<a name="line-42"></a><span class='hs-definition'>extendOccEnv_C</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span> <span class='hs-varid'>z</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>addToUFM_C</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varid'>z</span>
<a name="line-43"></a><span class='hs-definition'>mapOccEnv</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>	 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mapUFM</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>
<a name="line-44"></a><span class='hs-definition'>mkOccEnv_C</span> <span class='hs-varid'>comb</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>addListToUFM_C</span> <span class='hs-varid'>comb</span> <span class='hs-varid'>emptyUFM</span> <span class='hs-varid'>l</span>
<a name="line-45"></a><span class='hs-definition'>delFromOccEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>delFromUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-46"></a><span class='hs-definition'>delListFromOccEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>delListFromUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-47"></a><span class='hs-definition'>filterOccEnv</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span> <span class='hs-varop'>$</span> <span class='hs-varid'>filterUFM</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-48"></a>
<a name="line-49"></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'>OccEnv</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-50"></a>    <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="OccSet"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UniqSet</span> <span class='hs-conid'>OccName</span>
<a name="line-53"></a>
<a name="line-54"></a><a name="emptyOccSet"></a><span class='hs-definition'>emptyOccSet</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span>
<a name="line-55"></a><a name="unitOccSet"></a><span class='hs-definition'>unitOccSet</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>
<a name="line-56"></a><a name="mkOccSet"></a><span class='hs-definition'>mkOccSet</span>          <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OccName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>
<a name="line-57"></a><a name="extendOccSet"></a><span class='hs-definition'>extendOccSet</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>
<a name="line-58"></a><a name="extendOccSetList"></a><span class='hs-definition'>extendOccSetList</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OccName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>
<a name="line-59"></a><a name="unionOccSets"></a><span class='hs-definition'>unionOccSets</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>
<a name="line-60"></a><a name="unionManyOccSets"></a><span class='hs-definition'>unionManyOccSets</span>  <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OccSet</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>
<a name="line-61"></a><a name="minusOccSet"></a><span class='hs-definition'>minusOccSet</span> 	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>
<a name="line-62"></a><a name="elemOccSet"></a><span class='hs-definition'>elemOccSet</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-63"></a><a name="occSetElts"></a><span class='hs-definition'>occSetElts</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OccName</span><span class='hs-keyglyph'>]</span>
<a name="line-64"></a><a name="foldOccSet"></a><span class='hs-definition'>foldOccSet</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-65"></a><a name="isEmptyOccSet"></a><span class='hs-definition'>isEmptyOccSet</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-66"></a><a name="intersectOccSet"></a><span class='hs-definition'>intersectOccSet</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>
<a name="line-67"></a><a name="intersectsOccSet"></a><span class='hs-definition'>intersectsOccSet</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-68"></a>
<a name="line-69"></a><span class='hs-definition'>emptyOccSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyUniqSet</span>
<a name="line-70"></a><span class='hs-definition'>unitOccSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unitUniqSet</span>
<a name="line-71"></a><span class='hs-definition'>mkOccSet</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUniqSet</span>
<a name="line-72"></a><span class='hs-definition'>extendOccSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addOneToUniqSet</span>
<a name="line-73"></a><span class='hs-definition'>extendOccSetList</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addListToUniqSet</span>
<a name="line-74"></a><span class='hs-definition'>unionOccSets</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionUniqSets</span>
<a name="line-75"></a><span class='hs-definition'>unionManyOccSets</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionManyUniqSets</span>
<a name="line-76"></a><span class='hs-definition'>minusOccSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>minusUniqSet</span>
<a name="line-77"></a><span class='hs-definition'>elemOccSet</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>elementOfUniqSet</span>
<a name="line-78"></a><span class='hs-definition'>occSetElts</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uniqSetToList</span>
<a name="line-79"></a><span class='hs-definition'>foldOccSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldUniqSet</span>
<a name="line-80"></a><span class='hs-definition'>isEmptyOccSet</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isEmptyUniqSet</span>
<a name="line-81"></a><span class='hs-definition'>intersectOccSet</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectUniqSets</span>
<a name="line-82"></a><span class='hs-definition'>intersectsOccSet</span> <span class='hs-varid'>s1</span> <span class='hs-varid'>s2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isEmptyOccSet</span> <span class='hs-layout'>(</span><span class='hs-varid'>s1</span> <span class='hs-varop'>`intersectOccSet`</span> <span class='hs-varid'>s2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Predicates and taking them apart}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="occNameString"></a><span class='hs-definition'>occNameString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-2"></a><span class='hs-definition'>occNameString</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unpackFS</span> <span class='hs-varid'>s</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="setOccNameSpace"></a><span class='hs-definition'>setOccNameSpace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-5"></a><span class='hs-definition'>setOccNameSpace</span> <span class='hs-varid'>sp</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OccName</span> <span class='hs-varid'>sp</span> <span class='hs-varid'>occ</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="isVarOcc"></a><span class='hs-definition'>isVarOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isTvOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isTcOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDataOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-definition'>isVarOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>VarName</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-10"></a><span class='hs-definition'>isVarOcc</span> <span class='hs-keyword'>_</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="isTvOcc"></a><span class='hs-definition'>isTvOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>TvName</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-13"></a><span class='hs-definition'>isTvOcc</span> <span class='hs-keyword'>_</span>                  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="isTcOcc"></a><span class='hs-definition'>isTcOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>TcClsName</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-16"></a><span class='hs-definition'>isTcOcc</span> <span class='hs-keyword'>_</span>                     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-17"></a>
<a name="line-18"></a><a name="isValOcc"></a><span class='hs-comment'>-- | /Value/ 'OccNames's are those that are either in </span>
<a name="line-19"></a><span class='hs-comment'>-- the variable or data constructor namespaces</span>
<a name="line-20"></a><span class='hs-definition'>isValOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-21"></a><span class='hs-definition'>isValOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>VarName</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-22"></a><span class='hs-definition'>isValOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>DataName</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-23"></a><span class='hs-definition'>isValOcc</span> <span class='hs-keyword'>_</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="isDataOcc"></a><span class='hs-definition'>isDataOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>DataName</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-26"></a><span class='hs-definition'>isDataOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>VarName</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>  
<a name="line-27"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isLexCon</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"isDataOcc: check me"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-28"></a>		<span class='hs-comment'>-- Jan06: I don't think this should happen</span>
<a name="line-29"></a><span class='hs-definition'>isDataOcc</span> <span class='hs-keyword'>_</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="isDataSymOcc"></a><span class='hs-comment'>-- | Test if the 'OccName' is a data constructor that starts with</span>
<a name="line-32"></a><span class='hs-comment'>-- a symbol (e.g. @:@, or @[]@)</span>
<a name="line-33"></a><span class='hs-definition'>isDataSymOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-34"></a><span class='hs-definition'>isDataSymOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>DataName</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexConSym</span> <span class='hs-varid'>s</span>
<a name="line-35"></a><span class='hs-definition'>isDataSymOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>VarName</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>  
<a name="line-36"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isLexConSym</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"isDataSymOcc: check me"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-37"></a>		<span class='hs-comment'>-- Jan06: I don't think this should happen</span>
<a name="line-38"></a><span class='hs-definition'>isDataSymOcc</span> <span class='hs-keyword'>_</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-39"></a><span class='hs-comment'>-- Pretty inefficient!</span>
<a name="line-40"></a>
<a name="line-41"></a><a name="isSymOcc"></a><span class='hs-comment'>-- | Test if the 'OccName' is that for any operator (whether </span>
<a name="line-42"></a><span class='hs-comment'>-- it is a data constructor or variable or whatever)</span>
<a name="line-43"></a><span class='hs-definition'>isSymOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-44"></a><span class='hs-definition'>isSymOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>DataName</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexConSym</span> <span class='hs-varid'>s</span>
<a name="line-45"></a><span class='hs-definition'>isSymOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>TcClsName</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexConSym</span> <span class='hs-varid'>s</span>
<a name="line-46"></a><span class='hs-definition'>isSymOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>VarName</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexSym</span> <span class='hs-varid'>s</span>
<a name="line-47"></a><span class='hs-definition'>isSymOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>TvName</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexSym</span> <span class='hs-varid'>s</span>
<a name="line-48"></a><span class='hs-comment'>-- Pretty inefficient!</span>
<a name="line-49"></a>
<a name="line-50"></a><a name="parenSymOcc"></a><span class='hs-definition'>parenSymOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</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-51"></a><span class='hs-comment'>-- ^ Wrap parens around an operator</span>
<a name="line-52"></a><span class='hs-definition'>parenSymOcc</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isSymOcc</span> <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>parens</span> <span class='hs-varid'>doc</span>
<a name="line-53"></a>		    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doc</span>
</pre>\end{code}


\begin{code}
<pre><a name="line-1"></a><a name="startsWithUnderscore"></a><span class='hs-definition'>startsWithUnderscore</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-2"></a><span class='hs-comment'>-- ^ Haskell 98 encourages compilers to suppress warnings about unsed</span>
<a name="line-3"></a><span class='hs-comment'>-- names in a pattern if they start with @_@: this implements that test</span>
<a name="line-4"></a><span class='hs-definition'>startsWithUnderscore</span> <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>occNameString</span> <span class='hs-varid'>occ</span> <span class='hs-keyword'>of</span>
<a name="line-5"></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'>True</span>
<a name="line-6"></a>			     <span class='hs-sel'>_other</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Making system names}
%*									*
%************************************************************************

Here's our convention for splitting up the interface file name space:

   d...		dictionary identifiers
   		(local variables, so no name-clash worries)

All of these other OccNames contain a mixture of alphabetic
and symbolic characters, and hence cannot possibly clash with
a user-written type or function name

   $f...	Dict-fun identifiers (from inst decls)
   $dmop	Default method for 'op'
   $pnC		n'th superclass selector for class C
   $wf		Worker for functtoin 'f'
   $sf..	Specialised version of f
   T:C		Tycon for dictionary for class C
   D:C		Data constructor for dictionary for class C
   NTCo:T       Coercion connecting newtype T with its representation type
   TFCo:R       Coercion connecting a data family to its respresentation type R

In encoded form these appear as Zdfxxx etc

	:...		keywords (export:, letrec: etc.)
--- I THINK THIS IS WRONG!

This knowledge is encoded in the following functions.

@mk_deriv@ generates an @OccName@ from the prefix and a string.
NB: The string must already be encoded!

\begin{code}
<pre><a name="line-1"></a><a name="mk_deriv"></a><span class='hs-definition'>mk_deriv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> 
<a name="line-2"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>		<span class='hs-comment'>-- Distinguishes one sort of derived name from another</span>
<a name="line-3"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-4"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-definition'>mk_deriv</span> <span class='hs-varid'>occ_sp</span> <span class='hs-varid'>sys_prefix</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccName</span> <span class='hs-varid'>occ_sp</span> <span class='hs-layout'>(</span><span class='hs-varid'>sys_prefix</span> <span class='hs-varop'>++</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="isDerivedOccName"></a><span class='hs-definition'>isDerivedOccName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-9"></a><span class='hs-definition'>isDerivedOccName</span> <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> 
<a name="line-10"></a>   <span class='hs-keyword'>case</span> <span class='hs-varid'>occNameString</span> <span class='hs-varid'>occ</span> <span class='hs-keyword'>of</span>
<a name="line-11"></a>     <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-keyglyph'>|</span> <span class='hs-varid'>isAlphaNum</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-12"></a>     <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-keyglyph'>|</span> <span class='hs-varid'>isAlphaNum</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-13"></a>     <span class='hs-sel'>_other</span>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkDataConWrapperOcc"></a><span class='hs-definition'>mkDataConWrapperOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkWorkerOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDefaultMethodOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDerivedTyConOcc</span><span class='hs-layout'>,</span>
<a name="line-2"></a>  	<span class='hs-varid'>mkClassTyConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkClassDataConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDictOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkIPOcc</span><span class='hs-layout'>,</span> 
<a name="line-3"></a> 	<span class='hs-varid'>mkSpecOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkForeignExportOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkGenOcc1</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkGenOcc2</span><span class='hs-layout'>,</span>
<a name="line-4"></a>	<span class='hs-varid'>mkDataTOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDataCOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDataConWorkerOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkNewTyCoOcc</span><span class='hs-layout'>,</span>
<a name="line-5"></a>	<span class='hs-varid'>mkInstTyCoOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkEqPredCoOcc</span><span class='hs-layout'>,</span> 
<a name="line-6"></a>        <span class='hs-varid'>mkCon2TagOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTag2ConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkMaxTagOcc</span><span class='hs-layout'>,</span>
<a name="line-7"></a>	<span class='hs-varid'>mkVectOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVectTyConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVectDataConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVectIsoOcc</span><span class='hs-layout'>,</span>
<a name="line-8"></a>	<span class='hs-varid'>mkPDataTyConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkPDataDataConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkPReprTyConOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkPADFunOcc</span>
<a name="line-9"></a>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-comment'>-- These derived variables have a prefix that no Haskell value could have</span>
<a name="line-12"></a><span class='hs-definition'>mkDataConWrapperOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$W"</span>
<a name="line-13"></a><a name="mkWorkerOcc"></a><span class='hs-definition'>mkWorkerOcc</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$w"</span>
<a name="line-14"></a><a name="mkDefaultMethodOcc"></a><span class='hs-definition'>mkDefaultMethodOcc</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$dm"</span>
<a name="line-15"></a><a name="mkDerivedTyConOcc"></a><span class='hs-definition'>mkDerivedTyConOcc</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>tcName</span>   <span class='hs-str'>":"</span>	<span class='hs-comment'>-- The : prefix makes sure it classifies</span>
<a name="line-16"></a><a name="mkClassTyConOcc"></a><span class='hs-definition'>mkClassTyConOcc</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>tcName</span>   <span class='hs-str'>"T:"</span>	<span class='hs-comment'>-- as a tycon/datacon</span>
<a name="line-17"></a><a name="mkClassDataConOcc"></a><span class='hs-definition'>mkClassDataConOcc</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>dataName</span> <span class='hs-str'>"D:"</span>	<span class='hs-comment'>-- We go straight to the "real" data con</span>
<a name="line-18"></a>							<span class='hs-comment'>-- for datacons from classes</span>
<a name="line-19"></a><a name="mkDictOcc"></a><span class='hs-definition'>mkDictOcc</span>	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$d"</span>
<a name="line-20"></a><a name="mkIPOcc"></a><span class='hs-definition'>mkIPOcc</span>		    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$i"</span>
<a name="line-21"></a><a name="mkSpecOcc"></a><span class='hs-definition'>mkSpecOcc</span>	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$s"</span>
<a name="line-22"></a><a name="mkForeignExportOcc"></a><span class='hs-definition'>mkForeignExportOcc</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$f"</span>
<a name="line-23"></a><a name="mkNewTyCoOcc"></a><span class='hs-definition'>mkNewTyCoOcc</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>tcName</span>  <span class='hs-str'>"NTCo:"</span>	<span class='hs-comment'>-- Coercion for newtypes</span>
<a name="line-24"></a><a name="mkInstTyCoOcc"></a><span class='hs-definition'>mkInstTyCoOcc</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>tcName</span>  <span class='hs-str'>"TFCo:"</span>   <span class='hs-comment'>-- Coercion for type functions</span>
<a name="line-25"></a><a name="mkEqPredCoOcc"></a><span class='hs-definition'>mkEqPredCoOcc</span>	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>tcName</span>  <span class='hs-str'>"$co"</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="mkCon2TagOcc"></a><span class='hs-comment'>-- used in derived instances</span>
<a name="line-28"></a><span class='hs-definition'>mkCon2TagOcc</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$con2tag_"</span>
<a name="line-29"></a><a name="mkTag2ConOcc"></a><span class='hs-definition'>mkTag2ConOcc</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$tag2con_"</span>
<a name="line-30"></a><a name="mkMaxTagOcc"></a><span class='hs-definition'>mkMaxTagOcc</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$maxtag_"</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="mkGenOcc1"></a><span class='hs-comment'>-- Generic derivable classes</span>
<a name="line-33"></a><span class='hs-definition'>mkGenOcc1</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$gfrom"</span>
<a name="line-34"></a><a name="mkGenOcc2"></a><span class='hs-definition'>mkGenOcc2</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$gto"</span> 
<a name="line-35"></a>
<a name="line-36"></a><a name="mkDataTOcc"></a><span class='hs-comment'>-- data T = MkT ... deriving( Data ) needs defintions for </span>
<a name="line-37"></a><span class='hs-comment'>--	$tT   :: Data.Generics.Basics.DataType</span>
<a name="line-38"></a><span class='hs-comment'>--	$cMkT :: Data.Generics.Basics.Constr</span>
<a name="line-39"></a><span class='hs-definition'>mkDataTOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$t"</span>
<a name="line-40"></a><a name="mkDataCOcc"></a><span class='hs-definition'>mkDataCOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$c"</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="mkVectOcc"></a><span class='hs-comment'>-- Vectorisation</span>
<a name="line-43"></a><span class='hs-definition'>mkVectOcc</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$v_"</span>
<a name="line-44"></a><a name="mkVectTyConOcc"></a><span class='hs-definition'>mkVectTyConOcc</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>tcName</span>   <span class='hs-str'>":V_"</span>
<a name="line-45"></a><a name="mkVectDataConOcc"></a><span class='hs-definition'>mkVectDataConOcc</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>dataName</span> <span class='hs-str'>":VD_"</span>
<a name="line-46"></a><a name="mkVectIsoOcc"></a><span class='hs-definition'>mkVectIsoOcc</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$VI_"</span>
<a name="line-47"></a><a name="mkPDataTyConOcc"></a><span class='hs-definition'>mkPDataTyConOcc</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>tcName</span>   <span class='hs-str'>":VP_"</span>
<a name="line-48"></a><a name="mkPDataDataConOcc"></a><span class='hs-definition'>mkPDataDataConOcc</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>dataName</span> <span class='hs-str'>":VPD_"</span>
<a name="line-49"></a><a name="mkPReprTyConOcc"></a><span class='hs-definition'>mkPReprTyConOcc</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>tcName</span>   <span class='hs-str'>":VR_"</span>
<a name="line-50"></a><a name="mkPADFunOcc"></a><span class='hs-definition'>mkPADFunOcc</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span>  <span class='hs-str'>"$PA_"</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="mk_simple_deriv"></a><span class='hs-definition'>mk_simple_deriv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-53"></a><span class='hs-definition'>mk_simple_deriv</span> <span class='hs-varid'>sp</span> <span class='hs-varid'>px</span> <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_deriv</span> <span class='hs-varid'>sp</span> <span class='hs-varid'>px</span> <span class='hs-layout'>(</span><span class='hs-varid'>occNameString</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
<a name="line-54"></a>
<a name="line-55"></a><a name="mkDataConWorkerOcc"></a><span class='hs-comment'>-- Data constructor workers are made by setting the name space</span>
<a name="line-56"></a><span class='hs-comment'>-- of the data constructor OccName (which should be a DataName)</span>
<a name="line-57"></a><span class='hs-comment'>-- to VarName</span>
<a name="line-58"></a><span class='hs-definition'>mkDataConWorkerOcc</span> <span class='hs-varid'>datacon_occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setOccNameSpace</span> <span class='hs-varid'>varName</span> <span class='hs-varid'>datacon_occ</span> 
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkSuperDictSelOcc"></a><span class='hs-definition'>mkSuperDictSelOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> 	<span class='hs-comment'>-- ^ Index of superclass, e.g. 3</span>
<a name="line-2"></a>		  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> 	<span class='hs-comment'>-- ^ Class, e.g. @Ord@</span>
<a name="line-3"></a>		  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>	<span class='hs-comment'>-- ^ Derived 'Occname', e.g. @$p3Ord@</span>
<a name="line-4"></a><span class='hs-definition'>mkSuperDictSelOcc</span> <span class='hs-varid'>index</span> <span class='hs-varid'>cls_occ</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_deriv</span> <span class='hs-varid'>varName</span> <span class='hs-str'>"$p"</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>index</span> <span class='hs-varop'>++</span> <span class='hs-varid'>occNameString</span> <span class='hs-varid'>cls_occ</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="mkLocalOcc"></a><span class='hs-definition'>mkLocalOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unique</span> 		<span class='hs-comment'>-- ^ Unique to combine with the 'OccName'</span>
<a name="line-8"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>		<span class='hs-comment'>-- ^ Local name, e.g. @sat@</span>
<a name="line-9"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>		<span class='hs-comment'>-- ^ Nice unique version, e.g. @$L23sat@</span>
<a name="line-10"></a><span class='hs-definition'>mkLocalOcc</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>occ</span>
<a name="line-11"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_deriv</span> <span class='hs-varid'>varName</span> <span class='hs-layout'>(</span><span class='hs-str'>"$L"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>uniq</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>occNameString</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
<a name="line-12"></a>	<span class='hs-comment'>-- The Unique might print with characters </span>
<a name="line-13"></a>	<span class='hs-comment'>-- that need encoding (e.g. 'z'!)</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkInstTyTcOcc"></a><span class='hs-comment'>-- | Derive a name for the representation type constructor of a</span>
<a name="line-2"></a><span class='hs-comment'>-- @data@\/@newtype@ instance.</span>
<a name="line-3"></a><span class='hs-definition'>mkInstTyTcOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> 		<span class='hs-comment'>-- ^ Family name, e.g. @Map@</span>
<a name="line-4"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>                 <span class='hs-comment'>-- ^ avoid these Occs</span>
<a name="line-5"></a>	      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>		<span class='hs-comment'>-- ^ @R:Map@</span>
<a name="line-6"></a><span class='hs-definition'>mkInstTyTcOcc</span> <span class='hs-varid'>str</span> <span class='hs-varid'>set</span> <span class='hs-keyglyph'>=</span>
<a name="line-7"></a>  <span class='hs-varid'>chooseUniqueOcc</span> <span class='hs-varid'>tcName</span> <span class='hs-layout'>(</span><span class='hs-chr'>'R'</span> <span class='hs-conop'>:</span> <span class='hs-chr'>':'</span> <span class='hs-conop'>:</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span> <span class='hs-varid'>set</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkDFunOcc"></a><span class='hs-definition'>mkDFunOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>		<span class='hs-comment'>-- ^ Typically the class and type glommed together e.g. @OrdMaybe@.</span>
<a name="line-2"></a>				<span class='hs-comment'>-- Only used in debug mode, for extra clarity</span>
<a name="line-3"></a>	  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>		<span class='hs-comment'>-- ^ Is this a hs-boot instance DFun?</span>
<a name="line-4"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span>             <span class='hs-comment'>-- ^ avoid these Occs</span>
<a name="line-5"></a>	  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>		<span class='hs-comment'>-- ^ E.g. @$f3OrdMaybe@</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-comment'>-- In hs-boot files we make dict funs like $fx7ClsTy, which get bound to the real</span>
<a name="line-8"></a><span class='hs-comment'>-- thing when we compile the mother module. Reason: we don't know exactly</span>
<a name="line-9"></a><span class='hs-comment'>-- what the  mother module will call it.</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-definition'>mkDFunOcc</span> <span class='hs-varid'>info_str</span> <span class='hs-varid'>is_boot</span> <span class='hs-varid'>set</span>
<a name="line-12"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>chooseUniqueOcc</span> <span class='hs-conid'>VarName</span> <span class='hs-layout'>(</span><span class='hs-varid'>prefix</span> <span class='hs-varop'>++</span> <span class='hs-varid'>info_str</span><span class='hs-layout'>)</span> <span class='hs-varid'>set</span>
<a name="line-13"></a>  <span class='hs-keyword'>where</span>
<a name="line-14"></a>    <span class='hs-varid'>prefix</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>is_boot</span>   <span class='hs-keyglyph'>=</span> <span class='hs-str'>"$fx"</span>
<a name="line-15"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"$f"</span>
</pre>\end{code}

Sometimes we need to pick an OccName that has not already been used,
given a set of in-use OccNames.

\begin{code}
<pre><a name="line-1"></a><a name="chooseUniqueOcc"></a><span class='hs-definition'>chooseUniqueOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-2"></a><span class='hs-definition'>chooseUniqueOcc</span> <span class='hs-varid'>ns</span> <span class='hs-varid'>str</span> <span class='hs-varid'>set</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkOccName</span> <span class='hs-varid'>ns</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyword'>where</span>
<a name="line-4"></a>  <span class='hs-varid'>loop</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>n</span>
<a name="line-5"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>occ</span> <span class='hs-varop'>`elemOccSet`</span> <span class='hs-varid'>set</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkOccName</span> <span class='hs-varid'>ns</span> <span class='hs-layout'>(</span><span class='hs-varid'>str</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</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'>occ</span>
</pre>\end{code}

We used to add a '$m' to indicate a method, but that gives rise to bad
error messages from the type checker when we print the function name or pattern
of an instance-decl binding.  Why? Because the binding is zapped
to use the method name in place of the selector name.
(See TcClassDcl.tcMethodBind)

The way it is now, -ddump-xx output may look confusing, but
you can always say -dppr-debug to get the uniques.

However, we *do* have to zap the first character to be lower case,
because overloaded constructors (blarg) generate methods too.
And convert to VarName space

e.g. a call to constructor MkFoo where
	data (Ord a) => Foo a = MkFoo a

If this is necessary, we do it by prefixing '$m'.  These 
guys never show up in error messages.  What a hack.

\begin{code}
<pre><a name="line-1"></a><a name="mkMethodOcc"></a><span class='hs-definition'>mkMethodOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-2"></a><span class='hs-definition'>mkMethodOcc</span> <span class='hs-varid'>occ</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-conid'>VarName</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occ</span>
<a name="line-3"></a><span class='hs-definition'>mkMethodOcc</span> <span class='hs-varid'>occ</span>                     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_simple_deriv</span> <span class='hs-varid'>varName</span> <span class='hs-str'>"$m"</span> <span class='hs-varid'>occ</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Tidying them up}
%*									*
%************************************************************************

Before we print chunks of code we like to rename it so that
we don't have to print lots of silly uniques in it.  But we mustn't
accidentally introduce name clashes!  So the idea is that we leave the
OccName alone unless it accidentally clashes with one that is already
in scope; if so, we tack on '1' at the end and try again, then '2', and
so on till we find a unique one.

There's a wrinkle for operators.  Consider '>>='.  We can't use '>>=1' 
because that isn't a single lexeme.  So we encode it to 'lle' and *then*
tack on the '1', if necessary.

\begin{code}
<pre><a name="line-1"></a><a name="TidyOccEnv"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>TidyOccEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OccEnv</span> <span class='hs-conid'>Int</span>	<span class='hs-comment'>-- The in-scope OccNames</span>
<a name="line-2"></a>	<span class='hs-comment'>-- Range gives a plausible starting point for new guesses</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="emptyTidyOccEnv"></a><span class='hs-definition'>emptyTidyOccEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TidyOccEnv</span>
<a name="line-5"></a><span class='hs-definition'>emptyTidyOccEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyOccEnv</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="initTidyOccEnv"></a><span class='hs-definition'>initTidyOccEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OccName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TidyOccEnv</span>	<span class='hs-comment'>-- Initialise with names to avoid!</span>
<a name="line-8"></a><span class='hs-definition'>initTidyOccEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>env</span> <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>extendOccEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>occ</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>emptyTidyOccEnv</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="tidyOccName"></a><span class='hs-definition'>tidyOccName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TidyOccEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TidyOccEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>OccName</span><span class='hs-layout'>)</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-definition'>tidyOccName</span> <span class='hs-varid'>in_scope</span> <span class='hs-varid'>occ</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>occ_sp</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-13"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupOccEnv</span> <span class='hs-varid'>in_scope</span> <span class='hs-varid'>occ</span> <span class='hs-keyword'>of</span>
<a name="line-14"></a>	<span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> 	<span class='hs-comment'>-- Not already used: make it used</span>
<a name="line-15"></a>		   <span class='hs-layout'>(</span><span class='hs-varid'>extendOccEnv</span> <span class='hs-varid'>in_scope</span> <span class='hs-varid'>occ</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
<a name="line-16"></a>
<a name="line-17"></a>	<span class='hs-conid'>Just</span> <span class='hs-varid'>n</span>  <span class='hs-keyglyph'>-&gt;</span> 	<span class='hs-comment'>-- Already used: make a new guess, </span>
<a name="line-18"></a>			<span class='hs-comment'>-- change the guess base, and try again</span>
<a name="line-19"></a>		   <span class='hs-varid'>tidyOccName</span>  <span class='hs-layout'>(</span><span class='hs-varid'>extendOccEnv</span> <span class='hs-varid'>in_scope</span> <span class='hs-varid'>occ</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-20"></a>				<span class='hs-layout'>(</span><span class='hs-varid'>mkOccName</span> <span class='hs-varid'>occ_sp</span> <span class='hs-layout'>(</span><span class='hs-varid'>unpackFS</span> <span class='hs-varid'>fs</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
		Stuff for dealing with tuples
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="mkTupleOcc"></a><span class='hs-definition'>mkTupleOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Boxity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Arity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span>
<a name="line-2"></a><span class='hs-definition'>mkTupleOcc</span> <span class='hs-varid'>ns</span> <span class='hs-varid'>bx</span> <span class='hs-varid'>ar</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OccName</span> <span class='hs-varid'>ns</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkFastString</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyword'>where</span>
<a name="line-4"></a> 	<span class='hs-comment'>-- no need to cache these, the caching is done in the caller</span>
<a name="line-5"></a>	<span class='hs-comment'>-- (TysWiredIn.mk_tuple)</span>
<a name="line-6"></a>    <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>bx</span> <span class='hs-keyword'>of</span>
<a name="line-7"></a>		<span class='hs-conid'>Boxed</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-chr'>'('</span> <span class='hs-conop'>:</span> <span class='hs-varid'>commas</span> <span class='hs-varop'>++</span> <span class='hs-str'>")"</span>
<a name="line-8"></a>		<span class='hs-conid'>Unboxed</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-chr'>'('</span> <span class='hs-conop'>:</span> <span class='hs-chr'>'#'</span> <span class='hs-conop'>:</span> <span class='hs-varid'>commas</span> <span class='hs-varop'>++</span> <span class='hs-str'>"#)"</span>
<a name="line-9"></a>
<a name="line-10"></a>    <span class='hs-varid'>commas</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-varid'>ar</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-varid'>repeat</span> <span class='hs-chr'>','</span><span class='hs-layout'>)</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="isTupleOcc_maybe"></a><span class='hs-definition'>isTupleOcc_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>NameSpace</span><span class='hs-layout'>,</span> <span class='hs-conid'>Boxity</span><span class='hs-layout'>,</span> <span class='hs-conid'>Arity</span><span class='hs-layout'>)</span>
<a name="line-13"></a><span class='hs-comment'>-- Tuples are special, because there are so many of them!</span>
<a name="line-14"></a><span class='hs-definition'>isTupleOcc_maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>ns</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>unpackFS</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-16"></a>	<span class='hs-chr'>'('</span><span class='hs-conop'>:</span><span class='hs-chr'>'#'</span><span class='hs-conop'>:</span><span class='hs-chr'>','</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>ns</span><span class='hs-layout'>,</span> <span class='hs-conid'>Unboxed</span><span class='hs-layout'>,</span> <span class='hs-num'>2</span> <span class='hs-varop'>+</span> <span class='hs-varid'>count_commas</span> <span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-17"></a>	<span class='hs-chr'>'('</span><span class='hs-conop'>:</span><span class='hs-chr'>','</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>ns</span><span class='hs-layout'>,</span> <span class='hs-conid'>Boxed</span><span class='hs-layout'>,</span>   <span class='hs-num'>2</span> <span class='hs-varop'>+</span> <span class='hs-varid'>count_commas</span> <span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-18"></a>	<span class='hs-sel'>_other</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-19"></a>  <span class='hs-keyword'>where</span>
<a name="line-20"></a>    <span class='hs-varid'>count_commas</span> <span class='hs-layout'>(</span><span class='hs-chr'>','</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>count_commas</span> <span class='hs-varid'>rest</span>
<a name="line-21"></a>    <span class='hs-varid'>count_commas</span> <span class='hs-keyword'>_</span>          <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Lexical categories}
%*									*
%************************************************************************

These functions test strings to see if they fit the lexical categories
defined in the Haskell report.

\begin{code}
<pre><a name="line-1"></a><a name="isLexCon"></a><span class='hs-definition'>isLexCon</span><span class='hs-layout'>,</span>   <span class='hs-varid'>isLexVar</span><span class='hs-layout'>,</span>    <span class='hs-varid'>isLexId</span><span class='hs-layout'>,</span>    <span class='hs-varid'>isLexSym</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-2"></a><a name="isLexConId"></a><span class='hs-definition'>isLexConId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexConSym</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexVarId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLexVarSym</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-definition'>isLexCon</span> <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexConId</span>  <span class='hs-varid'>cs</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isLexConSym</span> <span class='hs-varid'>cs</span>
<a name="line-5"></a><a name="isLexVar"></a><span class='hs-definition'>isLexVar</span> <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexVarId</span>  <span class='hs-varid'>cs</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isLexVarSym</span> <span class='hs-varid'>cs</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="isLexId"></a><span class='hs-definition'>isLexId</span>  <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexConId</span>  <span class='hs-varid'>cs</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isLexVarId</span>  <span class='hs-varid'>cs</span>
<a name="line-8"></a><a name="isLexSym"></a><span class='hs-definition'>isLexSym</span> <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLexConSym</span> <span class='hs-varid'>cs</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isLexVarSym</span> <span class='hs-varid'>cs</span>
<a name="line-9"></a>
<a name="line-10"></a><span class='hs-comment'>-------------</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-definition'>isLexConId</span> <span class='hs-varid'>cs</span>				<span class='hs-comment'>-- Prefix type or data constructors</span>
<a name="line-13"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nullFS</span> <span class='hs-varid'>cs</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>		<span class='hs-comment'>-- 	e.g. "Foo", "[]", "(,)" </span>
<a name="line-14"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>cs</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"[]"</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-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>startsConId</span> <span class='hs-layout'>(</span><span class='hs-varid'>headFS</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="isLexVarId"></a><span class='hs-definition'>isLexVarId</span> <span class='hs-varid'>cs</span>				<span class='hs-comment'>-- Ordinary prefix identifiers</span>
<a name="line-18"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nullFS</span> <span class='hs-varid'>cs</span>	      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>		<span class='hs-comment'>-- 	e.g. "x", "_x"</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-varid'>startsVarId</span> <span class='hs-layout'>(</span><span class='hs-varid'>headFS</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="isLexConSym"></a><span class='hs-definition'>isLexConSym</span> <span class='hs-varid'>cs</span>				<span class='hs-comment'>-- Infix type or data constructors</span>
<a name="line-22"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nullFS</span> <span class='hs-varid'>cs</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>		<span class='hs-comment'>--	e.g. ":-:", ":", "-&gt;"</span>
<a name="line-23"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>cs</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"-&gt;"</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-24"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>startsConSym</span> <span class='hs-layout'>(</span><span class='hs-varid'>headFS</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="isLexVarSym"></a><span class='hs-definition'>isLexVarSym</span> <span class='hs-varid'>cs</span>				<span class='hs-comment'>-- Infix identifiers</span>
<a name="line-27"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nullFS</span> <span class='hs-varid'>cs</span>	      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>		<span class='hs-comment'>-- 	e.g. "+"</span>
<a name="line-28"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>startsVarSym</span> <span class='hs-layout'>(</span><span class='hs-varid'>headFS</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="startsVarSym"></a><span class='hs-comment'>-------------</span>
<a name="line-31"></a><span class='hs-definition'>startsVarSym</span><span class='hs-layout'>,</span> <span class='hs-varid'>startsVarId</span><span class='hs-layout'>,</span> <span class='hs-varid'>startsConSym</span><span class='hs-layout'>,</span> <span class='hs-varid'>startsConId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-32"></a><span class='hs-definition'>startsVarSym</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isSymbolASCII</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0x7f</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>isSymbol</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- Infix Ids</span>
<a name="line-33"></a><a name="startsConSym"></a><span class='hs-definition'>startsConSym</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>':'</span>				<span class='hs-comment'>-- Infix data constructors</span>
<a name="line-34"></a><a name="startsVarId"></a><span class='hs-definition'>startsVarId</span> <span class='hs-varid'>c</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isLower</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'_'</span>	<span class='hs-comment'>-- Ordinary Ids</span>
<a name="line-35"></a><a name="startsConId"></a><span class='hs-definition'>startsConId</span> <span class='hs-varid'>c</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isUpper</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'('</span>	<span class='hs-comment'>-- Ordinary type constructors and data constructors</span>
<a name="line-36"></a>
<a name="line-37"></a><a name="isSymbolASCII"></a><span class='hs-definition'>isSymbolASCII</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-38"></a><span class='hs-definition'>isSymbolASCII</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-varop'>`elem`</span> <span class='hs-str'>"!#$%&amp;*+./&lt;=&gt;?@\\^|~-"</span>
</pre>\end{code}

%************************************************************************
%*									*
		Binary instance
    Here rather than BinIface because OccName is abstract
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Binary</span> <span class='hs-conid'>NameSpace</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-conid'>VarName</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-3"></a>	    <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>0</span>
<a name="line-4"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-conid'>DataName</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-5"></a>	    <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>1</span>
<a name="line-6"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-conid'>TvName</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-7"></a>	    <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>2</span>
<a name="line-8"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-conid'>TcClsName</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-9"></a>	    <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>3</span>
<a name="line-10"></a>    <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-11"></a>	    <span class='hs-varid'>h</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getByte</span> <span class='hs-varid'>bh</span>
<a name="line-12"></a>	    <span class='hs-keyword'>case</span> <span class='hs-varid'>h</span> <span class='hs-keyword'>of</span>
<a name="line-13"></a>	      <span class='hs-num'>0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>return</span> <span class='hs-conid'>VarName</span>
<a name="line-14"></a>	      <span class='hs-num'>1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>return</span> <span class='hs-conid'>DataName</span>
<a name="line-15"></a>	      <span class='hs-num'>2</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>return</span> <span class='hs-conid'>TvName</span>
<a name="line-16"></a>	      <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>return</span> <span class='hs-conid'>TcClsName</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Binary</span> <span class='hs-conid'>OccName</span> <span class='hs-keyword'>where</span>
<a name="line-19"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>aa</span> <span class='hs-varid'>ab</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-20"></a>	    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>aa</span>
<a name="line-21"></a>	    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>ab</span>
<a name="line-22"></a>    <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-23"></a>	  <span class='hs-varid'>aa</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-24"></a>	  <span class='hs-varid'>ab</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-25"></a>	  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-varid'>aa</span> <span class='hs-varid'>ab</span><span class='hs-layout'>)</span>
</pre>\end{code}
</body>
</html>