Sophie

Sophie

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

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>coreSyn/MkCore.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- | Handy functions for creating much Core syntax</span>
<a name="line-2"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>MkCore</span> <span class='hs-layout'>(</span>
<a name="line-3"></a>        <span class='hs-comment'>-- * Constructing normal syntax</span>
<a name="line-4"></a>        <span class='hs-varid'>mkCoreLet</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkCoreLets</span><span class='hs-layout'>,</span>
<a name="line-5"></a>        <span class='hs-varid'>mkCoreApp</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkCoreApps</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkCoreConApps</span><span class='hs-layout'>,</span>
<a name="line-6"></a>        <span class='hs-varid'>mkCoreLams</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkWildCase</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkWildBinder</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkIfThenElse</span><span class='hs-layout'>,</span>
<a name="line-7"></a>        
<a name="line-8"></a>        <span class='hs-comment'>-- * Constructing boxed literals</span>
<a name="line-9"></a>        <span class='hs-varid'>mkWordExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkWordExprWord</span><span class='hs-layout'>,</span>
<a name="line-10"></a>        <span class='hs-varid'>mkIntExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkIntExprInt</span><span class='hs-layout'>,</span>
<a name="line-11"></a>        <span class='hs-varid'>mkIntegerExpr</span><span class='hs-layout'>,</span>
<a name="line-12"></a>        <span class='hs-varid'>mkFloatExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDoubleExpr</span><span class='hs-layout'>,</span>
<a name="line-13"></a>        <span class='hs-varid'>mkCharExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkStringExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkStringExprFS</span><span class='hs-layout'>,</span>
<a name="line-14"></a>        
<a name="line-15"></a>        <span class='hs-comment'>-- * Constructing general big tuples</span>
<a name="line-16"></a>        <span class='hs-comment'>-- $big_tuples</span>
<a name="line-17"></a>        <span class='hs-varid'>mkChunkified</span><span class='hs-layout'>,</span>
<a name="line-18"></a>        
<a name="line-19"></a>        <span class='hs-comment'>-- * Constructing small tuples</span>
<a name="line-20"></a>        <span class='hs-varid'>mkCoreVarTup</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkCoreVarTupTy</span><span class='hs-layout'>,</span>
<a name="line-21"></a>        <span class='hs-varid'>mkCoreTup</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkCoreTupTy</span><span class='hs-layout'>,</span>
<a name="line-22"></a>        
<a name="line-23"></a>        <span class='hs-comment'>-- * Constructing big tuples</span>
<a name="line-24"></a>        <span class='hs-varid'>mkBigCoreVarTup</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkBigCoreVarTupTy</span><span class='hs-layout'>,</span>
<a name="line-25"></a>        <span class='hs-varid'>mkBigCoreTup</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkBigCoreTupTy</span><span class='hs-layout'>,</span>
<a name="line-26"></a>        
<a name="line-27"></a>        <span class='hs-comment'>-- * Deconstructing small tuples</span>
<a name="line-28"></a>        <span class='hs-varid'>mkSmallTupleSelector</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkSmallTupleCase</span><span class='hs-layout'>,</span>
<a name="line-29"></a>        
<a name="line-30"></a>        <span class='hs-comment'>-- * Deconstructing big tuples</span>
<a name="line-31"></a>        <span class='hs-varid'>mkTupleSelector</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTupleCase</span><span class='hs-layout'>,</span>
<a name="line-32"></a>        
<a name="line-33"></a>        <span class='hs-comment'>-- * Constructing list expressions</span>
<a name="line-34"></a>        <span class='hs-varid'>mkNilExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkConsExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkListExpr</span><span class='hs-layout'>,</span> 
<a name="line-35"></a>        <span class='hs-varid'>mkFoldrExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkBuildExpr</span>
<a name="line-36"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-39"></a>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Id</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span>      <span class='hs-layout'>(</span> <span class='hs-varid'>setTyVarUnique</span> <span class='hs-layout'>)</span>
<a name="line-42"></a>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreSyn</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreUtils</span>        <span class='hs-layout'>(</span> <span class='hs-varid'>exprType</span><span class='hs-layout'>,</span> <span class='hs-varid'>needsCaseBinding</span><span class='hs-layout'>,</span> <span class='hs-varid'>bindNonRec</span> <span class='hs-layout'>)</span>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Literal</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HscTypes</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysWiredIn</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>
<a name="line-50"></a>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Type</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysPrim</span>          <span class='hs-layout'>(</span> <span class='hs-varid'>alphaTyVar</span> <span class='hs-layout'>)</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span>          <span class='hs-layout'>(</span> <span class='hs-conid'>DataCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>dataConWorkId</span> <span class='hs-layout'>)</span>
<a name="line-54"></a>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSupply</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unique</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>mkBuiltinUnique</span> <span class='hs-layout'>)</span>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-59"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>             <span class='hs-layout'>(</span> <span class='hs-varid'>notNull</span><span class='hs-layout'>,</span> <span class='hs-varid'>zipEqual</span> <span class='hs-layout'>)</span>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Panic</span>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Constants</span>
<a name="line-62"></a>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span>        <span class='hs-layout'>(</span> <span class='hs-varid'>ord</span> <span class='hs-layout'>)</span>
<a name="line-64"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Word</span>
<a name="line-65"></a>
<a name="line-66"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>4</span> <span class='hs-varop'>`mkCoreApp`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`mkCoreApps`</span>
</pre>\end{code}

