Sophie

Sophie

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

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/BasicTypes.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, 1997-1998
%
\section[BasicTypes]{Miscellanous types}

This module defines a miscellaneously collection of very simple
types that

\begin{itemize}
\item have no other obvious home
\item don't depend on any other complicated types
\item are used in more than one "part" of the compiler
\end{itemize}

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>BasicTypes</span><span class='hs-layout'>(</span>
<a name="line-2"></a>	<span class='hs-conid'>Version</span><span class='hs-layout'>,</span> <span class='hs-varid'>bumpVersion</span><span class='hs-layout'>,</span> <span class='hs-varid'>initialVersion</span><span class='hs-layout'>,</span>
<a name="line-3"></a>
<a name="line-4"></a>	<span class='hs-conid'>Arity</span><span class='hs-layout'>,</span> 
<a name="line-5"></a>
<a name="line-6"></a>    <span class='hs-conid'>FunctionOrData</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-7"></a>	
<a name="line-8"></a>	<span class='hs-conid'>WarningTxt</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-9"></a>
<a name="line-10"></a>	<span class='hs-conid'>Fixity</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>FixityDirection</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-11"></a>	<span class='hs-varid'>defaultFixity</span><span class='hs-layout'>,</span> <span class='hs-varid'>maxPrecedence</span><span class='hs-layout'>,</span> 
<a name="line-12"></a>	<span class='hs-varid'>negateFixity</span><span class='hs-layout'>,</span> <span class='hs-varid'>funTyFixity</span><span class='hs-layout'>,</span>
<a name="line-13"></a>	<span class='hs-varid'>compareFixity</span><span class='hs-layout'>,</span>
<a name="line-14"></a>
<a name="line-15"></a>	<span class='hs-conid'>IPName</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>ipNameName</span><span class='hs-layout'>,</span> <span class='hs-varid'>mapIPName</span><span class='hs-layout'>,</span>
<a name="line-16"></a>
<a name="line-17"></a>	<span class='hs-conid'>RecFlag</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isRec</span><span class='hs-layout'>,</span> <span class='hs-varid'>isNonRec</span><span class='hs-layout'>,</span> <span class='hs-varid'>boolToRecFlag</span><span class='hs-layout'>,</span>
<a name="line-18"></a>
<a name="line-19"></a>	<span class='hs-conid'>RuleName</span><span class='hs-layout'>,</span>
<a name="line-20"></a>
<a name="line-21"></a>	<span class='hs-conid'>TopLevelFlag</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isTopLevel</span><span class='hs-layout'>,</span> <span class='hs-varid'>isNotTopLevel</span><span class='hs-layout'>,</span>
<a name="line-22"></a>
<a name="line-23"></a>	<span class='hs-conid'>OverlapFlag</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-conid'>Boxity</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isBoxed</span><span class='hs-layout'>,</span> 
<a name="line-26"></a>
<a name="line-27"></a>	<span class='hs-conid'>TupCon</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>tupleParens</span><span class='hs-layout'>,</span>
<a name="line-28"></a>
<a name="line-29"></a>	<span class='hs-conid'>OccInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>seqOccInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>isFragileOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isOneOcc</span><span class='hs-layout'>,</span> 
<a name="line-30"></a>	<span class='hs-varid'>isDeadOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLoopBreaker</span><span class='hs-layout'>,</span> <span class='hs-varid'>isNonRuleLoopBreaker</span><span class='hs-layout'>,</span> <span class='hs-varid'>isNoOcc</span><span class='hs-layout'>,</span>
<a name="line-31"></a>
<a name="line-32"></a>	<span class='hs-conid'>InsideLam</span><span class='hs-layout'>,</span> <span class='hs-varid'>insideLam</span><span class='hs-layout'>,</span> <span class='hs-varid'>notInsideLam</span><span class='hs-layout'>,</span>
<a name="line-33"></a>	<span class='hs-conid'>OneBranch</span><span class='hs-layout'>,</span> <span class='hs-varid'>oneBranch</span><span class='hs-layout'>,</span> <span class='hs-varid'>notOneBranch</span><span class='hs-layout'>,</span>
<a name="line-34"></a>	<span class='hs-conid'>InterestingCxt</span><span class='hs-layout'>,</span>
<a name="line-35"></a>
<a name="line-36"></a>        <span class='hs-conid'>EP</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-37"></a>
<a name="line-38"></a>	<span class='hs-conid'>StrictnessMark</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isMarkedUnboxed</span><span class='hs-layout'>,</span> <span class='hs-varid'>isMarkedStrict</span><span class='hs-layout'>,</span>
<a name="line-39"></a>
<a name="line-40"></a>	<span class='hs-conid'>CompilerPhase</span><span class='hs-layout'>,</span> 
<a name="line-41"></a>	<span class='hs-conid'>Activation</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isActive</span><span class='hs-layout'>,</span> <span class='hs-varid'>isNeverActive</span><span class='hs-layout'>,</span> <span class='hs-varid'>isAlwaysActive</span><span class='hs-layout'>,</span>
<a name="line-42"></a>        <span class='hs-conid'>RuleMatchInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isConLike</span><span class='hs-layout'>,</span> <span class='hs-varid'>isFunLike</span><span class='hs-layout'>,</span>
<a name="line-43"></a>        <span class='hs-conid'>InlinePragma</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>defaultInlinePragma</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDefaultInlinePragma</span><span class='hs-layout'>,</span>
<a name="line-44"></a>        <span class='hs-varid'>inlinePragmaActivation</span><span class='hs-layout'>,</span> <span class='hs-varid'>inlinePragmaRuleMatchInfo</span><span class='hs-layout'>,</span>
<a name="line-45"></a>        <span class='hs-varid'>setInlinePragmaActivation</span><span class='hs-layout'>,</span> <span class='hs-varid'>setInlinePragmaRuleMatchInfo</span><span class='hs-layout'>,</span>
<a name="line-46"></a>	<span class='hs-conid'>InlineSpec</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>defaultInlineSpec</span><span class='hs-layout'>,</span> <span class='hs-varid'>alwaysInlineSpec</span><span class='hs-layout'>,</span> <span class='hs-varid'>neverInlineSpec</span><span class='hs-layout'>,</span>
<a name="line-47"></a>
<a name="line-48"></a>	<span class='hs-conid'>SuccessFlag</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>succeeded</span><span class='hs-layout'>,</span> <span class='hs-varid'>failed</span><span class='hs-layout'>,</span> <span class='hs-varid'>successIf</span>
<a name="line-49"></a>   <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-50"></a>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection[Arity]{Arity}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="Arity"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Arity</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection[FunctionOrData]{FunctionOrData}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="FunctionOrData"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>FunctionOrData</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IsFunction</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IsData</span>
<a name="line-2"></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-3"></a>
<a name="line-4"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>FunctionOrData</span> <span class='hs-keyword'>where</span>
<a name="line-5"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>IsFunction</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"(function)"</span>
<a name="line-6"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>IsData</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"(data)"</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection[Version]{Module and identifier version numbers}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="Version"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Version</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="bumpVersion"></a><span class='hs-definition'>bumpVersion</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Version</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Version</span> 
<a name="line-4"></a><span class='hs-definition'>bumpVersion</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span><span class='hs-varop'>+</span><span class='hs-num'>1</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="initialVersion"></a><span class='hs-definition'>initialVersion</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Version</span>
<a name="line-7"></a><span class='hs-definition'>initialVersion</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span>
</pre>\end{code}

%************************************************************************
%*									*
		Deprecations
%*									*
%************************************************************************


\begin{code}
<pre><a name="line-1"></a><a name="WarningTxt"></a><span class='hs-comment'>-- reason/explanation from a WARNING or DEPRECATED pragma</span>
<a name="line-2"></a><a name="WarningTxt"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>WarningTxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WarningTxt</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FastString</span><span class='hs-keyglyph'>]</span>
<a name="line-3"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DeprecatedTxt</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FastString</span><span class='hs-keyglyph'>]</span>
<a name="line-4"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Eq</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>WarningTxt</span> <span class='hs-keyword'>where</span>
<a name="line-7"></a>    <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>WarningTxt</span>    <span class='hs-varid'>ws</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doubleQuotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ftext</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-8"></a>    <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>DeprecatedTxt</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Deprecated:"</span> <span class='hs-varop'>&lt;+&gt;</span>
<a name="line-9"></a>                             <span class='hs-varid'>doubleQuotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ftext</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Implicit parameter identity}
%*									*
%************************************************************************

