Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1785

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/NameSet.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, 1998
%

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>NameSet</span> <span class='hs-layout'>(</span>
<a name="line-2"></a>	<span class='hs-comment'>-- * Names set type</span>
<a name="line-3"></a>	<span class='hs-conid'>NameSet</span><span class='hs-layout'>,</span>
<a name="line-4"></a>	
<a name="line-5"></a>	<span class='hs-comment'>-- ** Manipulating these sets</span>
<a name="line-6"></a>	<span class='hs-varid'>emptyNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>unitNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>unionNameSets</span><span class='hs-layout'>,</span> <span class='hs-varid'>unionManyNameSets</span><span class='hs-layout'>,</span>
<a name="line-7"></a>	<span class='hs-varid'>minusNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>elemNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>nameSetToList</span><span class='hs-layout'>,</span> <span class='hs-varid'>addOneToNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>addListToNameSet</span><span class='hs-layout'>,</span> 
<a name="line-8"></a>	<span class='hs-varid'>delFromNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>delListFromNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>isEmptyNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>filterNameSet</span><span class='hs-layout'>,</span>
<a name="line-9"></a>	<span class='hs-varid'>intersectsNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>intersectNameSet</span><span class='hs-layout'>,</span>
<a name="line-10"></a>	
<a name="line-11"></a>	<span class='hs-comment'>-- * Free variables</span>
<a name="line-12"></a>	<span class='hs-conid'>FreeVars</span><span class='hs-layout'>,</span>
<a name="line-13"></a>	
<a name="line-14"></a>	<span class='hs-comment'>-- ** Manipulating sets of free variables</span>
<a name="line-15"></a>	<span class='hs-varid'>isEmptyFVs</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyFVs</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusFVs</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusFV</span><span class='hs-layout'>,</span> 
<a name="line-16"></a>	<span class='hs-varid'>mkFVs</span><span class='hs-layout'>,</span> <span class='hs-varid'>addOneFV</span><span class='hs-layout'>,</span> <span class='hs-varid'>unitFV</span><span class='hs-layout'>,</span> <span class='hs-varid'>delFV</span><span class='hs-layout'>,</span> <span class='hs-varid'>delFVs</span><span class='hs-layout'>,</span>
<a name="line-17"></a>
<a name="line-18"></a>	<span class='hs-comment'>-- * Defs and uses</span>
<a name="line-19"></a>	<span class='hs-conid'>Defs</span><span class='hs-layout'>,</span> <span class='hs-conid'>Uses</span><span class='hs-layout'>,</span> <span class='hs-conid'>DefUse</span><span class='hs-layout'>,</span> <span class='hs-conid'>DefUses</span><span class='hs-layout'>,</span>
<a name="line-20"></a>	
<a name="line-21"></a>	<span class='hs-comment'>-- ** Manipulating defs and uses</span>
<a name="line-22"></a>	<span class='hs-varid'>emptyDUs</span><span class='hs-layout'>,</span> <span class='hs-varid'>usesOnly</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDUs</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusDU</span><span class='hs-layout'>,</span> 
<a name="line-23"></a>	<span class='hs-varid'>findUses</span><span class='hs-layout'>,</span> <span class='hs-varid'>duDefs</span><span class='hs-layout'>,</span> <span class='hs-varid'>duUses</span><span class='hs-layout'>,</span> <span class='hs-varid'>allUses</span>
<a name="line-24"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-27"></a>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSet</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection[Sets of names}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="NameSet"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UniqSet</span> <span class='hs-conid'>Name</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="emptyNameSet"></a><span class='hs-definition'>emptyNameSet</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span>
<a name="line-4"></a><a name="unitNameSet"></a><span class='hs-definition'>unitNameSet</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-5"></a><a name="addListToNameSet"></a><span class='hs-definition'>addListToNameSet</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-6"></a><a name="addOneToNameSet"></a><span class='hs-definition'>addOneToNameSet</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-7"></a><a name="mkNameSet"></a><span class='hs-definition'>mkNameSet</span>          <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-8"></a><a name="unionNameSets"></a><span class='hs-definition'>unionNameSets</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-9"></a><a name="unionManyNameSets"></a><span class='hs-definition'>unionManyNameSets</span>  <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NameSet</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-10"></a><a name="minusNameSet"></a><span class='hs-definition'>minusNameSet</span> 	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-11"></a><a name="elemNameSet"></a><span class='hs-definition'>elemNameSet</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-12"></a><a name="nameSetToList"></a><span class='hs-definition'>nameSetToList</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-13"></a><a name="isEmptyNameSet"></a><span class='hs-definition'>isEmptyNameSet</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-14"></a><a name="delFromNameSet"></a><span class='hs-definition'>delFromNameSet</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-15"></a><a name="delListFromNameSet"></a><span class='hs-definition'>delListFromNameSet</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-16"></a><a name="foldNameSet"></a><span class='hs-definition'>foldNameSet</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Name</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'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-17"></a><a name="filterNameSet"></a><span class='hs-definition'>filterNameSet</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Name</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'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-18"></a><a name="intersectNameSet"></a><span class='hs-definition'>intersectNameSet</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-19"></a><a name="intersectsNameSet"></a><span class='hs-definition'>intersectsNameSet</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-20"></a><span class='hs-comment'>-- ^ True if there is a non-empty intersection.</span>
<a name="line-21"></a><span class='hs-comment'>-- @s1 `intersectsNameSet` s2@ doesn't compute @s2@ if @s1@ is empty</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='hs-definition'>isEmptyNameSet</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isEmptyUniqSet</span>
<a name="line-24"></a><span class='hs-definition'>emptyNameSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyUniqSet</span>
<a name="line-25"></a><span class='hs-definition'>unitNameSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unitUniqSet</span>
<a name="line-26"></a><span class='hs-definition'>mkNameSet</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUniqSet</span>
<a name="line-27"></a><span class='hs-definition'>addListToNameSet</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addListToUniqSet</span>
<a name="line-28"></a><span class='hs-definition'>addOneToNameSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addOneToUniqSet</span>
<a name="line-29"></a><span class='hs-definition'>unionNameSets</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionUniqSets</span>
<a name="line-30"></a><span class='hs-definition'>unionManyNameSets</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionManyUniqSets</span>
<a name="line-31"></a><span class='hs-definition'>minusNameSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>minusUniqSet</span>
<a name="line-32"></a><span class='hs-definition'>elemNameSet</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>elementOfUniqSet</span>
<a name="line-33"></a><span class='hs-definition'>nameSetToList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uniqSetToList</span>
<a name="line-34"></a><span class='hs-definition'>delFromNameSet</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>delOneFromUniqSet</span>
<a name="line-35"></a><span class='hs-definition'>foldNameSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldUniqSet</span>
<a name="line-36"></a><span class='hs-definition'>filterNameSet</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filterUniqSet</span>
<a name="line-37"></a><span class='hs-definition'>intersectNameSet</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectUniqSets</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-definition'>delListFromNameSet</span> <span class='hs-varid'>set</span> <span class='hs-varid'>ns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-varid'>delFromNameSet</span> <span class='hs-varid'>set</span> <span class='hs-varid'>ns</span>
<a name="line-40"></a>
<a name="line-41"></a><span class='hs-definition'>intersectsNameSet</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'>isEmptyNameSet</span> <span class='hs-layout'>(</span><span class='hs-varid'>s1</span> <span class='hs-varop'>`intersectNameSet`</span> <span class='hs-varid'>s2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Free variables}
%*									*
%************************************************************************

These synonyms are useful when we are thinking of free variables

\begin{code}
<pre><a name="line-1"></a><a name="FreeVars"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>FreeVars</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameSet</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="plusFV"></a><span class='hs-definition'>plusFV</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FreeVars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span>
<a name="line-4"></a><a name="addOneFV"></a><span class='hs-definition'>addOneFV</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FreeVars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span>
<a name="line-5"></a><a name="unitFV"></a><span class='hs-definition'>unitFV</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span>
<a name="line-6"></a><a name="emptyFVs"></a><span class='hs-definition'>emptyFVs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FreeVars</span>
<a name="line-7"></a><a name="plusFVs"></a><span class='hs-definition'>plusFVs</span>  <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FreeVars</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span>
<a name="line-8"></a><a name="mkFVs"></a><span class='hs-definition'>mkFVs</span>	 <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span>
<a name="line-9"></a><a name="delFV"></a><span class='hs-definition'>delFV</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span>
<a name="line-10"></a><a name="delFVs"></a><span class='hs-definition'>delFVs</span>   <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FreeVars</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="isEmptyFVs"></a><span class='hs-definition'>isEmptyFVs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-13"></a><span class='hs-definition'>isEmptyFVs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isEmptyNameSet</span>
<a name="line-14"></a><span class='hs-definition'>emptyFVs</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyNameSet</span>
<a name="line-15"></a><span class='hs-definition'>plusFVs</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionManyNameSets</span>
<a name="line-16"></a><span class='hs-definition'>plusFV</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionNameSets</span>
<a name="line-17"></a><span class='hs-definition'>mkFVs</span>	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNameSet</span>
<a name="line-18"></a><span class='hs-definition'>addOneFV</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addOneToNameSet</span>
<a name="line-19"></a><span class='hs-definition'>unitFV</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unitNameSet</span>
<a name="line-20"></a><span class='hs-definition'>delFV</span> <span class='hs-varid'>n</span> <span class='hs-varid'>s</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>delFromNameSet</span> <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-21"></a><span class='hs-definition'>delFVs</span> <span class='hs-varid'>ns</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>delListFromNameSet</span> <span class='hs-varid'>s</span> <span class='hs-varid'>ns</span>
</pre>\end{code}


%************************************************************************
%*									*
		Defs and uses
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="Defs"></a><span class='hs-comment'>-- | A set of names that are defined somewhere</span>
<a name="line-2"></a><a name="Defs"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Defs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameSet</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="Uses"></a><span class='hs-comment'>-- | A set of names that are used somewhere</span>
<a name="line-5"></a><a name="Uses"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Uses</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameSet</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="DefUse"></a><span class='hs-comment'>-- | @(Just ds, us) =&gt;@ The use of any member of the @ds@</span>
<a name="line-8"></a><a name="DefUse"></a><span class='hs-comment'>--                      implies that all the @us@ are used too.</span>
<a name="line-9"></a><a name="DefUse"></a><span class='hs-comment'>--                      Also, @us@ may mention @ds@.</span>
<a name="line-10"></a><a name="DefUse"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><a name="DefUse"></a><span class='hs-comment'>-- @Nothing =&gt;@ Nothing is defined in this group, but</span>
<a name="line-12"></a><a name="DefUse"></a><span class='hs-comment'>-- 	        nevertheless all the uses are essential.</span>
<a name="line-13"></a><a name="DefUse"></a><span class='hs-comment'>--	        Used for instance declarations, for example</span>
<a name="line-14"></a><a name="DefUse"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>DefUse</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Defs</span><span class='hs-layout'>,</span> <span class='hs-conid'>Uses</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="DefUses"></a><span class='hs-comment'>-- | A number of 'DefUse's in dependency order: earlier 'Defs' scope over later 'Uses'</span>
<a name="line-17"></a><a name="DefUses"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DefUse</span><span class='hs-keyglyph'>]</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="emptyDUs"></a><span class='hs-definition'>emptyDUs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DefUses</span>
<a name="line-20"></a><span class='hs-definition'>emptyDUs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="usesOnly"></a><span class='hs-definition'>usesOnly</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Uses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DefUses</span>
<a name="line-23"></a><span class='hs-definition'>usesOnly</span> <span class='hs-varid'>uses</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-varid'>uses</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="mkDUs"></a><span class='hs-definition'>mkDUs</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Defs</span><span class='hs-layout'>,</span><span class='hs-conid'>Uses</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DefUses</span>
<a name="line-26"></a><span class='hs-definition'>mkDUs</span> <span class='hs-varid'>pairs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>defs</span><span class='hs-layout'>,</span> <span class='hs-varid'>uses</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>defs</span><span class='hs-layout'>,</span><span class='hs-varid'>uses</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>pairs</span><span class='hs-keyglyph'>]</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="plusDU"></a><span class='hs-definition'>plusDU</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DefUses</span>
<a name="line-29"></a><span class='hs-definition'>plusDU</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="duDefs"></a><span class='hs-definition'>duDefs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Defs</span>
<a name="line-32"></a><span class='hs-definition'>duDefs</span> <span class='hs-varid'>dus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>get</span> <span class='hs-varid'>emptyNameSet</span> <span class='hs-varid'>dus</span>
<a name="line-33"></a>  <span class='hs-keyword'>where</span>
<a name="line-34"></a>    <span class='hs-varid'>get</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-sel'>_u1</span><span class='hs-layout'>)</span> <span class='hs-varid'>d2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d2</span>
<a name="line-35"></a>    <span class='hs-varid'>get</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>d1</span><span class='hs-layout'>,</span> <span class='hs-sel'>_u1</span><span class='hs-layout'>)</span> <span class='hs-varid'>d2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d1</span> <span class='hs-varop'>`unionNameSets`</span> <span class='hs-varid'>d2</span>
<a name="line-36"></a>
<a name="line-37"></a><a name="duUses"></a><span class='hs-definition'>duUses</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Uses</span>
<a name="line-38"></a><span class='hs-comment'>-- ^ Just like 'allUses', but 'Defs' are not eliminated from the 'Uses' returned</span>
<a name="line-39"></a><span class='hs-definition'>duUses</span> <span class='hs-varid'>dus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>get</span> <span class='hs-varid'>emptyNameSet</span> <span class='hs-varid'>dus</span>
<a name="line-40"></a>  <span class='hs-keyword'>where</span>
<a name="line-41"></a>    <span class='hs-varid'>get</span> <span class='hs-layout'>(</span><span class='hs-sel'>_d1</span><span class='hs-layout'>,</span> <span class='hs-varid'>u1</span><span class='hs-layout'>)</span> <span class='hs-varid'>u2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>u1</span> <span class='hs-varop'>`unionNameSets`</span> <span class='hs-varid'>u2</span>
<a name="line-42"></a>
<a name="line-43"></a><a name="allUses"></a><span class='hs-definition'>allUses</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Uses</span>
<a name="line-44"></a><span class='hs-comment'>-- ^ Collect all 'Uses', regardless of whether the group is itself used,</span>
<a name="line-45"></a><span class='hs-comment'>-- but remove 'Defs' on the way</span>
<a name="line-46"></a><span class='hs-definition'>allUses</span> <span class='hs-varid'>dus</span>
<a name="line-47"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>get</span> <span class='hs-varid'>emptyNameSet</span> <span class='hs-varid'>dus</span>
<a name="line-48"></a>  <span class='hs-keyword'>where</span>
<a name="line-49"></a>    <span class='hs-varid'>get</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span>   <span class='hs-varid'>rhs_uses</span><span class='hs-layout'>)</span> <span class='hs-varid'>uses</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rhs_uses</span> <span class='hs-varop'>`unionNameSets`</span> <span class='hs-varid'>uses</span>
<a name="line-50"></a>    <span class='hs-varid'>get</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>defs</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs_uses</span><span class='hs-layout'>)</span> <span class='hs-varid'>uses</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>rhs_uses</span> <span class='hs-varop'>`unionNameSets`</span> <span class='hs-varid'>uses</span><span class='hs-layout'>)</span>
<a name="line-51"></a>				     <span class='hs-varop'>`minusNameSet`</span> <span class='hs-varid'>defs</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="findUses"></a><span class='hs-definition'>findUses</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Uses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Uses</span>
<a name="line-54"></a><span class='hs-comment'>-- ^ Given some 'DefUses' and some 'Uses', find all the uses, transitively.</span>
<a name="line-55"></a><span class='hs-comment'>-- The result is a superset of the input 'Uses'; and includes things defined </span>
<a name="line-56"></a><span class='hs-comment'>-- in the input 'DefUses' (but only if they are used)</span>
<a name="line-57"></a><span class='hs-definition'>findUses</span> <span class='hs-varid'>dus</span> <span class='hs-varid'>uses</span> 
<a name="line-58"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>get</span> <span class='hs-varid'>uses</span> <span class='hs-varid'>dus</span>
<a name="line-59"></a>  <span class='hs-keyword'>where</span>
<a name="line-60"></a>    <span class='hs-varid'>get</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs_uses</span><span class='hs-layout'>)</span> <span class='hs-varid'>uses</span>
<a name="line-61"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>rhs_uses</span> <span class='hs-varop'>`unionNameSets`</span> <span class='hs-varid'>uses</span>
<a name="line-62"></a>    <span class='hs-varid'>get</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>defs</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs_uses</span><span class='hs-layout'>)</span> <span class='hs-varid'>uses</span>
<a name="line-63"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-varid'>defs</span> <span class='hs-varop'>`intersectsNameSet`</span> <span class='hs-varid'>uses</span> 	<span class='hs-comment'>-- Used</span>
<a name="line-64"></a>	<span class='hs-varop'>||</span> <span class='hs-varid'>any</span> <span class='hs-layout'>(</span><span class='hs-varid'>startsWithUnderscore</span> <span class='hs-varop'>.</span> <span class='hs-varid'>nameOccName</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameSetToList</span> <span class='hs-varid'>defs</span><span class='hs-layout'>)</span>
<a name="line-65"></a>		<span class='hs-comment'>-- At least one starts with an "_", </span>
<a name="line-66"></a>		<span class='hs-comment'>-- so treat the group as used</span>
<a name="line-67"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>rhs_uses</span> <span class='hs-varop'>`unionNameSets`</span> <span class='hs-varid'>uses</span>
<a name="line-68"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	<span class='hs-comment'>-- No def is used</span>
<a name="line-69"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>uses</span>
</pre>\end{code}
</body>
</html>