%************************************************************************
%*                                                                      *
\subsection{Basic CoreSyn construction}
%*                                                                      *
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="mkCoreLet"></a><span class='hs-comment'>-- | Bind a binding group over an expression, using a @let@ or @case@ as</span>
<a name="line-2"></a><span class='hs-comment'>-- appropriate (see "CoreSyn#let_app_invariant")</span>
<a name="line-3"></a><span class='hs-definition'>mkCoreLet</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreBind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-4"></a><span class='hs-definition'>mkCoreLet</span> <span class='hs-layout'>(</span><span class='hs-conid'>NonRec</span> <span class='hs-varid'>bndr</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span> <span class='hs-varid'>body</span>        <span class='hs-comment'>-- See Note [CoreSyn let/app invariant]</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>needsCaseBinding</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>bndr</span><span class='hs-layout'>)</span> <span class='hs-varid'>rhs</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Case</span> <span class='hs-varid'>rhs</span> <span class='hs-varid'>bndr</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprType</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>DEFAULT</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-varid'>body</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-7"></a><span class='hs-definition'>mkCoreLet</span> <span class='hs-varid'>bind</span> <span class='hs-varid'>body</span>
<a name="line-8"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Let</span> <span class='hs-varid'>bind</span> <span class='hs-varid'>body</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="mkCoreLets"></a><span class='hs-comment'>-- | Bind a list of binding groups over an expression. The leftmost binding</span>
<a name="line-11"></a><span class='hs-comment'>-- group becomes the outermost group in the resulting expression</span>
<a name="line-12"></a><span class='hs-definition'>mkCoreLets</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBind</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-13"></a><span class='hs-definition'>mkCoreLets</span> <span class='hs-varid'>binds</span> <span class='hs-varid'>body</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>mkCoreLet</span> <span class='hs-varid'>body</span> <span class='hs-varid'>binds</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="mkCoreApp"></a><span class='hs-comment'>-- | Construct an expression which represents the application of one expression</span>
<a name="line-16"></a><span class='hs-comment'>-- to the other</span>
<a name="line-17"></a><span class='hs-definition'>mkCoreApp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-18"></a><span class='hs-comment'>-- Check the invariant that the arg of an App is ok-for-speculation if unlifted</span>
<a name="line-19"></a><span class='hs-comment'>-- See CoreSyn Note [CoreSyn let/app invariant]</span>
<a name="line-20"></a><span class='hs-definition'>mkCoreApp</span> <span class='hs-varid'>fun</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>App</span> <span class='hs-varid'>fun</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-definition'>mkCoreApp</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_val_app</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg</span> <span class='hs-varid'>arg_ty</span> <span class='hs-varid'>res_ty</span>
<a name="line-22"></a>                      <span class='hs-keyword'>where</span>
<a name="line-23"></a>                        <span class='hs-layout'>(</span><span class='hs-varid'>arg_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitFunTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprType</span> <span class='hs-varid'>fun</span><span class='hs-layout'>)</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="mkCoreApps"></a><span class='hs-comment'>-- | Construct an expression which represents the application of a number of</span>
<a name="line-26"></a><span class='hs-comment'>-- expressions to another. The leftmost expression in the list is applied first</span>
<a name="line-27"></a><span class='hs-definition'>mkCoreApps</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreExpr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-28"></a><span class='hs-comment'>-- Slightly more efficient version of (foldl mkCoreApp)</span>
<a name="line-29"></a><span class='hs-definition'>mkCoreApps</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>args</span>
<a name="line-30"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>fun</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprType</span> <span class='hs-varid'>fun</span><span class='hs-layout'>)</span> <span class='hs-varid'>args</span>
<a name="line-31"></a>  <span class='hs-keyword'>where</span>
<a name="line-32"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>fun</span> <span class='hs-keyword'>_</span>      <span class='hs-conid'>[]</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fun</span>
<a name="line-33"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>fun_ty</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span> <span class='hs-varid'>ty</span> <span class='hs-conop'>:</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>App</span> <span class='hs-varid'>fun</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>applyTy</span> <span class='hs-varid'>fun_ty</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>args</span>
<a name="line-34"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>fun_ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>arg</span>     <span class='hs-conop'>:</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>mk_val_app</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg</span> <span class='hs-varid'>arg_ty</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>res_ty</span> <span class='hs-varid'>args</span>
<a name="line-35"></a>                                   <span class='hs-keyword'>where</span>
<a name="line-36"></a>                                     <span class='hs-layout'>(</span><span class='hs-varid'>arg_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitFunTy</span> <span class='hs-varid'>fun_ty</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="mkCoreConApps"></a><span class='hs-comment'>-- | Construct an expression which represents the application of a number of</span>
<a name="line-39"></a><span class='hs-comment'>-- expressions to that of a data constructor expression. The leftmost expression</span>
<a name="line-40"></a><span class='hs-comment'>-- in the list is applied first</span>
<a name="line-41"></a><span class='hs-definition'>mkCoreConApps</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreExpr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-42"></a><span class='hs-definition'>mkCoreConApps</span> <span class='hs-varid'>con</span> <span class='hs-varid'>args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkCoreApps</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-layout'>(</span><span class='hs-varid'>dataConWorkId</span> <span class='hs-varid'>con</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>args</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="mk_val_app"></a><span class='hs-comment'>-----------</span>
<a name="line-45"></a><span class='hs-definition'>mk_val_app</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-46"></a><span class='hs-definition'>mk_val_app</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg</span> <span class='hs-varid'>arg_ty</span> <span class='hs-keyword'>_</span>        <span class='hs-comment'>-- See Note [CoreSyn let/app invariant]</span>
<a name="line-47"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>needsCaseBinding</span> <span class='hs-varid'>arg_ty</span> <span class='hs-varid'>arg</span><span class='hs-layout'>)</span>
<a name="line-48"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>App</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg</span>                <span class='hs-comment'>-- The vastly common case</span>
<a name="line-49"></a>
<a name="line-50"></a><span class='hs-definition'>mk_val_app</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg</span> <span class='hs-varid'>arg_ty</span> <span class='hs-varid'>res_ty</span>
<a name="line-51"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Case</span> <span class='hs-varid'>arg</span> <span class='hs-varid'>arg_id</span> <span class='hs-varid'>res_ty</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>DEFAULT</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>App</span> <span class='hs-varid'>fun</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-varid'>arg_id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-52"></a>  <span class='hs-keyword'>where</span>
<a name="line-53"></a>    <span class='hs-varid'>arg_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkWildBinder</span> <span class='hs-varid'>arg_ty</span>    
<a name="line-54"></a>	<span class='hs-comment'>-- Lots of shadowing, but it doesn't matter,</span>
<a name="line-55"></a>        <span class='hs-comment'>-- because 'fun ' should not have a free wild-id</span>
<a name="line-56"></a>	<span class='hs-comment'>--</span>
<a name="line-57"></a>	<span class='hs-comment'>-- This is Dangerous.  But this is the only place we play this </span>
<a name="line-58"></a>	<span class='hs-comment'>-- game, mk_val_app returns an expression that does not have</span>
<a name="line-59"></a>	<span class='hs-comment'>-- have a free wild-id.  So the only thing that can go wrong</span>
<a name="line-60"></a>	<span class='hs-comment'>-- is if you take apart this case expression, and pass a </span>
<a name="line-61"></a>	<span class='hs-comment'>-- fragmet of it as the fun part of a 'mk_val_app'.</span>
<a name="line-62"></a>
<a name="line-63"></a>
<a name="line-64"></a><a name="mkWildBinder"></a><span class='hs-comment'>-- | Make a /wildcard binder/. This is typically used when you need a binder </span>
<a name="line-65"></a><span class='hs-comment'>-- that you expect to use only at a *binding* site.  Do not use it at</span>
<a name="line-66"></a><span class='hs-comment'>-- occurrence sites because it has a single, fixed unique, and it's very</span>
<a name="line-67"></a><span class='hs-comment'>-- easy to get into difficulties with shadowing.  That's why it is used so little.</span>
<a name="line-68"></a><span class='hs-definition'>mkWildBinder</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-69"></a><span class='hs-definition'>mkWildBinder</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSysLocal</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"wild"</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkBuiltinUnique</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-70"></a>
<a name="line-71"></a><a name="mkWildCase"></a><span class='hs-definition'>mkWildCase</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreAlt</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-72"></a><span class='hs-comment'>-- Make a case expression whose case binder is unused</span>
<a name="line-73"></a><span class='hs-comment'>-- The alts should not have any occurrences of WildId</span>
<a name="line-74"></a><span class='hs-definition'>mkWildCase</span> <span class='hs-varid'>scrut</span> <span class='hs-varid'>scrut_ty</span> <span class='hs-varid'>res_ty</span> <span class='hs-varid'>alts</span> 
<a name="line-75"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Case</span> <span class='hs-varid'>scrut</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkWildBinder</span> <span class='hs-varid'>scrut_ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>res_ty</span> <span class='hs-varid'>alts</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="mkIfThenElse"></a><span class='hs-definition'>mkIfThenElse</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-78"></a><span class='hs-definition'>mkIfThenElse</span> <span class='hs-varid'>guard</span> <span class='hs-varid'>then_expr</span> <span class='hs-varid'>else_expr</span>
<a name="line-79"></a><span class='hs-comment'>-- Not going to be refining, so okay to take the type of the "then" clause</span>
<a name="line-80"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkWildCase</span> <span class='hs-varid'>guard</span> <span class='hs-varid'>boolTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprType</span> <span class='hs-varid'>then_expr</span><span class='hs-layout'>)</span> 
<a name="line-81"></a>	 <span class='hs-keyglyph'>[</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataAlt</span> <span class='hs-varid'>falseDataCon</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>else_expr</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- Increasing order of tag!</span>
<a name="line-82"></a>    	   <span class='hs-layout'>(</span><span class='hs-conid'>DataAlt</span> <span class='hs-varid'>trueDataCon</span><span class='hs-layout'>,</span>  <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>then_expr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>
</pre>\end{code}

The functions from this point don't really do anything cleverer than
their counterparts in CoreSyn, but they are here for consistency

\begin{code}
<pre><a name="line-1"></a><a name="mkCoreLams"></a><span class='hs-comment'>-- | Create a lambda where the given expression has a number of variables</span>
<a name="line-2"></a><span class='hs-comment'>-- bound over it. The leftmost binder is that bound by the outermost</span>
<a name="line-3"></a><span class='hs-comment'>-- lambda in the result</span>
<a name="line-4"></a><span class='hs-definition'>mkCoreLams</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBndr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-5"></a><span class='hs-definition'>mkCoreLams</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLams</span>
</pre>\end{code}

%************************************************************************
%*                                                                      *
\subsection{Making literals}
%*                                                                      *
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="mkIntExpr"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the given @Int@</span>
<a name="line-2"></a><span class='hs-definition'>mkIntExpr</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>            <span class='hs-comment'>-- Result = I# i :: Int</span>
<a name="line-3"></a><span class='hs-definition'>mkIntExpr</span>  <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>intDataCon</span>  <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkIntLit</span> <span class='hs-varid'>i</span><span class='hs-keyglyph'>]</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="mkIntExprInt"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the given @Int@</span>
<a name="line-6"></a><span class='hs-definition'>mkIntExprInt</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>            <span class='hs-comment'>-- Result = I# i :: Int</span>
<a name="line-7"></a><span class='hs-definition'>mkIntExprInt</span>  <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>intDataCon</span>  <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkIntLitInt</span> <span class='hs-varid'>i</span><span class='hs-keyglyph'>]</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="mkWordExpr"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the a @Word@ with the given value</span>
<a name="line-10"></a><span class='hs-definition'>mkWordExpr</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-11"></a><span class='hs-definition'>mkWordExpr</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>wordDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkWordLit</span> <span class='hs-varid'>w</span><span class='hs-keyglyph'>]</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="mkWordExprWord"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the given @Word@</span>
<a name="line-14"></a><span class='hs-definition'>mkWordExprWord</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-15"></a><span class='hs-definition'>mkWordExprWord</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>wordDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkWordLitWord</span> <span class='hs-varid'>w</span><span class='hs-keyglyph'>]</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="mkIntegerExpr"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the given @Integer@</span>
<a name="line-18"></a><span class='hs-definition'>mkIntegerExpr</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadThings</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Integer</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>CoreExpr</span>  <span class='hs-comment'>-- Result :: Integer</span>
<a name="line-19"></a><span class='hs-definition'>mkIntegerExpr</span> <span class='hs-varid'>i</span>
<a name="line-20"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>inIntRange</span> <span class='hs-varid'>i</span>        <span class='hs-comment'>-- Small enough, so start from an Int</span>
<a name="line-21"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>integer_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupId</span> <span class='hs-varid'>smallIntegerName</span>
<a name="line-22"></a>         <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSmallIntegerLit</span> <span class='hs-varid'>integer_id</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-23"></a>
<a name="line-24"></a><span class='hs-comment'>-- Special case for integral literals with a large magnitude:</span>
<a name="line-25"></a><span class='hs-comment'>-- They are transformed into an expression involving only smaller</span>
<a name="line-26"></a><span class='hs-comment'>-- integral literals. This improves constant folding.</span>
<a name="line-27"></a>
<a name="line-28"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>       <span class='hs-comment'>-- Big, so start from a string</span>
<a name="line-29"></a>      <span class='hs-varid'>plus_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupId</span> <span class='hs-varid'>plusIntegerName</span>
<a name="line-30"></a>      <span class='hs-varid'>times_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupId</span> <span class='hs-varid'>timesIntegerName</span>
<a name="line-31"></a>      <span class='hs-varid'>integer_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupId</span> <span class='hs-varid'>smallIntegerName</span>
<a name="line-32"></a>      <span class='hs-keyword'>let</span>
<a name="line-33"></a>           <span class='hs-varid'>lit</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSmallIntegerLit</span> <span class='hs-varid'>integer_id</span> <span class='hs-varid'>i</span>
<a name="line-34"></a>           <span class='hs-varid'>plus</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span> <span class='hs-varid'>plus_id</span>  <span class='hs-varop'>`App`</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`App`</span> <span class='hs-varid'>b</span>
<a name="line-35"></a>           <span class='hs-varid'>times</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span> <span class='hs-varid'>times_id</span> <span class='hs-varop'>`App`</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`App`</span> <span class='hs-varid'>b</span>
<a name="line-36"></a>
<a name="line-37"></a>           <span class='hs-comment'>-- Transform i into (x1 + (x2 + (x3 + (...) * b) * b) * b) with abs xi &lt;= b</span>
<a name="line-38"></a>           <span class='hs-varid'>horner</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-39"></a>           <span class='hs-varid'>horner</span> <span class='hs-varid'>b</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>abs</span> <span class='hs-varid'>q</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-varop'>||</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-varid'>i</span> 
<a name="line-40"></a>                                     <span class='hs-keyword'>then</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>i</span> 
<a name="line-41"></a>                                     <span class='hs-keyword'>else</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>r</span> <span class='hs-varop'>`plus`</span> <span class='hs-varid'>lit</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-42"></a>                      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>     <span class='hs-keyglyph'>=</span>               <span class='hs-varid'>horner</span> <span class='hs-varid'>b</span> <span class='hs-varid'>q</span> <span class='hs-varop'>`times`</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>b</span>
<a name="line-43"></a>                      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>r</span> <span class='hs-varop'>`plus`</span> <span class='hs-layout'>(</span><span class='hs-varid'>horner</span> <span class='hs-varid'>b</span> <span class='hs-varid'>q</span> <span class='hs-varop'>`times`</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-44"></a>                      <span class='hs-keyword'>where</span>
<a name="line-45"></a>                        <span class='hs-layout'>(</span><span class='hs-varid'>q</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span> <span class='hs-varop'>`quotRem`</span> <span class='hs-varid'>b</span>
<a name="line-46"></a>
<a name="line-47"></a>      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>horner</span> <span class='hs-varid'>tARGET_MAX_INT</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-48"></a>  <span class='hs-keyword'>where</span>
<a name="line-49"></a>    <span class='hs-varid'>mkSmallIntegerLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-50"></a>    <span class='hs-varid'>mkSmallIntegerLit</span> <span class='hs-varid'>small_integer</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkApps</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-varid'>small_integer</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkIntLit</span> <span class='hs-varid'>i</span><span class='hs-keyglyph'>]</span>
<a name="line-51"></a>
<a name="line-52"></a>
<a name="line-53"></a><a name="mkFloatExpr"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the given @Float@</span>
<a name="line-54"></a><span class='hs-definition'>mkFloatExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Float</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-55"></a><span class='hs-definition'>mkFloatExpr</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>floatDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkFloatLitFloat</span> <span class='hs-varid'>f</span><span class='hs-keyglyph'>]</span>
<a name="line-56"></a>
<a name="line-57"></a><a name="mkDoubleExpr"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the given @Double@</span>
<a name="line-58"></a><span class='hs-definition'>mkDoubleExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Double</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-59"></a><span class='hs-definition'>mkDoubleExpr</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>doubleDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkDoubleLitDouble</span> <span class='hs-varid'>d</span><span class='hs-keyglyph'>]</span>
<a name="line-60"></a>
<a name="line-61"></a>
<a name="line-62"></a><a name="mkCharExpr"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the given @Char@</span>
<a name="line-63"></a><span class='hs-definition'>mkCharExpr</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>      <span class='hs-comment'>-- Result = C# c :: Int</span>
<a name="line-64"></a><span class='hs-definition'>mkCharExpr</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>charDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkCharLit</span> <span class='hs-varid'>c</span><span class='hs-keyglyph'>]</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="mkStringExpr"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to the given @String@</span>
<a name="line-67"></a><span class='hs-definition'>mkStringExpr</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadThings</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>String</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>CoreExpr</span>  <span class='hs-comment'>-- Result :: String</span>
<a name="line-68"></a><a name="mkStringExprFS"></a><span class='hs-comment'>-- | Create a 'CoreExpr' which will evaluate to a string morally equivalent to the given @FastString@</span>
<a name="line-69"></a><span class='hs-definition'>mkStringExprFS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadThings</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>CoreExpr</span>  <span class='hs-comment'>-- Result :: String</span>
<a name="line-70"></a>
<a name="line-71"></a><span class='hs-definition'>mkStringExpr</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkStringExprFS</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkFastString</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>
<a name="line-72"></a>
<a name="line-73"></a><span class='hs-definition'>mkStringExprFS</span> <span class='hs-varid'>str</span>
<a name="line-74"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nullFS</span> <span class='hs-varid'>str</span>
<a name="line-75"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkNilExpr</span> <span class='hs-varid'>charTy</span><span class='hs-layout'>)</span>
<a name="line-76"></a>
<a name="line-77"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>lengthFS</span> <span class='hs-varid'>str</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span>
<a name="line-78"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>the_char</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkCharExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>headFS</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>
<a name="line-79"></a>       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkConsExpr</span> <span class='hs-varid'>charTy</span> <span class='hs-varid'>the_char</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkNilExpr</span> <span class='hs-varid'>charTy</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-80"></a>
<a name="line-81"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>all</span> <span class='hs-varid'>safeChar</span> <span class='hs-varid'>chars</span>
<a name="line-82"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>unpack_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupId</span> <span class='hs-varid'>unpackCStringName</span>
<a name="line-83"></a>       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>App</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-varid'>unpack_id</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-84"></a>
<a name="line-85"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-86"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>unpack_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupId</span> <span class='hs-varid'>unpackCStringUtf8Name</span>
<a name="line-87"></a>       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>App</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-varid'>unpack_id</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-88"></a>
<a name="line-89"></a>  <span class='hs-keyword'>where</span>
<a name="line-90"></a>    <span class='hs-varid'>chars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unpackFS</span> <span class='hs-varid'>str</span>
<a name="line-91"></a>    <span class='hs-varid'>safeChar</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>1</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>0x7F</span>
</pre>\end{code}