The @IPName@ type is here because it is used in TypeRep (i.e. very
early in the hierarchy), but also in HsSyn.

\begin{code}
<pre><a name="line-1"></a><a name="IPName"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>IPName</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IPName</span> <span class='hs-varid'>name</span>	<span class='hs-comment'>-- ?x</span>
<a name="line-2"></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>	<span class='hs-comment'>-- Ord is used in the IP name cache finite map</span>
<a name="line-3"></a>			<span class='hs-comment'>--	(used in HscTypes.OrigIParamCache)</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="ipNameName"></a><span class='hs-definition'>ipNameName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IPName</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>name</span>
<a name="line-6"></a><span class='hs-definition'>ipNameName</span> <span class='hs-layout'>(</span><span class='hs-conid'>IPName</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="mapIPName"></a><span class='hs-definition'>mapIPName</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'>IPName</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IPName</span> <span class='hs-varid'>b</span>
<a name="line-9"></a><span class='hs-definition'>mapIPName</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>IPName</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IPName</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Outputable</span> <span class='hs-layout'>(</span><span class='hs-conid'>IPName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-12"></a>    <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IPName</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'?'</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span> <span class='hs-comment'>-- Ordinary implicit parameters</span>
</pre>\end{code}

%************************************************************************
%*									*
		Rules
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="RuleName"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>RuleName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FastString</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection[Fixity]{Fixity info}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="Fixity"></a><span class='hs-comment'>------------------------</span>
<a name="line-2"></a><a name="Fixity"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Fixity</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fixity</span> <span class='hs-conid'>Int</span> <span class='hs-conid'>FixityDirection</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Fixity</span> <span class='hs-keyword'>where</span>
<a name="line-5"></a>    <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Fixity</span> <span class='hs-varid'>prec</span> <span class='hs-varid'>dir</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>dir</span><span class='hs-layout'>,</span> <span class='hs-varid'>space</span><span class='hs-layout'>,</span> <span class='hs-varid'>int</span> <span class='hs-varid'>prec</span><span class='hs-keyglyph'>]</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>Fixity</span> <span class='hs-keyword'>where</span>		<span class='hs-comment'>-- Used to determine if two fixities conflict</span>
<a name="line-8"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>Fixity</span> <span class='hs-varid'>p1</span> <span class='hs-varid'>dir1</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-conid'>Fixity</span> <span class='hs-varid'>p2</span> <span class='hs-varid'>dir2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p1</span><span class='hs-varop'>==</span><span class='hs-varid'>p2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>dir1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>dir2</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="FixityDirection"></a><span class='hs-comment'>------------------------</span>
<a name="line-11"></a><a name="FixityDirection"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>FixityDirection</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InfixL</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>InfixR</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>InfixN</span> 
<a name="line-12"></a>		     <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>)</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>FixityDirection</span> <span class='hs-keyword'>where</span>
<a name="line-15"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>InfixL</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'>"infixl"</span><span class='hs-layout'>)</span>
<a name="line-16"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>InfixR</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'>"infixr"</span><span class='hs-layout'>)</span>
<a name="line-17"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>InfixN</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'>"infix"</span><span class='hs-layout'>)</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="maxPrecedence"></a><span class='hs-comment'>------------------------</span>
<a name="line-20"></a><span class='hs-definition'>maxPrecedence</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-21"></a><span class='hs-definition'>maxPrecedence</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>9</span>
<a name="line-22"></a><a name="defaultFixity"></a><span class='hs-definition'>defaultFixity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fixity</span>
<a name="line-23"></a><span class='hs-definition'>defaultFixity</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fixity</span> <span class='hs-varid'>maxPrecedence</span> <span class='hs-conid'>InfixL</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="negateFixity"></a><span class='hs-definition'>negateFixity</span><span class='hs-layout'>,</span> <span class='hs-varid'>funTyFixity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fixity</span>
<a name="line-26"></a><span class='hs-comment'>-- Wired-in fixities</span>
<a name="line-27"></a><span class='hs-definition'>negateFixity</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fixity</span> <span class='hs-num'>6</span> <span class='hs-conid'>InfixL</span> 	<span class='hs-comment'>-- Fixity of unary negate</span>
<a name="line-28"></a><a name="funTyFixity"></a><span class='hs-definition'>funTyFixity</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fixity</span> <span class='hs-num'>0</span>	<span class='hs-conid'>InfixR</span>	<span class='hs-comment'>-- Fixity of '-&gt;'</span>
</pre>\end{code}

