<?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'>-></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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'>-></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'>-></span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-></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'>-></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'>-></span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>FreeVars</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>FreeVars</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>FreeVars</span> <span class='hs-keyglyph'>-></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'>-></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) =>@ 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 =>@ 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'>-></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'>-></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'><-</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'>-></span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>Uses</span> <span class='hs-keyglyph'>-></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>