%************************************************************************
%*                                                                      *
\subsection{Tuple constructors}
%*                                                                      *
%************************************************************************

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><span class='hs-comment'>-- $big_tuples</span>
<a name="line-3"></a><span class='hs-comment'>-- #big_tuples#</span>
<a name="line-4"></a><span class='hs-comment'>--</span>
<a name="line-5"></a><span class='hs-comment'>-- GHCs built in tuples can only go up to 'mAX_TUPLE_SIZE' in arity, but</span>
<a name="line-6"></a><span class='hs-comment'>-- we might concievably want to build such a massive tuple as part of the</span>
<a name="line-7"></a><span class='hs-comment'>-- output of a desugaring stage (notably that for list comprehensions).</span>
<a name="line-8"></a><span class='hs-comment'>--</span>
<a name="line-9"></a><span class='hs-comment'>-- We call tuples above this size \"big tuples\", and emulate them by</span>
<a name="line-10"></a><span class='hs-comment'>-- creating and pattern matching on &gt;nested&lt; tuples that are expressible</span>
<a name="line-11"></a><span class='hs-comment'>-- by GHC.</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>-- Nesting policy: it's better to have a 2-tuple of 10-tuples (3 objects)</span>
<a name="line-14"></a><span class='hs-comment'>-- than a 10-tuple of 2-tuples (11 objects), so we want the leaves of any</span>
<a name="line-15"></a><span class='hs-comment'>-- construction to be big.</span>
<a name="line-16"></a><span class='hs-comment'>--</span>
<a name="line-17"></a><span class='hs-comment'>-- If you just use the 'mkBigCoreTup', 'mkBigCoreVarTupTy', 'mkTupleSelector'</span>
<a name="line-18"></a><span class='hs-comment'>-- and 'mkTupleCase' functions to do all your work with tuples you should be</span>
<a name="line-19"></a><span class='hs-comment'>-- fine, and not have to worry about the arity limitation at all.</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="mkChunkified"></a><span class='hs-comment'>-- | Lifts a \"small\" constructor into a \"big\" constructor by recursive decompositon</span>
<a name="line-22"></a><span class='hs-definition'>mkChunkified</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>      <span class='hs-comment'>-- ^ \"Small\" constructor function, of maximum input arity 'mAX_TUPLE_SIZE'</span>
<a name="line-23"></a>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>             <span class='hs-comment'>-- ^ Possible \"big\" list of things to construct from</span>
<a name="line-24"></a>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>               <span class='hs-comment'>-- ^ Constructed thing made possible by recursive decomposition</span>
<a name="line-25"></a><span class='hs-definition'>mkChunkified</span> <span class='hs-varid'>small_tuple</span> <span class='hs-keyword'>as</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_big_tuple</span> <span class='hs-layout'>(</span><span class='hs-varid'>chunkify</span> <span class='hs-keyword'>as</span><span class='hs-layout'>)</span>
<a name="line-26"></a>  <span class='hs-keyword'>where</span>
<a name="line-27"></a>	<span class='hs-comment'>-- Each sub-list is short enough to fit in a tuple</span>
<a name="line-28"></a>    <span class='hs-varid'>mk_big_tuple</span> <span class='hs-keyglyph'>[</span><span class='hs-keyword'>as</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>small_tuple</span> <span class='hs-keyword'>as</span>
<a name="line-29"></a>    <span class='hs-varid'>mk_big_tuple</span> <span class='hs-varid'>as_s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_big_tuple</span> <span class='hs-layout'>(</span><span class='hs-varid'>chunkify</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>small_tuple</span> <span class='hs-varid'>as_s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="chunkify"></a><span class='hs-definition'>chunkify</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-32"></a><span class='hs-comment'>-- ^ Split a list into lists that are small enough to have a corresponding</span>
<a name="line-33"></a><span class='hs-comment'>-- tuple arity. The sub-lists of the result all have length &lt;= 'mAX_TUPLE_SIZE'</span>
<a name="line-34"></a><span class='hs-comment'>-- But there may be more than 'mAX_TUPLE_SIZE' sub-lists</span>
<a name="line-35"></a><span class='hs-definition'>chunkify</span> <span class='hs-varid'>xs</span>
<a name="line-36"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n_xs</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>mAX_TUPLE_SIZE</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>xs</span><span class='hs-keyglyph'>]</span> 
<a name="line-37"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>		   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>split</span> <span class='hs-varid'>xs</span>
<a name="line-38"></a>  <span class='hs-keyword'>where</span>
<a name="line-39"></a>    <span class='hs-varid'>n_xs</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>xs</span>
<a name="line-40"></a>    <span class='hs-varid'>split</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-41"></a>    <span class='hs-varid'>split</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>take</span> <span class='hs-varid'>mAX_TUPLE_SIZE</span> <span class='hs-varid'>xs</span> <span class='hs-conop'>:</span> <span class='hs-varid'>split</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-varid'>mAX_TUPLE_SIZE</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-42"></a>    
</pre>\end{code}

Creating tuples and their types for Core expressions 

@mkBigCoreVarTup@ builds a tuple; the inverse to @mkTupleSelector@.  

* If it has only one element, it is the identity function.

* If there are more elements than a big tuple can have, it nests 
  the tuples.  

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="mkCoreVarTup"></a><span class='hs-comment'>-- | Build a small tuple holding the specified variables</span>
<a name="line-3"></a><span class='hs-definition'>mkCoreVarTup</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-4"></a><span class='hs-definition'>mkCoreVarTup</span> <span class='hs-varid'>ids</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkCoreTup</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-conid'>Var</span> <span class='hs-varid'>ids</span><span class='hs-layout'>)</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="mkCoreVarTupTy"></a><span class='hs-comment'>-- | Bulid the type of a small tuple that holds the specified variables</span>
<a name="line-7"></a><span class='hs-definition'>mkCoreVarTupTy</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>
<a name="line-8"></a><span class='hs-definition'>mkCoreVarTupTy</span> <span class='hs-varid'>ids</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkCoreTupTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>idType</span> <span class='hs-varid'>ids</span><span class='hs-layout'>)</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="mkCoreTup"></a><span class='hs-comment'>-- | Build a small tuple holding the specified expressions</span>
<a name="line-11"></a><span class='hs-definition'>mkCoreTup</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreExpr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-12"></a><span class='hs-definition'>mkCoreTup</span> <span class='hs-conid'>[]</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span> <span class='hs-varid'>unitDataConId</span>
<a name="line-13"></a><span class='hs-definition'>mkCoreTup</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span>
<a name="line-14"></a><span class='hs-definition'>mkCoreTup</span> <span class='hs-varid'>cs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-layout'>(</span><span class='hs-varid'>tupleCon</span> <span class='hs-conid'>Boxed</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-15"></a>                         <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span> <span class='hs-varop'>.</span> <span class='hs-varid'>exprType</span><span class='hs-layout'>)</span> <span class='hs-varid'>cs</span> <span class='hs-varop'>++</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="mkCoreTupTy"></a><span class='hs-comment'>-- | Build the type of a small tuple that holds the specified type of thing</span>
<a name="line-18"></a><span class='hs-definition'>mkCoreTupTy</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>
<a name="line-19"></a><span class='hs-definition'>mkCoreTupTy</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ty</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-20"></a><span class='hs-definition'>mkCoreTupTy</span> <span class='hs-varid'>tys</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTupleTy</span> <span class='hs-conid'>Boxed</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys</span>
<a name="line-21"></a>
<a name="line-22"></a>
<a name="line-23"></a><a name="mkBigCoreVarTup"></a><span class='hs-comment'>-- | Build a big tuple holding the specified variables</span>
<a name="line-24"></a><span class='hs-definition'>mkBigCoreVarTup</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-25"></a><span class='hs-definition'>mkBigCoreVarTup</span> <span class='hs-varid'>ids</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkBigCoreTup</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-conid'>Var</span> <span class='hs-varid'>ids</span><span class='hs-layout'>)</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="mkBigCoreVarTupTy"></a><span class='hs-comment'>-- | Build the type of a big tuple that holds the specified variables</span>
<a name="line-28"></a><span class='hs-definition'>mkBigCoreVarTupTy</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>
<a name="line-29"></a><span class='hs-definition'>mkBigCoreVarTupTy</span> <span class='hs-varid'>ids</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkBigCoreTupTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>idType</span> <span class='hs-varid'>ids</span><span class='hs-layout'>)</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="mkBigCoreTup"></a><span class='hs-comment'>-- | Build a big tuple holding the specified expressions</span>
<a name="line-32"></a><span class='hs-definition'>mkBigCoreTup</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreExpr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-33"></a><span class='hs-definition'>mkBigCoreTup</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkChunkified</span> <span class='hs-varid'>mkCoreTup</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="mkBigCoreTupTy"></a><span class='hs-comment'>-- | Build the type of a big tuple that holds the specified type of thing</span>
<a name="line-36"></a><span class='hs-definition'>mkBigCoreTupTy</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>
<a name="line-37"></a><span class='hs-definition'>mkBigCoreTupTy</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkChunkified</span> <span class='hs-varid'>mkCoreTupTy</span>
</pre>\end{code}