Consider

\begin{verbatim}
	a `op1` b `op2` c
\end{verbatim}
@(compareFixity op1 op2)@ tells which way to arrange appication, or
whether there's an error.

\begin{code}
<pre><a name="line-1"></a><a name="compareFixity"></a><span class='hs-definition'>compareFixity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fixity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Fixity</span>
<a name="line-2"></a>	      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bool</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- Error please</span>
<a name="line-3"></a>		  <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>		<span class='hs-comment'>-- Associate to the right: a op1 (b op2 c)</span>
<a name="line-4"></a><span class='hs-definition'>compareFixity</span> <span class='hs-layout'>(</span><span class='hs-conid'>Fixity</span> <span class='hs-varid'>prec1</span> <span class='hs-varid'>dir1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Fixity</span> <span class='hs-varid'>prec2</span> <span class='hs-varid'>dir2</span><span class='hs-layout'>)</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>prec1</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>prec2</span> <span class='hs-keyword'>of</span>
<a name="line-6"></a>	<span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>left</span>
<a name="line-7"></a>	<span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>right</span>
<a name="line-8"></a>	<span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>dir1</span><span class='hs-layout'>,</span> <span class='hs-varid'>dir2</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-9"></a>			<span class='hs-layout'>(</span><span class='hs-conid'>InfixR</span><span class='hs-layout'>,</span> <span class='hs-conid'>InfixR</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>right</span>
<a name="line-10"></a>			<span class='hs-layout'>(</span><span class='hs-conid'>InfixL</span><span class='hs-layout'>,</span> <span class='hs-conid'>InfixL</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>left</span>
<a name="line-11"></a>			<span class='hs-keyword'>_</span>		 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error_please</span>
<a name="line-12"></a>  <span class='hs-keyword'>where</span>
<a name="line-13"></a>    <span class='hs-varid'>right</span>	 <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>False</span><span class='hs-layout'>,</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span>
<a name="line-14"></a>    <span class='hs-varid'>left</span>         <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>False</span><span class='hs-layout'>,</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-15"></a>    <span class='hs-varid'>error_please</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>True</span><span class='hs-layout'>,</span>  <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection[Top-level/local]{Top-level/not-top level flag}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="TopLevelFlag"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TopLevelFlag</span>
<a name="line-2"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TopLevel</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotTopLevel</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="isTopLevel"></a><span class='hs-definition'>isTopLevel</span><span class='hs-layout'>,</span> <span class='hs-varid'>isNotTopLevel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TopLevelFlag</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="isNotTopLevel"></a><span class='hs-definition'>isNotTopLevel</span> <span class='hs-conid'>NotTopLevel</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-8"></a><span class='hs-definition'>isNotTopLevel</span> <span class='hs-conid'>TopLevel</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-9"></a>
<a name="line-10"></a><span class='hs-definition'>isTopLevel</span> <span class='hs-conid'>TopLevel</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-11"></a><span class='hs-definition'>isTopLevel</span> <span class='hs-conid'>NotTopLevel</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-12"></a>
<a name="line-13"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>TopLevelFlag</span> <span class='hs-keyword'>where</span>
<a name="line-14"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>TopLevel</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'>"&lt;TopLevel&gt;"</span><span class='hs-layout'>)</span>
<a name="line-15"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>NotTopLevel</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'>"&lt;NotTopLevel&gt;"</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
		Top-level/not-top level flag
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="Boxity"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Boxity</span>
<a name="line-2"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Boxed</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Unboxed</span>
<a name="line-4"></a>  <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="isBoxed"></a><span class='hs-definition'>isBoxed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Boxity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-7"></a><span class='hs-definition'>isBoxed</span> <span class='hs-conid'>Boxed</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-8"></a><span class='hs-definition'>isBoxed</span> <span class='hs-conid'>Unboxed</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
</pre>\end{code}


%************************************************************************
%*									*
		Recursive/Non-Recursive flag
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="RecFlag"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>RecFlag</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Recursive</span> 
<a name="line-2"></a>	     <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NonRecursive</span>
<a name="line-3"></a>	     <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="isRec"></a><span class='hs-definition'>isRec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RecFlag</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-6"></a><span class='hs-definition'>isRec</span> <span class='hs-conid'>Recursive</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-7"></a><span class='hs-definition'>isRec</span> <span class='hs-conid'>NonRecursive</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="isNonRec"></a><span class='hs-definition'>isNonRec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RecFlag</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-10"></a><span class='hs-definition'>isNonRec</span> <span class='hs-conid'>Recursive</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-11"></a><span class='hs-definition'>isNonRec</span> <span class='hs-conid'>NonRecursive</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="boolToRecFlag"></a><span class='hs-definition'>boolToRecFlag</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RecFlag</span>
<a name="line-14"></a><span class='hs-definition'>boolToRecFlag</span> <span class='hs-conid'>True</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Recursive</span>
<a name="line-15"></a><span class='hs-definition'>boolToRecFlag</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NonRecursive</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>RecFlag</span> <span class='hs-keyword'>where</span>
<a name="line-18"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>Recursive</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'>"Recursive"</span><span class='hs-layout'>)</span>
<a name="line-19"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>NonRecursive</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'>"NonRecursive"</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
		Instance overlap flag
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="OverlapFlag"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>OverlapFlag</span>
<a name="line-2"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoOverlap</span>	<span class='hs-comment'>-- This instance must not overlap another</span>
<a name="line-3"></a>
<a name="line-4"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OverlapOk</span>	<span class='hs-comment'>-- Silently ignore this instance if you find a </span>
<a name="line-5"></a>		<span class='hs-comment'>-- more specific one that matches the constraint</span>
<a name="line-6"></a>		<span class='hs-comment'>-- you are trying to resolve</span>
<a name="line-7"></a>		<span class='hs-comment'>--</span>
<a name="line-8"></a>		<span class='hs-comment'>-- Example: constraint (Foo [Int])</span>
<a name="line-9"></a>		<span class='hs-comment'>-- 	    instances  (Foo [Int])</span>
<a name="line-10"></a>		<span class='hs-comment'>--		       (Foo [a])	OverlapOk</span>
<a name="line-11"></a>		<span class='hs-comment'>-- Since the second instance has the OverlapOk flag,</span>
<a name="line-12"></a>		<span class='hs-comment'>-- the first instance will be chosen (otherwise </span>
<a name="line-13"></a>		<span class='hs-comment'>-- its ambiguous which to choose)</span>
<a name="line-14"></a>
<a name="line-15"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Incoherent</span>	<span class='hs-comment'>-- Like OverlapOk, but also ignore this instance </span>
<a name="line-16"></a>		<span class='hs-comment'>-- if it doesn't match the constraint you are</span>
<a name="line-17"></a>		<span class='hs-comment'>-- trying to resolve, but could match if the type variables</span>
<a name="line-18"></a>		<span class='hs-comment'>-- in the constraint were instantiated</span>
<a name="line-19"></a>		<span class='hs-comment'>--</span>
<a name="line-20"></a>		<span class='hs-comment'>-- Example: constraint (Foo [b])</span>
<a name="line-21"></a>		<span class='hs-comment'>--	    instances  (Foo [Int])	Incoherent</span>
<a name="line-22"></a>		<span class='hs-comment'>--		       (Foo [a])</span>
<a name="line-23"></a>		<span class='hs-comment'>-- Without the Incoherent flag, we'd complain that</span>
<a name="line-24"></a>		<span class='hs-comment'>-- instantiating 'b' would change which instance </span>
<a name="line-25"></a>		<span class='hs-comment'>-- was chosen</span>
<a name="line-26"></a>  <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-27"></a>
<a name="line-28"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>OverlapFlag</span> <span class='hs-keyword'>where</span>
<a name="line-29"></a>   <span class='hs-varid'>ppr</span> <span class='hs-conid'>NoOverlap</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-30"></a>   <span class='hs-varid'>ppr</span> <span class='hs-conid'>OverlapOk</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'>"[overlap ok]"</span><span class='hs-layout'>)</span>
<a name="line-31"></a>   <span class='hs-varid'>ppr</span> <span class='hs-conid'>Incoherent</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'>"[incoherent]"</span><span class='hs-layout'>)</span>
<a name="line-32"></a>
</pre>\end{code}

%************************************************************************
%*									*
		Tuples
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="TupCon"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TupCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TupCon</span> <span class='hs-conid'>Boxity</span> <span class='hs-conid'>Arity</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>TupCon</span> <span class='hs-keyword'>where</span>
<a name="line-4"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>TupCon</span> <span class='hs-varid'>b1</span> <span class='hs-varid'>a1</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-conid'>TupCon</span> <span class='hs-varid'>b2</span> <span class='hs-varid'>a2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b1</span><span class='hs-varop'>==</span><span class='hs-varid'>b2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>a1</span><span class='hs-varop'>==</span><span class='hs-varid'>a2</span>
<a name="line-5"></a>   
<a name="line-6"></a><a name="tupleParens"></a><span class='hs-definition'>tupleParens</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Boxity</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-7"></a><span class='hs-definition'>tupleParens</span> <span class='hs-conid'>Boxed</span>   <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>parens</span> <span class='hs-varid'>p</span>
<a name="line-8"></a><span class='hs-definition'>tupleParens</span> <span class='hs-conid'>Unboxed</span> <span class='hs-varid'>p</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'>"(#"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"#)"</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection[Generic]{Generic flag}
%*									*
%************************************************************************

This is the "Embedding-Projection pair" datatype, it contains 
two pieces of code (normally either RenamedExpr's or Id's)
If we have a such a pair (EP from to), the idea is that 'from' and 'to'
represents functions of type 

	from :: T -> Tring
	to   :: Tring -> T

And we should have 

	to (from x) = x

T and Tring are arbitrary, but typically T is the 'main' type while
Tring is the 'representation' type.  (This just helps us remember 
whether to use 'from' or 'to'.

\begin{code}
<pre><a name="line-1"></a><a name="EP"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>EP</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EP</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fromEP</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- :: T -&gt; Tring</span>
<a name="line-2"></a>		 <span class='hs-varid'>toEP</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-layout'>}</span>	<span class='hs-comment'>-- :: Tring -&gt; T</span>
</pre>\end{code}

Embedding-projection pairs are used in several places:

First of all, each type constructor has an EP associated with it, the
code in EP converts (datatype T) from T to Tring and back again.

Secondly, when we are filling in Generic methods (in the typechecker, 
tcMethodBinds), we are constructing bimaps by induction on the structure
of the type of the method signature.


%************************************************************************
%*									*
\subsection{Occurrence information}
%*									*
%************************************************************************

This data type is used exclusively by the simplifier, but it appears in a
SubstResult, which is currently defined in VarEnv, which is pretty near
the base of the module hierarchy.  So it seemed simpler to put the
defn of OccInfo here, safely at the bottom

\begin{code}
<pre><a name="line-1"></a><a name="OccInfo"></a><span class='hs-comment'>-- | Identifier occurrence information</span>
<a name="line-2"></a><a name="OccInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>OccInfo</span> 
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoOccInfo</span>		<span class='hs-comment'>-- ^ There are many occurrences, or unknown occurences</span>
<a name="line-4"></a>
<a name="line-5"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IAmDead</span>		<span class='hs-comment'>-- ^ Marks unused variables.  Sometimes useful for</span>
<a name="line-6"></a>			<span class='hs-comment'>-- lambda and case-bound variables.</span>
<a name="line-7"></a>
<a name="line-8"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OneOcc</span>
<a name="line-9"></a>	<span class='hs-varop'>!</span><span class='hs-conid'>InsideLam</span>
<a name="line-10"></a> 	<span class='hs-varop'>!</span><span class='hs-conid'>OneBranch</span>
<a name="line-11"></a>	<span class='hs-varop'>!</span><span class='hs-conid'>InterestingCxt</span> <span class='hs-comment'>-- ^ Occurs exactly once, not inside a rule</span>
<a name="line-12"></a>
<a name="line-13"></a>  <span class='hs-comment'>-- | This identifier breaks a loop of mutually recursive functions. The field</span>
<a name="line-14"></a>  <span class='hs-comment'>-- marks whether it is only a loop breaker due to a reference in a rule</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IAmALoopBreaker</span>	<span class='hs-comment'>-- Note [LoopBreaker OccInfo]</span>
<a name="line-16"></a>	<span class='hs-varop'>!</span><span class='hs-conid'>RulesOnly</span>	<span class='hs-comment'>-- True &lt;=&gt; This is a weak or rules-only loop breaker</span>
<a name="line-17"></a>			<span class='hs-comment'>--  	    See OccurAnal Note [Weak loop breakers]</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="RulesOnly"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>RulesOnly</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span>
</pre>\end{code}

Note [LoopBreaker OccInfo]
~~~~~~~~~~~~~~~~~~~~~~~~~~
An OccInfo of (IAmLoopBreaker False) is used by the occurrence 
analyser in two ways:
  (a) to mark loop-breakers in a group of recursive 
      definitions (hence the name)
  (b) to mark binders that must not be inlined in this phase
      (perhaps it has a NOINLINE pragma)
Things with (IAmLoopBreaker False) do not get an unfolding 
pinned on to them, so they are completely opaque.

See OccurAnal Note [Weak loop breakers] for (IAmLoopBreaker True).


\begin{code}
<pre><a name="line-1"></a><a name="isNoOcc"></a><span class='hs-definition'>isNoOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-2"></a><span class='hs-definition'>isNoOcc</span> <span class='hs-conid'>NoOccInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-3"></a><span class='hs-definition'>isNoOcc</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="seqOccInfo"></a><span class='hs-definition'>seqOccInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-6"></a><span class='hs-definition'>seqOccInfo</span> <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occ</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>()</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="InterestingCxt"></a><span class='hs-comment'>-----------------</span>
<a name="line-9"></a><a name="InterestingCxt"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>InterestingCxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span>	<span class='hs-comment'>-- True &lt;=&gt; Function: is applied</span>
<a name="line-10"></a>				<span class='hs-comment'>--	    Data value: scrutinised by a case with</span>
<a name="line-11"></a>				<span class='hs-comment'>--			at least one non-DEFAULT branch</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="InsideLam"></a><span class='hs-comment'>-----------------</span>
<a name="line-14"></a><a name="InsideLam"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>InsideLam</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span>	<span class='hs-comment'>-- True &lt;=&gt; Occurs inside a non-linear lambda</span>
<a name="line-15"></a>			<span class='hs-comment'>-- Substituting a redex for this occurrence is</span>
<a name="line-16"></a>			<span class='hs-comment'>-- dangerous because it might duplicate work.</span>
<a name="line-17"></a><a name="insideLam"></a><span class='hs-definition'>insideLam</span><span class='hs-layout'>,</span> <span class='hs-varid'>notInsideLam</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InsideLam</span>
<a name="line-18"></a><span class='hs-definition'>insideLam</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-19"></a><a name="notInsideLam"></a><span class='hs-definition'>notInsideLam</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="OneBranch"></a><span class='hs-comment'>-----------------</span>
<a name="line-22"></a><a name="OneBranch"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>OneBranch</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span>	<span class='hs-comment'>-- True &lt;=&gt; Occurs in only one case branch</span>
<a name="line-23"></a>			<span class='hs-comment'>--	so no code-duplication issue to worry about</span>
<a name="line-24"></a><a name="oneBranch"></a><span class='hs-definition'>oneBranch</span><span class='hs-layout'>,</span> <span class='hs-varid'>notOneBranch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OneBranch</span>
<a name="line-25"></a><span class='hs-definition'>oneBranch</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-26"></a><a name="notOneBranch"></a><span class='hs-definition'>notOneBranch</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="isLoopBreaker"></a><span class='hs-definition'>isLoopBreaker</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-29"></a><span class='hs-definition'>isLoopBreaker</span> <span class='hs-layout'>(</span><span class='hs-conid'>IAmALoopBreaker</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-30"></a><span class='hs-definition'>isLoopBreaker</span> <span class='hs-keyword'>_</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="isNonRuleLoopBreaker"></a><span class='hs-definition'>isNonRuleLoopBreaker</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-33"></a><span class='hs-definition'>isNonRuleLoopBreaker</span> <span class='hs-layout'>(</span><span class='hs-conid'>IAmALoopBreaker</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>   <span class='hs-comment'>-- Loop-breaker that breaks a non-rule cycle</span>
<a name="line-34"></a><span class='hs-definition'>isNonRuleLoopBreaker</span> <span class='hs-keyword'>_</span>                       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="isDeadOcc"></a><span class='hs-definition'>isDeadOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-37"></a><span class='hs-definition'>isDeadOcc</span> <span class='hs-conid'>IAmDead</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-38"></a><span class='hs-definition'>isDeadOcc</span> <span class='hs-keyword'>_</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-39"></a>
<a name="line-40"></a><a name="isOneOcc"></a><span class='hs-definition'>isOneOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-41"></a><span class='hs-definition'>isOneOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OneOcc</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-42"></a><span class='hs-definition'>isOneOcc</span> <span class='hs-keyword'>_</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="isFragileOcc"></a><span class='hs-definition'>isFragileOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-45"></a><span class='hs-definition'>isFragileOcc</span> <span class='hs-layout'>(</span><span class='hs-conid'>OneOcc</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-46"></a><span class='hs-definition'>isFragileOcc</span> <span class='hs-keyword'>_</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>  <span class='hs-comment'>-- only used for debugging; never parsed.  KSW 1999-07</span>
<a name="line-3"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>NoOccInfo</span>  	   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-4"></a>  <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IAmALoopBreaker</span> <span class='hs-varid'>ro</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"LoopBreaker"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>ro</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'!'</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>empty</span>
<a name="line-5"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>IAmDead</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'>"Dead"</span><span class='hs-layout'>)</span>
<a name="line-6"></a>  <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>OneOcc</span> <span class='hs-varid'>inside_lam</span> <span class='hs-varid'>one_branch</span> <span class='hs-varid'>int_cxt</span><span class='hs-layout'>)</span>
<a name="line-7"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Once"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>pp_lam</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>pp_br</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>pp_args</span>
<a name="line-8"></a>	<span class='hs-keyword'>where</span>
<a name="line-9"></a>	  <span class='hs-varid'>pp_lam</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>inside_lam</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'L'</span>
<a name="line-10"></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-11"></a>	  <span class='hs-varid'>pp_br</span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>one_branch</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</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'>char</span> <span class='hs-chr'>'*'</span>
<a name="line-13"></a>	  <span class='hs-varid'>pp_args</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>int_cxt</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'!'</span>
<a name="line-14"></a>		  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-15"></a>
<a name="line-16"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyword'>where</span>
<a name="line-17"></a>  <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>p</span> <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showsPrecSDoc</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Strictness indication}
%*									*
%************************************************************************

The strictness annotations on types in data type declarations
e.g. 	data T = MkT !Int !(Bool,Bool)

\begin{code}
<pre><a name="line-1"></a><a name="StrictnessMark"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>StrictnessMark</span>	<span class='hs-comment'>-- Used in interface decls only</span>
<a name="line-2"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MarkedStrict</span>	
<a name="line-3"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MarkedUnboxed</span>	
<a name="line-4"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotMarkedStrict</span>	
<a name="line-5"></a>   <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="isMarkedUnboxed"></a><span class='hs-definition'>isMarkedUnboxed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>StrictnessMark</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-8"></a><span class='hs-definition'>isMarkedUnboxed</span> <span class='hs-conid'>MarkedUnboxed</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-9"></a><span class='hs-definition'>isMarkedUnboxed</span> <span class='hs-keyword'>_</span>             <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="isMarkedStrict"></a><span class='hs-definition'>isMarkedStrict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>StrictnessMark</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-12"></a><span class='hs-definition'>isMarkedStrict</span> <span class='hs-conid'>NotMarkedStrict</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-13"></a><span class='hs-definition'>isMarkedStrict</span> <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>   <span class='hs-comment'>-- All others are strict</span>
<a name="line-14"></a>
<a name="line-15"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>StrictnessMark</span> <span class='hs-keyword'>where</span>
<a name="line-16"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>MarkedStrict</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'>"!"</span><span class='hs-layout'>)</span>
<a name="line-17"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>MarkedUnboxed</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'>"!!"</span><span class='hs-layout'>)</span>
<a name="line-18"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>NotMarkedStrict</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'>"_"</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Success flag}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="SuccessFlag"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SuccessFlag</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Succeeded</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Failed</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>SuccessFlag</span> <span class='hs-keyword'>where</span>
<a name="line-4"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>Succeeded</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'>"Succeeded"</span><span class='hs-layout'>)</span>
<a name="line-5"></a>    <span class='hs-varid'>ppr</span> <span class='hs-conid'>Failed</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'>"Failed"</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="successIf"></a><span class='hs-definition'>successIf</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SuccessFlag</span>
<a name="line-8"></a><span class='hs-definition'>successIf</span> <span class='hs-conid'>True</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Succeeded</span>
<a name="line-9"></a><span class='hs-definition'>successIf</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Failed</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="succeeded"></a><span class='hs-definition'>succeeded</span><span class='hs-layout'>,</span> <span class='hs-varid'>failed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SuccessFlag</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-12"></a><span class='hs-definition'>succeeded</span> <span class='hs-conid'>Succeeded</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-13"></a><span class='hs-definition'>succeeded</span> <span class='hs-conid'>Failed</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="failed"></a><span class='hs-definition'>failed</span> <span class='hs-conid'>Succeeded</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-16"></a><span class='hs-definition'>failed</span> <span class='hs-conid'>Failed</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Activation}
%*									*
%************************************************************************

When a rule or inlining is active

\begin{code}
<pre><a name="line-1"></a><a name="CompilerPhase"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>CompilerPhase</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>	<span class='hs-comment'>-- Compilation phase</span>
<a name="line-2"></a>				<span class='hs-comment'>-- Phases decrease towards zero</span>
<a name="line-3"></a>				<span class='hs-comment'>-- Zero is the last phase</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="Activation"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Activation</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeverActive</span>
<a name="line-6"></a>		<span class='hs-keyglyph'>|</span> <span class='hs-conid'>AlwaysActive</span>
<a name="line-7"></a>		<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ActiveBefore</span> <span class='hs-conid'>CompilerPhase</span>	<span class='hs-comment'>-- Active only *before* this phase</span>
<a name="line-8"></a>		<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ActiveAfter</span> <span class='hs-conid'>CompilerPhase</span>	<span class='hs-comment'>-- Active in this phase and later</span>
<a name="line-9"></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-comment'>-- Eq used in comparing rules in HsDecls</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="RuleMatchInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>RuleMatchInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ConLike</span>
<a name="line-12"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FunLike</span>
<a name="line-13"></a>                   <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="isConLike"></a><span class='hs-definition'>isConLike</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RuleMatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-16"></a><span class='hs-definition'>isConLike</span> <span class='hs-conid'>ConLike</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-17"></a><span class='hs-definition'>isConLike</span> <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="isFunLike"></a><span class='hs-definition'>isFunLike</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RuleMatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-20"></a><span class='hs-definition'>isFunLike</span> <span class='hs-conid'>FunLike</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-21"></a><span class='hs-definition'>isFunLike</span> <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="InlinePragma"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>InlinePragma</span>
<a name="line-24"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InlinePragma</span>
<a name="line-25"></a>      <span class='hs-conid'>Activation</span>        <span class='hs-comment'>-- Says during which phases inlining is allowed</span>
<a name="line-26"></a>      <span class='hs-conid'>RuleMatchInfo</span>     <span class='hs-comment'>-- Should the function be treated like a constructor?</span>
<a name="line-27"></a>  <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="defaultInlinePragma"></a><span class='hs-definition'>defaultInlinePragma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InlinePragma</span>
<a name="line-30"></a><span class='hs-definition'>defaultInlinePragma</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-conid'>AlwaysActive</span> <span class='hs-conid'>FunLike</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="isDefaultInlinePragma"></a><span class='hs-definition'>isDefaultInlinePragma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-33"></a><span class='hs-definition'>isDefaultInlinePragma</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>activation</span> <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span>
<a name="line-34"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isAlwaysActive</span> <span class='hs-varid'>activation</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>isFunLike</span> <span class='hs-varid'>match_info</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="inlinePragmaActivation"></a><span class='hs-definition'>inlinePragmaActivation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Activation</span>
<a name="line-37"></a><span class='hs-definition'>inlinePragmaActivation</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>activation</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>activation</span>
<a name="line-38"></a>
<a name="line-39"></a><a name="inlinePragmaRuleMatchInfo"></a><span class='hs-definition'>inlinePragmaRuleMatchInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RuleMatchInfo</span>
<a name="line-40"></a><span class='hs-definition'>inlinePragmaRuleMatchInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="setInlinePragmaActivation"></a><span class='hs-definition'>setInlinePragmaActivation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Activation</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InlinePragma</span>
<a name="line-43"></a><span class='hs-definition'>setInlinePragmaActivation</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span> <span class='hs-varid'>activation</span>
<a name="line-44"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>activation</span> <span class='hs-varid'>info</span>
<a name="line-45"></a>
<a name="line-46"></a><a name="setInlinePragmaRuleMatchInfo"></a><span class='hs-definition'>setInlinePragmaRuleMatchInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RuleMatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InlinePragma</span>
<a name="line-47"></a><span class='hs-definition'>setInlinePragmaRuleMatchInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>activation</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>info</span>
<a name="line-48"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>activation</span> <span class='hs-varid'>info</span>
<a name="line-49"></a>
<a name="line-50"></a><a name="InlineSpec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>InlineSpec</span>
<a name="line-51"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Inline</span>
<a name="line-52"></a>        <span class='hs-conid'>InlinePragma</span>
<a name="line-53"></a>	<span class='hs-conid'>Bool</span> 		<span class='hs-comment'>-- True  &lt;=&gt; INLINE</span>
<a name="line-54"></a>			<span class='hs-comment'>-- False &lt;=&gt; NOINLINE</span>
<a name="line-55"></a>  <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-56"></a>
<a name="line-57"></a><a name="defaultInlineSpec"></a><span class='hs-definition'>defaultInlineSpec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InlineSpec</span>
<a name="line-58"></a><a name="alwaysInlineSpec"></a><span class='hs-definition'>alwaysInlineSpec</span><span class='hs-layout'>,</span> <span class='hs-varid'>neverInlineSpec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RuleMatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InlineSpec</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-definition'>defaultInlineSpec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Inline</span> <span class='hs-varid'>defaultInlinePragma</span> <span class='hs-conid'>False</span>
<a name="line-61"></a>                                                <span class='hs-comment'>-- Inlining is OK, but not forced</span>
<a name="line-62"></a><span class='hs-definition'>alwaysInlineSpec</span> <span class='hs-varid'>match_info</span>
<a name="line-63"></a>                <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Inline</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-conid'>AlwaysActive</span> <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span> <span class='hs-conid'>True</span>
<a name="line-64"></a>                                                <span class='hs-comment'>-- INLINE always</span>
<a name="line-65"></a><a name="neverInlineSpec"></a><span class='hs-definition'>neverInlineSpec</span> <span class='hs-varid'>match_info</span>
<a name="line-66"></a>                <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Inline</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-conid'>NeverActive</span>  <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span> <span class='hs-conid'>False</span>
<a name="line-67"></a>                                                <span class='hs-comment'>-- NOINLINE</span>
<a name="line-68"></a>
<a name="line-69"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Activation</span> <span class='hs-keyword'>where</span>
<a name="line-70"></a>   <span class='hs-varid'>ppr</span> <span class='hs-conid'>NeverActive</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'>"NEVER"</span><span class='hs-layout'>)</span>
<a name="line-71"></a>   <span class='hs-varid'>ppr</span> <span class='hs-conid'>AlwaysActive</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'>"ALWAYS"</span><span class='hs-layout'>)</span>
<a name="line-72"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>ActiveBefore</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>brackets</span> <span class='hs-layout'>(</span><span class='hs-varid'>char</span> <span class='hs-chr'>'~'</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>int</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-73"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>ActiveAfter</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>brackets</span> <span class='hs-layout'>(</span><span class='hs-varid'>int</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-74"></a>
<a name="line-75"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>RuleMatchInfo</span> <span class='hs-keyword'>where</span>
<a name="line-76"></a>   <span class='hs-varid'>ppr</span> <span class='hs-conid'>ConLike</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'>"CONLIKE"</span><span class='hs-layout'>)</span>
<a name="line-77"></a>   <span class='hs-varid'>ppr</span> <span class='hs-conid'>FunLike</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'>"FUNLIKE"</span><span class='hs-layout'>)</span>
<a name="line-78"></a>
<a name="line-79"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyword'>where</span>
<a name="line-80"></a>  <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>activation</span> <span class='hs-conid'>FunLike</span><span class='hs-layout'>)</span>
<a name="line-81"></a>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>activation</span>
<a name="line-82"></a>  <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>activation</span> <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span>
<a name="line-83"></a>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>match_info</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>activation</span>
<a name="line-84"></a>    
<a name="line-85"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>InlineSpec</span> <span class='hs-keyword'>where</span>
<a name="line-86"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Inline</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>act</span> <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>is_inline</span><span class='hs-layout'>)</span>  
<a name="line-87"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-varid'>is_inline</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'>"INLINE"</span><span class='hs-layout'>)</span>
<a name="line-88"></a>                      <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr_match_info</span>
<a name="line-89"></a>		      <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>act</span> <span class='hs-keyword'>of</span>
<a name="line-90"></a>			     <span class='hs-conid'>AlwaysActive</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>empty</span>
<a name="line-91"></a>			     <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>act</span>
<a name="line-92"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</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'>"NOINLINE"</span><span class='hs-layout'>)</span>
<a name="line-93"></a>                      <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr_match_info</span>
<a name="line-94"></a>		      <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>act</span> <span class='hs-keyword'>of</span>
<a name="line-95"></a>			     <span class='hs-conid'>NeverActive</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>empty</span>
<a name="line-96"></a>			     <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>act</span>
<a name="line-97"></a>     <span class='hs-keyword'>where</span>
<a name="line-98"></a>       <span class='hs-varid'>ppr_match_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isFunLike</span> <span class='hs-varid'>match_info</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>empty</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>match_info</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="isActive"></a><span class='hs-definition'>isActive</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompilerPhase</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Activation</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-101"></a><span class='hs-definition'>isActive</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>NeverActive</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-102"></a><span class='hs-definition'>isActive</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>AlwaysActive</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-103"></a><span class='hs-definition'>isActive</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-conid'>ActiveAfter</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>n</span>
<a name="line-104"></a><span class='hs-definition'>isActive</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-conid'>ActiveBefore</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&gt;</span>  <span class='hs-varid'>n</span>
<a name="line-105"></a>
<a name="line-106"></a><a name="isNeverActive"></a><span class='hs-definition'>isNeverActive</span><span class='hs-layout'>,</span> <span class='hs-varid'>isAlwaysActive</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Activation</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-107"></a><span class='hs-definition'>isNeverActive</span> <span class='hs-conid'>NeverActive</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-108"></a><span class='hs-definition'>isNeverActive</span> <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-109"></a>
<a name="line-110"></a><a name="isAlwaysActive"></a><span class='hs-definition'>isAlwaysActive</span> <span class='hs-conid'>AlwaysActive</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-111"></a><span class='hs-definition'>isAlwaysActive</span> <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
</pre>\end{code}

</body>
</html>