%************************************************************************
%*                                                                      *
\subsection{Tuple destructors}
%*                                                                      *
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="mkTupleSelector"></a><span class='hs-comment'>-- | Builds a selector which scrutises the given</span>
<a name="line-2"></a><span class='hs-comment'>-- expression and extracts the one name from the list given.</span>
<a name="line-3"></a><span class='hs-comment'>-- If you want the no-shadowing rule to apply, the caller</span>
<a name="line-4"></a><span class='hs-comment'>-- is responsible for making sure that none of these names</span>
<a name="line-5"></a><span class='hs-comment'>-- are in scope.</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- If there is just one 'Id' in the tuple, then the selector is</span>
<a name="line-8"></a><span class='hs-comment'>-- just the identity.</span>
<a name="line-9"></a><span class='hs-comment'>--</span>
<a name="line-10"></a><span class='hs-comment'>-- If necessary, we pattern match on a \"big\" tuple.</span>
<a name="line-11"></a><span class='hs-definition'>mkTupleSelector</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>         <span class='hs-comment'>-- ^ The 'Id's to pattern match the tuple against</span>
<a name="line-12"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>           <span class='hs-comment'>-- ^ The 'Id' to select</span>
<a name="line-13"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>           <span class='hs-comment'>-- ^ A variable of the same type as the scrutinee</span>
<a name="line-14"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>     <span class='hs-comment'>-- ^ Scrutinee</span>
<a name="line-15"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>     <span class='hs-comment'>-- ^ Selector expression</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-comment'>-- mkTupleSelector [a,b,c,d] b v e</span>
<a name="line-18"></a><span class='hs-comment'>--          = case e of v { </span>
<a name="line-19"></a><span class='hs-comment'>--                (p,q) -&gt; case p of p {</span>
<a name="line-20"></a><span class='hs-comment'>--                           (a,b) -&gt; b }}</span>
<a name="line-21"></a><span class='hs-comment'>-- We use 'tpl' vars for the p,q, since shadowing does not matter.</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>-- In fact, it's more convenient to generate it innermost first, getting</span>
<a name="line-24"></a><span class='hs-comment'>--</span>
<a name="line-25"></a><span class='hs-comment'>--        case (case e of v </span>
<a name="line-26"></a><span class='hs-comment'>--                (p,q) -&gt; p) of p</span>
<a name="line-27"></a><span class='hs-comment'>--          (a,b) -&gt; b</span>
<a name="line-28"></a><span class='hs-definition'>mkTupleSelector</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>the_var</span> <span class='hs-varid'>scrut_var</span> <span class='hs-varid'>scrut</span>
<a name="line-29"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_tup_sel</span> <span class='hs-layout'>(</span><span class='hs-varid'>chunkify</span> <span class='hs-varid'>vars</span><span class='hs-layout'>)</span> <span class='hs-varid'>the_var</span>
<a name="line-30"></a>  <span class='hs-keyword'>where</span>
<a name="line-31"></a>    <span class='hs-varid'>mk_tup_sel</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>vars</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>the_var</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSmallTupleSelector</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>the_var</span> <span class='hs-varid'>scrut_var</span> <span class='hs-varid'>scrut</span>
<a name="line-32"></a>    <span class='hs-varid'>mk_tup_sel</span> <span class='hs-varid'>vars_s</span> <span class='hs-varid'>the_var</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSmallTupleSelector</span> <span class='hs-varid'>group</span> <span class='hs-varid'>the_var</span> <span class='hs-varid'>tpl_v</span> <span class='hs-varop'>$</span>
<a name="line-33"></a>                                <span class='hs-varid'>mk_tup_sel</span> <span class='hs-layout'>(</span><span class='hs-varid'>chunkify</span> <span class='hs-varid'>tpl_vs</span><span class='hs-layout'>)</span> <span class='hs-varid'>tpl_v</span>
<a name="line-34"></a>        <span class='hs-keyword'>where</span>
<a name="line-35"></a>          <span class='hs-varid'>tpl_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkCoreTupTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>idType</span> <span class='hs-varid'>gp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>gp</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>vars_s</span><span class='hs-keyglyph'>]</span>
<a name="line-36"></a>          <span class='hs-varid'>tpl_vs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTemplateLocals</span> <span class='hs-varid'>tpl_tys</span>
<a name="line-37"></a>          <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>tpl_v</span><span class='hs-layout'>,</span> <span class='hs-varid'>group</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>tpl</span><span class='hs-layout'>,</span><span class='hs-varid'>gp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>tpl</span><span class='hs-layout'>,</span><span class='hs-varid'>gp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zipEqual</span> <span class='hs-str'>"mkTupleSelector"</span> <span class='hs-varid'>tpl_vs</span> <span class='hs-varid'>vars_s</span><span class='hs-layout'>,</span>
<a name="line-38"></a>                                         <span class='hs-varid'>the_var</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>gp</span> <span class='hs-keyglyph'>]</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkSmallTupleSelector"></a><span class='hs-comment'>-- | Like 'mkTupleSelector' but for tuples that are guaranteed</span>
<a name="line-2"></a><span class='hs-comment'>-- never to be \"big\".</span>
<a name="line-3"></a><span class='hs-comment'>--</span>
<a name="line-4"></a><span class='hs-comment'>-- &gt; mkSmallTupleSelector [x] x v e = [| e |]</span>
<a name="line-5"></a><span class='hs-comment'>-- &gt; mkSmallTupleSelector [x,y,z] x v e = [| case e of v { (x,y,z) -&gt; x } |]</span>
<a name="line-6"></a><span class='hs-definition'>mkSmallTupleSelector</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>        <span class='hs-comment'>-- The tuple args</span>
<a name="line-7"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>         <span class='hs-comment'>-- The selected one</span>
<a name="line-8"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>         <span class='hs-comment'>-- A variable of the same type as the scrutinee</span>
<a name="line-9"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>        <span class='hs-comment'>-- Scrutinee</span>
<a name="line-10"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-11"></a><span class='hs-definition'>mkSmallTupleSelector</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>var</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>should_be_the_same_var</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>scrut</span>
<a name="line-12"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span><span class='hs-varid'>var</span> <span class='hs-varop'>==</span> <span class='hs-varid'>should_be_the_same_var</span><span class='hs-layout'>)</span>
<a name="line-13"></a>    <span class='hs-varid'>scrut</span>
<a name="line-14"></a><span class='hs-definition'>mkSmallTupleSelector</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>the_var</span> <span class='hs-varid'>scrut_var</span> <span class='hs-varid'>scrut</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>notNull</span> <span class='hs-varid'>vars</span> <span class='hs-layout'>)</span>
<a name="line-16"></a>    <span class='hs-conid'>Case</span> <span class='hs-varid'>scrut</span> <span class='hs-varid'>scrut_var</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>the_var</span><span class='hs-layout'>)</span>
<a name="line-17"></a>         <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>DataAlt</span> <span class='hs-layout'>(</span><span class='hs-varid'>tupleCon</span> <span class='hs-conid'>Boxed</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>vars</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>vars</span><span class='hs-layout'>,</span> <span class='hs-conid'>Var</span> <span class='hs-varid'>the_var</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkTupleCase"></a><span class='hs-comment'>-- | A generalization of 'mkTupleSelector', allowing the body</span>
<a name="line-2"></a><span class='hs-comment'>-- of the case to be an arbitrary expression.</span>
<a name="line-3"></a><span class='hs-comment'>--</span>
<a name="line-4"></a><span class='hs-comment'>-- To avoid shadowing, we use uniques to invent new variables.</span>
<a name="line-5"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><span class='hs-comment'>-- If necessary we pattern match on a \"big\" tuple.</span>
<a name="line-7"></a><span class='hs-definition'>mkTupleCase</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UniqSupply</span>       <span class='hs-comment'>-- ^ For inventing names of intermediate variables</span>
<a name="line-8"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>             <span class='hs-comment'>-- ^ The tuple identifiers to pattern match on</span>
<a name="line-9"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>         <span class='hs-comment'>-- ^ Body of the case</span>
<a name="line-10"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>               <span class='hs-comment'>-- ^ A variable of the same type as the scrutinee</span>
<a name="line-11"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>         <span class='hs-comment'>-- ^ Scrutinee</span>
<a name="line-12"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-13"></a><span class='hs-comment'>-- ToDo: eliminate cases where none of the variables are needed.</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>--         mkTupleCase uniqs [a,b,c,d] body v e</span>
<a name="line-16"></a><span class='hs-comment'>--           = case e of v { (p,q) -&gt;</span>
<a name="line-17"></a><span class='hs-comment'>--             case p of p { (a,b) -&gt;</span>
<a name="line-18"></a><span class='hs-comment'>--             case q of q { (c,d) -&gt;</span>
<a name="line-19"></a><span class='hs-comment'>--             body }}}</span>
<a name="line-20"></a><span class='hs-definition'>mkTupleCase</span> <span class='hs-varid'>uniqs</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>body</span> <span class='hs-varid'>scrut_var</span> <span class='hs-varid'>scrut</span>
<a name="line-21"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_tuple_case</span> <span class='hs-varid'>uniqs</span> <span class='hs-layout'>(</span><span class='hs-varid'>chunkify</span> <span class='hs-varid'>vars</span><span class='hs-layout'>)</span> <span class='hs-varid'>body</span>
<a name="line-22"></a>  <span class='hs-keyword'>where</span>
<a name="line-23"></a>    <span class='hs-comment'>-- This is the case where don't need any nesting</span>
<a name="line-24"></a>    <span class='hs-varid'>mk_tuple_case</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>vars</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>body</span>
<a name="line-25"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSmallTupleCase</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>body</span> <span class='hs-varid'>scrut_var</span> <span class='hs-varid'>scrut</span>
<a name="line-26"></a>      
<a name="line-27"></a>    <span class='hs-comment'>-- This is the case where we must make nest tuples at least once</span>
<a name="line-28"></a>    <span class='hs-varid'>mk_tuple_case</span> <span class='hs-varid'>us</span> <span class='hs-varid'>vars_s</span> <span class='hs-varid'>body</span>
<a name="line-29"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>us'</span><span class='hs-layout'>,</span> <span class='hs-varid'>vars'</span><span class='hs-layout'>,</span> <span class='hs-varid'>body'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>one_tuple_case</span> <span class='hs-layout'>(</span><span class='hs-varid'>us</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span> <span class='hs-varid'>vars_s</span>
<a name="line-30"></a>            <span class='hs-keyword'>in</span> <span class='hs-varid'>mk_tuple_case</span> <span class='hs-varid'>us'</span> <span class='hs-layout'>(</span><span class='hs-varid'>chunkify</span> <span class='hs-varid'>vars'</span><span class='hs-layout'>)</span> <span class='hs-varid'>body'</span>
<a name="line-31"></a>    
<a name="line-32"></a>    <span class='hs-varid'>one_tuple_case</span> <span class='hs-varid'>chunk_vars</span> <span class='hs-layout'>(</span><span class='hs-varid'>us</span><span class='hs-layout'>,</span> <span class='hs-varid'>vs</span><span class='hs-layout'>,</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span>
<a name="line-33"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>us1</span><span class='hs-layout'>,</span> <span class='hs-varid'>us2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitUniqSupply</span> <span class='hs-varid'>us</span>
<a name="line-34"></a>            <span class='hs-varid'>scrut_var</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSysLocal</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"ds"</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>uniqFromSupply</span> <span class='hs-varid'>us1</span><span class='hs-layout'>)</span>
<a name="line-35"></a>              <span class='hs-layout'>(</span><span class='hs-varid'>mkCoreTupTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>idType</span> <span class='hs-varid'>chunk_vars</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-36"></a>            <span class='hs-varid'>body'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSmallTupleCase</span> <span class='hs-varid'>chunk_vars</span> <span class='hs-varid'>body</span> <span class='hs-varid'>scrut_var</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-varid'>scrut_var</span><span class='hs-layout'>)</span>
<a name="line-37"></a>        <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>us2</span><span class='hs-layout'>,</span> <span class='hs-varid'>scrut_var</span><span class='hs-conop'>:</span><span class='hs-varid'>vs</span><span class='hs-layout'>,</span> <span class='hs-varid'>body'</span><span class='hs-layout'>)</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkSmallTupleCase"></a><span class='hs-comment'>-- | As 'mkTupleCase', but for a tuple that is small enough to be guaranteed</span>
<a name="line-2"></a><span class='hs-comment'>-- not to need nesting.</span>
<a name="line-3"></a><span class='hs-definition'>mkSmallTupleCase</span>
<a name="line-4"></a>        <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>         <span class='hs-comment'>-- ^ The tuple args</span>
<a name="line-5"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>     <span class='hs-comment'>-- ^ Body of the case</span>
<a name="line-6"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>           <span class='hs-comment'>-- ^ A variable of the same type as the scrutinee</span>
<a name="line-7"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>     <span class='hs-comment'>-- ^ Scrutinee</span>
<a name="line-8"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-9"></a>
<a name="line-10"></a><span class='hs-definition'>mkSmallTupleCase</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>var</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>body</span> <span class='hs-sel'>_scrut_var</span> <span class='hs-varid'>scrut</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindNonRec</span> <span class='hs-varid'>var</span> <span class='hs-varid'>scrut</span> <span class='hs-varid'>body</span>
<a name="line-12"></a><span class='hs-definition'>mkSmallTupleCase</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>body</span> <span class='hs-varid'>scrut_var</span> <span class='hs-varid'>scrut</span>
<a name="line-13"></a><span class='hs-comment'>-- One branch no refinement?</span>
<a name="line-14"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Case</span> <span class='hs-varid'>scrut</span> <span class='hs-varid'>scrut_var</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprType</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>DataAlt</span> <span class='hs-layout'>(</span><span class='hs-varid'>tupleCon</span> <span class='hs-conid'>Boxed</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>vars</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>vars</span><span class='hs-layout'>,</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

%************************************************************************
%*                                                                      *
\subsection{Common list manipulation expressions}
%*                                                                      *
%************************************************************************

Call the constructor Ids when building explicit lists, so that they
interact well with rules.

\begin{code}
<pre><a name="line-1"></a><a name="mkNilExpr"></a><span class='hs-comment'>-- | Makes a list @[]@ for lists of the specified type</span>
<a name="line-2"></a><span class='hs-definition'>mkNilExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-3"></a><span class='hs-definition'>mkNilExpr</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>nilDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>]</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="mkConsExpr"></a><span class='hs-comment'>-- | Makes a list @(:)@ for lists of the specified type</span>
<a name="line-6"></a><span class='hs-definition'>mkConsExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-7"></a><span class='hs-definition'>mkConsExpr</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>hd</span> <span class='hs-varid'>tl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkConApp</span> <span class='hs-varid'>consDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span> <span class='hs-varid'>ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>hd</span><span class='hs-layout'>,</span> <span class='hs-varid'>tl</span><span class='hs-keyglyph'>]</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="mkListExpr"></a><span class='hs-comment'>-- | Make a list containing the given expressions, where the list has the given type</span>
<a name="line-10"></a><span class='hs-definition'>mkListExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreExpr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-11"></a><span class='hs-definition'>mkListExpr</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkConsExpr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkNilExpr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="mkFoldrExpr"></a><span class='hs-comment'>-- | Make a fully applied 'foldr' expression</span>
<a name="line-14"></a><span class='hs-definition'>mkFoldrExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadThings</span> <span class='hs-varid'>m</span>
<a name="line-15"></a>            <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Type</span>             <span class='hs-comment'>-- ^ Element type of the list</span>
<a name="line-16"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>             <span class='hs-comment'>-- ^ Fold result type</span>
<a name="line-17"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>         <span class='hs-comment'>-- ^ "Cons" function expression for the fold</span>
<a name="line-18"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>         <span class='hs-comment'>-- ^ "Nil" expression for the fold</span>
<a name="line-19"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreExpr</span>         <span class='hs-comment'>-- ^ List expression being folded acress</span>
<a name="line-20"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-21"></a><span class='hs-definition'>mkFoldrExpr</span> <span class='hs-varid'>elt_ty</span> <span class='hs-varid'>result_ty</span> <span class='hs-varid'>c</span> <span class='hs-varid'>n</span> <span class='hs-varid'>list</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-22"></a>    <span class='hs-varid'>foldr_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupId</span> <span class='hs-varid'>foldrName</span>
<a name="line-23"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-varid'>foldr_id</span> <span class='hs-varop'>`App`</span> <span class='hs-conid'>Type</span> <span class='hs-varid'>elt_ty</span> 
<a name="line-24"></a>           <span class='hs-varop'>`App`</span> <span class='hs-conid'>Type</span> <span class='hs-varid'>result_ty</span>
<a name="line-25"></a>           <span class='hs-varop'>`App`</span> <span class='hs-varid'>c</span>
<a name="line-26"></a>           <span class='hs-varop'>`App`</span> <span class='hs-varid'>n</span>
<a name="line-27"></a>           <span class='hs-varop'>`App`</span> <span class='hs-varid'>list</span><span class='hs-layout'>)</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="mkBuildExpr"></a><span class='hs-comment'>-- | Make a 'build' expression applied to a locally-bound worker function</span>
<a name="line-30"></a><span class='hs-definition'>mkBuildExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadThings</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MonadUnique</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-31"></a>            <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Type</span>                                     <span class='hs-comment'>-- ^ Type of list elements to be built</span>
<a name="line-32"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>CoreExpr</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ Function that, given information about the 'Id's</span>
<a name="line-33"></a>                                                        <span class='hs-comment'>-- of the binders for the build worker function, returns</span>
<a name="line-34"></a>                                                        <span class='hs-comment'>-- the body of that worker</span>
<a name="line-35"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-36"></a><span class='hs-definition'>mkBuildExpr</span> <span class='hs-varid'>elt_ty</span> <span class='hs-varid'>mk_build_inside</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-37"></a>    <span class='hs-keyglyph'>[</span><span class='hs-varid'>n_tyvar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newTyVars</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>alphaTyVar</span><span class='hs-keyglyph'>]</span>
<a name="line-38"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>n_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTyVarTy</span> <span class='hs-varid'>n_tyvar</span>
<a name="line-39"></a>        <span class='hs-varid'>c_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkFunTys</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>elt_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>n_ty</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>n_ty</span>
<a name="line-40"></a>    <span class='hs-keyglyph'>[</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>sequence</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkSysLocalM</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"c"</span><span class='hs-layout'>)</span> <span class='hs-varid'>c_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkSysLocalM</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"n"</span><span class='hs-layout'>)</span> <span class='hs-varid'>n_ty</span><span class='hs-keyglyph'>]</span>
<a name="line-41"></a>    
<a name="line-42"></a>    <span class='hs-varid'>build_inside</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mk_build_inside</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>c_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>n_ty</span><span class='hs-layout'>)</span>
<a name="line-43"></a>    
<a name="line-44"></a>    <span class='hs-varid'>build_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupId</span> <span class='hs-varid'>buildName</span>
<a name="line-45"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Var</span> <span class='hs-varid'>build_id</span> <span class='hs-varop'>`App`</span> <span class='hs-conid'>Type</span> <span class='hs-varid'>elt_ty</span> <span class='hs-varop'>`App`</span> <span class='hs-varid'>mkLams</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>n_tyvar</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>build_inside</span>
<a name="line-46"></a>  <span class='hs-keyword'>where</span>
<a name="line-47"></a>    <span class='hs-varid'>newTyVars</span> <span class='hs-varid'>tyvar_tmpls</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-48"></a>      <span class='hs-varid'>uniqs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getUniquesM</span>
<a name="line-49"></a>      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>zipWith</span> <span class='hs-varid'>setTyVarUnique</span> <span class='hs-varid'>tyvar_tmpls</span> <span class='hs-varid'>uniqs</span><span class='hs-layout'>)</span>
</pre>\end{code}</body>
</html>