Sophie

Sophie

distrib > Fedora > 19 > i386 > by-pkgid > 6141746cd5048a6ddf1cf3194274ce61 > files > 1335

ghc-Agda-devel-2.3.2.1-5.fc19.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://code.haskell.org/~malcolm/hscolour/ -->
<title>src/full/Agda/TypeChecking/Monad/Base.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP, ExistentialQuantification, FlexibleContexts, Rank2Types,
<a name="line-2"></a>             TypeSynonymInstances, MultiParamTypeClasses, FlexibleInstances,
<a name="line-3"></a>             UndecidableInstances, DeriveDataTypeable, GeneralizedNewtypeDeriving,
<a name="line-4"></a>             DeriveFunctor, DeriveFoldable, DeriveTraversable
<a name="line-5"></a>  #-}</span>
<a name="line-6"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>TypeChecking</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span> <span class='hs-keyword'>where</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Arrow</span>
<a name="line-9"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Concurrent</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>C</span>
<a name="line-10"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>DeepSeq</span>
<a name="line-11"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>E</span>
<a name="line-12"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Error</span>
<a name="line-13"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>State</span>
<a name="line-14"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Reader</span>
<a name="line-15"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span>
<a name="line-16"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Function</span>
<a name="line-17"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Int</span>
<a name="line-18"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Map</span>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Set</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Set</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Sequence</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Seq</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Foldable</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Traversable</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>IORef</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Hashable</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span><span class='hs-varop'>.</span><span class='hs-conid'>Common</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span><span class='hs-varop'>.</span><span class='hs-conid'>Concrete</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>C</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span><span class='hs-varop'>.</span><span class='hs-conid'>Concrete</span><span class='hs-varop'>.</span><span class='hs-conid'>Definitions</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>D</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span><span class='hs-varop'>.</span><span class='hs-conid'>Abstract</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>A</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span><span class='hs-varop'>.</span><span class='hs-conid'>Position</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span><span class='hs-varop'>.</span><span class='hs-conid'>Scope</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>HashMap</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>HMap</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>TypeChecking</span><span class='hs-varop'>.</span><span class='hs-conid'>CompiledClause</span>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Interaction</span><span class='hs-varop'>.</span><span class='hs-conid'>Exceptions</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Interaction</span><span class='hs-varop'>.</span><span class='hs-conid'>FindFile</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Interaction</span><span class='hs-varop'>.</span><span class='hs-conid'>Options</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Interaction</span><span class='hs-varop'>.</span><span class='hs-conid'>Highlighting</span><span class='hs-varop'>.</span><span class='hs-conid'>Range</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>R</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Interaction</span><span class='hs-varop'>.</span><span class='hs-conid'>Response</span>
<a name="line-43"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>InteractionOutputCallback</span><span class='hs-layout'>,</span> <span class='hs-varid'>defaultInteractionOutputCallback</span><span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Interaction</span><span class='hs-varop'>.</span><span class='hs-conid'>Highlighting</span><span class='hs-varop'>.</span><span class='hs-conid'>Precise</span>
<a name="line-45"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>CompressedFile</span><span class='hs-layout'>,</span> <span class='hs-conid'>HighlightingInfo</span><span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Compiler</span><span class='hs-varop'>.</span><span class='hs-conid'>JS</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>JS</span>
<a name="line-49"></a>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>FileName</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>Fresh</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>Permutation</span>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>Pretty</span>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>Time</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-cpp'>#include "../../undefined.h"</span>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Agda</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>Impossible</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-61"></a><span class='hs-comment'>-- * Type checking state</span>
<a name="line-62"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-63"></a>
<a name="line-64"></a><a name="TCState"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TCState</span> <span class='hs-keyglyph'>=</span>
<a name="line-65"></a>    <span class='hs-conid'>TCSt</span> <span class='hs-layout'>{</span> <span class='hs-varid'>stFreshThings</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FreshThings</span>
<a name="line-66"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stSyntaxInfo</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompressedFile</span>
<a name="line-67"></a>           <span class='hs-comment'>-- ^ Highlighting info.</span>
<a name="line-68"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stTokens</span>            <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompressedFile</span>
<a name="line-69"></a>           <span class='hs-comment'>-- ^ Highlighting info for tokens (but not those tokens for</span>
<a name="line-70"></a>           <span class='hs-comment'>-- which highlighting exists in 'stSyntaxInfo').</span>
<a name="line-71"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stTermErrs</span>          <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Seq</span> <span class='hs-conid'>TerminationError</span>
<a name="line-72"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stMetaStore</span>	       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaStore</span>
<a name="line-73"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stInteractionPoints</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InteractionPoints</span>
<a name="line-74"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stAwakeConstraints</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Constraints</span>
<a name="line-75"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stSleepingConstraints</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Constraints</span>
<a name="line-76"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stDirty</span>               <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-77"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stOccursCheckDefs</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>QName</span>
<a name="line-78"></a>           <span class='hs-comment'>-- ^ Definitions to be considered during occurs check.</span>
<a name="line-79"></a>           <span class='hs-comment'>--   Initialized to the current mutual block before the check.</span>
<a name="line-80"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stSignature</span>	       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Signature</span>
<a name="line-81"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stImports</span>	       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Signature</span>
<a name="line-82"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stImportedModules</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>ModuleName</span>
<a name="line-83"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stModuleToSource</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModuleToSource</span>
<a name="line-84"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stVisitedModules</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>VisitedModules</span>
<a name="line-85"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stCurrentModule</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>ModuleName</span>
<a name="line-86"></a>           <span class='hs-comment'>-- ^ The current module is available after it has been type</span>
<a name="line-87"></a>           <span class='hs-comment'>-- checked.</span>
<a name="line-88"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stScope</span>	       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ScopeInfo</span>
<a name="line-89"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stPatternSyns</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>PatternSynDefns</span>
<a name="line-90"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stPatternSynImports</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>PatternSynDefns</span>
<a name="line-91"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stPragmaOptions</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PragmaOptions</span>
<a name="line-92"></a>           <span class='hs-comment'>-- ^ Options applying to the current file. @OPTIONS@</span>
<a name="line-93"></a>           <span class='hs-comment'>-- pragmas only affect this field.</span>
<a name="line-94"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stStatistics</span>	       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Statistics</span>
<a name="line-95"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stExtLambdaTele</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>QName</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-96"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stMutualBlocks</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>MutualId</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-conid'>QName</span><span class='hs-layout'>)</span>
<a name="line-97"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stLocalBuiltins</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BuiltinThings</span> <span class='hs-conid'>PrimFun</span>
<a name="line-98"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stImportedBuiltins</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BuiltinThings</span> <span class='hs-conid'>PrimFun</span>
<a name="line-99"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stHaskellImports</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>String</span>
<a name="line-100"></a>           <span class='hs-comment'>-- ^ Imports that should be generated by the compiler (this</span>
<a name="line-101"></a>           <span class='hs-comment'>-- includes imports from imported modules).</span>
<a name="line-102"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stPersistent</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PersistentTCState</span>
<a name="line-103"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stInteractionOutputCallback</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InteractionOutputCallback</span>
<a name="line-104"></a>           <span class='hs-comment'>-- ^ Callback fuction to call when there is a response</span>
<a name="line-105"></a>           <span class='hs-comment'>--   to give to the interactive frontend.</span>
<a name="line-106"></a>           <span class='hs-comment'>--   See the documentation of 'InteractionOutputCallback'.</span>
<a name="line-107"></a>	 <span class='hs-layout'>}</span>
<a name="line-108"></a>
<a name="line-109"></a><span class='hs-comment'>-- | A part of the state which is not reverted when an error is thrown</span>
<a name="line-110"></a><span class='hs-comment'>-- or the state is reset.</span>
<a name="line-111"></a>
<a name="line-112"></a><a name="PersistentTCState"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PersistentTCState</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PersistentTCSt</span>
<a name="line-113"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>stDecodedModules</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DecodedModules</span>
<a name="line-114"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>stPersistentOptions</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CommandLineOptions</span>
<a name="line-115"></a>    <span class='hs-comment'>-- ^ Options which apply to all files, unless overridden.</span>
<a name="line-116"></a>  <span class='hs-layout'>}</span>
<a name="line-117"></a>
<a name="line-118"></a><a name="FreshThings"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyglyph'>=</span>
<a name="line-119"></a>	<span class='hs-conid'>Fresh</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fMeta</span>	     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaId</span>
<a name="line-120"></a>	      <span class='hs-layout'>,</span> <span class='hs-varid'>fInteraction</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InteractionId</span>
<a name="line-121"></a>	      <span class='hs-layout'>,</span> <span class='hs-varid'>fMutual</span>	     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MutualId</span>
<a name="line-122"></a>	      <span class='hs-layout'>,</span> <span class='hs-varid'>fName</span>	     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameId</span>
<a name="line-123"></a>	      <span class='hs-layout'>,</span> <span class='hs-varid'>fCtx</span>	     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CtxId</span>
<a name="line-124"></a>              <span class='hs-layout'>,</span> <span class='hs-varid'>fProblem</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProblemId</span>
<a name="line-125"></a>              <span class='hs-layout'>,</span> <span class='hs-varid'>fInt</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-126"></a>                <span class='hs-comment'>-- ^ Can be used for various things.</span>
<a name="line-127"></a>	      <span class='hs-layout'>}</span>
<a name="line-128"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-129"></a>
<a name="line-130"></a><a name="initState"></a><span class='hs-definition'>initState</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCState</span>
<a name="line-131"></a><span class='hs-definition'>initState</span> <span class='hs-keyglyph'>=</span>
<a name="line-132"></a>    <span class='hs-conid'>TCSt</span> <span class='hs-layout'>{</span> <span class='hs-varid'>stFreshThings</span>       <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Fresh</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-conid'>NameId</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fProblem</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-layout'>}</span>
<a name="line-133"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stMetaStore</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-134"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stSyntaxInfo</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mempty</span>
<a name="line-135"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stTokens</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mempty</span>
<a name="line-136"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stTermErrs</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Seq</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-137"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stInteractionPoints</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-138"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stAwakeConstraints</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-139"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stSleepingConstraints</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-140"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stDirty</span>               <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-141"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stOccursCheckDefs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Set</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-142"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stSignature</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptySignature</span>
<a name="line-143"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stImports</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptySignature</span>
<a name="line-144"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stImportedModules</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Set</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-145"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stModuleToSource</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-146"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stVisitedModules</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-147"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stCurrentModule</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-148"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stScope</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyScopeInfo</span>
<a name="line-149"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stPatternSyns</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-150"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stPatternSynImports</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-151"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stPragmaOptions</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>defaultInteractionOptions</span>
<a name="line-152"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stStatistics</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-153"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stExtLambdaTele</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-154"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stMutualBlocks</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-155"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stLocalBuiltins</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-156"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>stImportedBuiltins</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-157"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stHaskellImports</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Set</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-158"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stPersistent</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PersistentTCSt</span>
<a name="line-159"></a>           <span class='hs-layout'>{</span> <span class='hs-varid'>stPersistentOptions</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>defaultOptions</span>
<a name="line-160"></a>	   <span class='hs-layout'>,</span> <span class='hs-varid'>stDecodedModules</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-161"></a>           <span class='hs-layout'>}</span>
<a name="line-162"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>stInteractionOutputCallback</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>defaultInteractionOutputCallback</span>
<a name="line-163"></a>	 <span class='hs-layout'>}</span>
<a name="line-164"></a>
<a name="line-165"></a><a name="stBuiltinThings"></a><span class='hs-definition'>stBuiltinThings</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCState</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BuiltinThings</span> <span class='hs-conid'>PrimFun</span>
<a name="line-166"></a><span class='hs-definition'>stBuiltinThings</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>stLocalBuiltins</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`</span><span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>union</span><span class='hs-varop'>`</span> <span class='hs-varid'>stImportedBuiltins</span> <span class='hs-varid'>s</span>
<a name="line-167"></a>
<a name="line-168"></a><a name="instance%20HasFresh%20MetaId%20FreshThings"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasFresh</span> <span class='hs-conid'>MetaId</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyword'>where</span>
<a name="line-169"></a>    <span class='hs-varid'>nextFresh</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fMeta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-170"></a>	<span class='hs-keyword'>where</span>
<a name="line-171"></a>	    <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fMeta</span> <span class='hs-varid'>s</span>
<a name="line-172"></a>
<a name="line-173"></a><a name="instance%20HasFresh%20MutualId%20FreshThings"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasFresh</span> <span class='hs-conid'>MutualId</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyword'>where</span>
<a name="line-174"></a>    <span class='hs-varid'>nextFresh</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fMutual</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-175"></a>	<span class='hs-keyword'>where</span>
<a name="line-176"></a>	    <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fMutual</span> <span class='hs-varid'>s</span>
<a name="line-177"></a>
<a name="line-178"></a><a name="instance%20HasFresh%20InteractionId%20FreshThings"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasFresh</span> <span class='hs-conid'>InteractionId</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyword'>where</span>
<a name="line-179"></a>    <span class='hs-varid'>nextFresh</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fInteraction</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-180"></a>	<span class='hs-keyword'>where</span>
<a name="line-181"></a>	    <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fInteraction</span> <span class='hs-varid'>s</span>
<a name="line-182"></a>
<a name="line-183"></a><a name="instance%20HasFresh%20NameId%20FreshThings"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasFresh</span> <span class='hs-conid'>NameId</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyword'>where</span>
<a name="line-184"></a>    <span class='hs-varid'>nextFresh</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>succ</span> <span class='hs-varid'>i</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-185"></a>	<span class='hs-keyword'>where</span>
<a name="line-186"></a>	    <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fName</span> <span class='hs-varid'>s</span>
<a name="line-187"></a>
<a name="line-188"></a><a name="instance%20HasFresh%20CtxId%20FreshThings"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasFresh</span> <span class='hs-conid'>CtxId</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyword'>where</span>
<a name="line-189"></a>    <span class='hs-varid'>nextFresh</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fCtx</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>succ</span> <span class='hs-varid'>i</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-190"></a>	<span class='hs-keyword'>where</span>
<a name="line-191"></a>	    <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fCtx</span> <span class='hs-varid'>s</span>
<a name="line-192"></a>
<a name="line-193"></a><a name="instance%20HasFresh%20Int%20FreshThings"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasFresh</span> <span class='hs-conid'>Int</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyword'>where</span>
<a name="line-194"></a>    <span class='hs-varid'>nextFresh</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fInt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>succ</span> <span class='hs-varid'>i</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-195"></a>	<span class='hs-keyword'>where</span>
<a name="line-196"></a>	    <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fInt</span> <span class='hs-varid'>s</span>
<a name="line-197"></a>
<a name="line-198"></a><a name="ProblemId"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>ProblemId</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ProblemId</span> <span class='hs-conid'>Nat</span>
<a name="line-199"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Enum</span><span class='hs-layout'>,</span> <span class='hs-conid'>Real</span><span class='hs-layout'>,</span> <span class='hs-conid'>Integral</span><span class='hs-layout'>,</span> <span class='hs-conid'>Num</span><span class='hs-layout'>)</span>
<a name="line-200"></a>
<a name="line-201"></a><a name="instance%20Show%20ProblemId"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>ProblemId</span> <span class='hs-keyword'>where</span>
<a name="line-202"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>ProblemId</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varid'>n</span>
<a name="line-203"></a>
<a name="line-204"></a><a name="instance%20HasFresh%20ProblemId%20FreshThings"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasFresh</span> <span class='hs-conid'>ProblemId</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyword'>where</span>
<a name="line-205"></a>  <span class='hs-varid'>nextFresh</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fProblem</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>succ</span> <span class='hs-varid'>i</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-206"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fProblem</span> <span class='hs-varid'>s</span>
<a name="line-207"></a>
<a name="line-208"></a><a name="instance%20HasFresh%20i%20TCState"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasFresh</span> <span class='hs-varid'>i</span> <span class='hs-conid'>FreshThings</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HasFresh</span> <span class='hs-varid'>i</span> <span class='hs-conid'>TCState</span> <span class='hs-keyword'>where</span>
<a name="line-209"></a>    <span class='hs-varid'>nextFresh</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>(,)</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>stFreshThings</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-layout'>}</span>
<a name="line-210"></a>	<span class='hs-keyword'>where</span>
<a name="line-211"></a>	    <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nextFresh</span> <span class='hs-varop'>$</span> <span class='hs-varid'>stFreshThings</span> <span class='hs-varid'>s</span>
<a name="line-212"></a>
<a name="line-213"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-214"></a><span class='hs-comment'>-- ** Interface</span>
<a name="line-215"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-216"></a>
<a name="line-217"></a><a name="ModuleInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ModuleInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModuleInfo</span>
<a name="line-218"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>miInterface</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Interface</span>
<a name="line-219"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>miWarnings</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-220"></a>    <span class='hs-comment'>-- ^ 'True' if warnings were encountered when the module was type</span>
<a name="line-221"></a>    <span class='hs-comment'>-- checked.</span>
<a name="line-222"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>miTimeStamp</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ClockTime</span>
<a name="line-223"></a>    <span class='hs-comment'>-- ^ The modification time stamp of the interface file when the</span>
<a name="line-224"></a>    <span class='hs-comment'>-- interface was read or written. Alternatively, if warnings were</span>
<a name="line-225"></a>    <span class='hs-comment'>-- encountered (in which case there may not be any up-to-date</span>
<a name="line-226"></a>    <span class='hs-comment'>-- interface file), the time at which the interface was produced</span>
<a name="line-227"></a>    <span class='hs-comment'>-- (approximately).</span>
<a name="line-228"></a>  <span class='hs-layout'>}</span>
<a name="line-229"></a>
<a name="line-230"></a><span class='hs-comment'>-- Note that the use of 'C.TopLevelModuleName' here is a potential</span>
<a name="line-231"></a><span class='hs-comment'>-- performance problem, because these names do not contain unique</span>
<a name="line-232"></a><span class='hs-comment'>-- identifiers.</span>
<a name="line-233"></a>
<a name="line-234"></a><a name="VisitedModules"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>VisitedModules</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span> <span class='hs-conid'>ModuleInfo</span>
<a name="line-235"></a><a name="DecodedModules"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>DecodedModules</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span> <span class='hs-layout'>(</span><span class='hs-conid'>Interface</span><span class='hs-layout'>,</span> <span class='hs-conid'>ClockTime</span><span class='hs-layout'>)</span>
<a name="line-236"></a>
<a name="line-237"></a><a name="Interface"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Interface</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Interface</span>
<a name="line-238"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>iImportedModules</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ModuleName</span><span class='hs-keyglyph'>]</span>
<a name="line-239"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>iModuleName</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModuleName</span>
<a name="line-240"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>iScope</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>ModuleName</span> <span class='hs-conid'>Scope</span>
<a name="line-241"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>iInsideScope</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ScopeInfo</span>
<a name="line-242"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>iSignature</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Signature</span>
<a name="line-243"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>iBuiltin</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BuiltinThings</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>QName</span><span class='hs-layout'>)</span>
<a name="line-244"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>iHaskellImports</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>String</span>
<a name="line-245"></a>                              <span class='hs-comment'>-- ^ Haskell imports listed in</span>
<a name="line-246"></a>                              <span class='hs-comment'>-- (transitively) imported modules are</span>
<a name="line-247"></a>                              <span class='hs-comment'>-- not included here.</span>
<a name="line-248"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>iHighlighting</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HighlightingInfo</span>
<a name="line-249"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>iPragmaOptions</span>   <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OptionsPragma</span><span class='hs-keyglyph'>]</span>
<a name="line-250"></a>                              <span class='hs-comment'>-- ^ Pragma options set in the file.</span>
<a name="line-251"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>iPatternSyns</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>PatternSynDefns</span>
<a name="line-252"></a>	<span class='hs-layout'>}</span>
<a name="line-253"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-254"></a>
<a name="line-255"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-256"></a><span class='hs-comment'>-- ** Closure</span>
<a name="line-257"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-258"></a>
<a name="line-259"></a><a name="Closure"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Closure</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Closure</span> <span class='hs-layout'>{</span> <span class='hs-varid'>clSignature</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Signature</span>
<a name="line-260"></a>			 <span class='hs-layout'>,</span> <span class='hs-varid'>clEnv</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCEnv</span>
<a name="line-261"></a>			 <span class='hs-layout'>,</span> <span class='hs-varid'>clScope</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>ScopeInfo</span>
<a name="line-262"></a>			 <span class='hs-layout'>,</span> <span class='hs-varid'>clValue</span>	<span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span>
<a name="line-263"></a>			 <span class='hs-layout'>}</span>
<a name="line-264"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-265"></a>
<a name="line-266"></a><a name="instance%20Show%20(Closure%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>Closure</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-267"></a>  <span class='hs-varid'>show</span> <span class='hs-varid'>cl</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"Closure "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>clValue</span> <span class='hs-varid'>cl</span><span class='hs-layout'>)</span>
<a name="line-268"></a>
<a name="line-269"></a><a name="instance%20HasRange%20(Closure%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasRange</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HasRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>Closure</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-270"></a>    <span class='hs-varid'>getRange</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varop'>.</span> <span class='hs-varid'>clValue</span>
<a name="line-271"></a>
<a name="line-272"></a><a name="buildClosure"></a><span class='hs-definition'>buildClosure</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Closure</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-273"></a><span class='hs-definition'>buildClosure</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-274"></a>    <span class='hs-varid'>env</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ask</span>
<a name="line-275"></a>    <span class='hs-varid'>sig</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>stSignature</span>
<a name="line-276"></a>    <span class='hs-varid'>scope</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>stScope</span>
<a name="line-277"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Closure</span> <span class='hs-varid'>sig</span> <span class='hs-varid'>env</span> <span class='hs-varid'>scope</span> <span class='hs-varid'>x</span>
<a name="line-278"></a>
<a name="line-279"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-280"></a><span class='hs-comment'>-- ** Constraints</span>
<a name="line-281"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-282"></a>
<a name="line-283"></a><a name="Constraints"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Constraints</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ProblemConstraint</span><span class='hs-keyglyph'>]</span>
<a name="line-284"></a>
<a name="line-285"></a><a name="ProblemConstraint"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ProblemConstraint</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PConstr</span>
<a name="line-286"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>constraintProblem</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProblemId</span>
<a name="line-287"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>theConstraint</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Closure</span> <span class='hs-conid'>Constraint</span>
<a name="line-288"></a>  <span class='hs-layout'>}</span>
<a name="line-289"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-290"></a>
<a name="line-291"></a><a name="Constraint"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Constraint</span>
<a name="line-292"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ValueCmp</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Term</span>
<a name="line-293"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ElimCmp</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Polarity</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>Term</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Elim</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Elim</span><span class='hs-keyglyph'>]</span>
<a name="line-294"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TypeCmp</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>Type</span>
<a name="line-295"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TelCmp</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Telescope</span> <span class='hs-conid'>Telescope</span> <span class='hs-comment'>-- ^ the two types are for the error message only</span>
<a name="line-296"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SortCmp</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Sort</span> <span class='hs-conid'>Sort</span>
<a name="line-297"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>LevelCmp</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Level</span> <span class='hs-conid'>Level</span>
<a name="line-298"></a><span class='hs-comment'>--  | ShortCut MetaId Term Type</span>
<a name="line-299"></a><span class='hs-comment'>--    -- ^ A delayed instantiation.  Replaces @ValueCmp@ in 'postponeTypeCheckingProblem'.</span>
<a name="line-300"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnBlock</span> <span class='hs-conid'>MetaId</span>
<a name="line-301"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Guarded</span> <span class='hs-conid'>Constraint</span> <span class='hs-conid'>ProblemId</span>
<a name="line-302"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IsEmpty</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>Type</span>
<a name="line-303"></a>    <span class='hs-comment'>-- ^ the range is the one of the absurd pattern</span>
<a name="line-304"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FindInScope</span> <span class='hs-conid'>MetaId</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Term</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-305"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-306"></a>
<a name="line-307"></a><a name="Comparison"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Comparison</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmpEq</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmpLeq</span>
<a name="line-308"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-309"></a>
<a name="line-310"></a><a name="instance%20Show%20Comparison"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>Comparison</span> <span class='hs-keyword'>where</span>
<a name="line-311"></a>  <span class='hs-varid'>show</span> <span class='hs-conid'>CmpEq</span>  <span class='hs-keyglyph'>=</span> <span class='hs-str'>"="</span>
<a name="line-312"></a>  <span class='hs-varid'>show</span> <span class='hs-conid'>CmpLeq</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"=&lt;"</span>
<a name="line-313"></a>
<a name="line-314"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-315"></a><span class='hs-comment'>-- * Open things</span>
<a name="line-316"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-317"></a>
<a name="line-318"></a><a name="Open"></a><span class='hs-comment'>-- | A thing tagged with the context it came from.</span>
<a name="line-319"></a><a name="Open"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Open</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OpenThing</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CtxId</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>a</span>
<a name="line-320"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>)</span>
<a name="line-321"></a>
<a name="line-322"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-323"></a><span class='hs-comment'>-- * Judgements</span>
<a name="line-324"></a><span class='hs-comment'>--</span>
<a name="line-325"></a><span class='hs-comment'>-- Used exclusively for typing of meta variables.</span>
<a name="line-326"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-327"></a>
<a name="line-328"></a><a name="Judgement"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Judgement</span> <span class='hs-varid'>t</span> <span class='hs-varid'>a</span>
<a name="line-329"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>HasType</span> <span class='hs-layout'>{</span> <span class='hs-varid'>jMetaId</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>jMetaType</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>t</span> <span class='hs-layout'>}</span>
<a name="line-330"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>IsSort</span>  <span class='hs-layout'>{</span> <span class='hs-varid'>jMetaId</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>jMetaType</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>t</span> <span class='hs-layout'>}</span> <span class='hs-comment'>-- Andreas, 2011-04-26: type needed for higher-order sort metas</span>
<a name="line-331"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>,</span> <span class='hs-conid'>Foldable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Traversable</span><span class='hs-layout'>)</span>
<a name="line-332"></a>
<a name="line-333"></a><a name="instance%20Show%20(Judgement%20t%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>t</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>Judgement</span> <span class='hs-varid'>t</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-334"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>HasType</span> <span class='hs-varid'>a</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varid'>a</span> <span class='hs-varop'>++</span> <span class='hs-str'>" : "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>t</span>
<a name="line-335"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>IsSort</span>  <span class='hs-varid'>a</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varid'>a</span> <span class='hs-varop'>++</span> <span class='hs-str'>" :sort "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>t</span>
<a name="line-336"></a>
<a name="line-337"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-338"></a><span class='hs-comment'>-- ** Meta variables</span>
<a name="line-339"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-340"></a>
<a name="line-341"></a><a name="MetaVariable"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>MetaVariable</span> <span class='hs-keyglyph'>=</span>
<a name="line-342"></a>	<span class='hs-conid'>MetaVar</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>mvInfo</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaInfo</span>
<a name="line-343"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>mvPriority</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaPriority</span> <span class='hs-comment'>-- ^ some metavariables are more eager to be instantiated</span>
<a name="line-344"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>mvPermutation</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Permutation</span>
<a name="line-345"></a>                  <span class='hs-comment'>-- ^ a metavariable doesn't have to depend on all variables</span>
<a name="line-346"></a>                  <span class='hs-comment'>--   in the context, this "permutation" will throw away the</span>
<a name="line-347"></a>                  <span class='hs-comment'>--   ones it does not depend on</span>
<a name="line-348"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>mvJudgement</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Judgement</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>MetaId</span>
<a name="line-349"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>mvInstantiation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaInstantiation</span>
<a name="line-350"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>mvListeners</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Listener</span> <span class='hs-comment'>-- ^ meta variables scheduled for eta-expansion but blocked by this one</span>
<a name="line-351"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>mvFrozen</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Frozen</span> <span class='hs-comment'>-- ^ are we past the point where we can instantiate this meta variable?</span>
<a name="line-352"></a>		<span class='hs-layout'>}</span>
<a name="line-353"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-354"></a>
<a name="line-355"></a><a name="Listener"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Listener</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EtaExpand</span> <span class='hs-conid'>MetaId</span>
<a name="line-356"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckConstraint</span> <span class='hs-conid'>Nat</span> <span class='hs-conid'>ProblemConstraint</span>
<a name="line-357"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-358"></a>
<a name="line-359"></a><a name="instance%20Eq%20Listener"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>Listener</span> <span class='hs-keyword'>where</span>
<a name="line-360"></a>  <span class='hs-conid'>EtaExpand</span>       <span class='hs-varid'>x</span>   <span class='hs-varop'>==</span> <span class='hs-conid'>EtaExpand</span>       <span class='hs-varid'>y</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-varid'>y</span>
<a name="line-361"></a>  <span class='hs-conid'>CheckConstraint</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CheckConstraint</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-varid'>y</span>
<a name="line-362"></a>  <span class='hs-keyword'>_</span> <span class='hs-varop'>==</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-363"></a>
<a name="line-364"></a><a name="instance%20Ord%20Listener"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Ord</span> <span class='hs-conid'>Listener</span> <span class='hs-keyword'>where</span>
<a name="line-365"></a>  <span class='hs-conid'>EtaExpand</span>       <span class='hs-varid'>x</span>   <span class='hs-varop'>`compare`</span> <span class='hs-conid'>EtaExpand</span>       <span class='hs-varid'>y</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>y</span>
<a name="line-366"></a>  <span class='hs-conid'>CheckConstraint</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span> <span class='hs-varop'>`compare`</span> <span class='hs-conid'>CheckConstraint</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>y</span>
<a name="line-367"></a>  <span class='hs-conid'>EtaExpand</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-varop'>`compare`</span> <span class='hs-conid'>CheckConstraint</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-368"></a>  <span class='hs-conid'>CheckConstraint</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-varop'>`compare`</span> <span class='hs-conid'>EtaExpand</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Prelude</span><span class='hs-varop'>.</span><span class='hs-conid'>GT</span>
<a name="line-369"></a>
<a name="line-370"></a><a name="Frozen"></a><span class='hs-comment'>-- | Frozen meta variable cannot be instantiated by unification.</span>
<a name="line-371"></a><a name="Frozen"></a><span class='hs-comment'>--   This serves to prevent the completion of a definition by its use</span>
<a name="line-372"></a><a name="Frozen"></a><span class='hs-comment'>--   outside of the current block.</span>
<a name="line-373"></a><a name="Frozen"></a><span class='hs-comment'>--   (See issues 118, 288, 399).</span>
<a name="line-374"></a><a name="Frozen"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Frozen</span>
<a name="line-375"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Frozen</span>        <span class='hs-comment'>-- ^ Do not instantiate.</span>
<a name="line-376"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Instantiable</span>
<a name="line-377"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-378"></a>
<a name="line-379"></a><a name="MetaInstantiation"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>MetaInstantiation</span>
<a name="line-380"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>InstV</span> <span class='hs-conid'>Term</span>         <span class='hs-comment'>-- ^ solved by term</span>
<a name="line-381"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>InstS</span> <span class='hs-conid'>Term</span>         <span class='hs-comment'>-- ^ solved by @Lam .. Sort s@</span>
<a name="line-382"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>Open</span>               <span class='hs-comment'>-- ^ unsolved</span>
<a name="line-383"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>OpenIFS</span>            <span class='hs-comment'>-- ^ open, to be instantiated as "implicit from scope"</span>
<a name="line-384"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>BlockedConst</span> <span class='hs-conid'>Term</span>  <span class='hs-comment'>-- ^ solution blocked by unsolved constraints</span>
<a name="line-385"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PostponedTypeCheckingProblem</span> <span class='hs-layout'>(</span><span class='hs-conid'>Closure</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>TCM</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-386"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-387"></a>
<a name="line-388"></a><a name="instance%20Show%20MetaInstantiation"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>MetaInstantiation</span> <span class='hs-keyword'>where</span>
<a name="line-389"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstV</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"InstV ("</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>t</span> <span class='hs-varop'>++</span> <span class='hs-str'>")"</span>
<a name="line-390"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstS</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"InstS ("</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>s</span> <span class='hs-varop'>++</span> <span class='hs-str'>")"</span>
<a name="line-391"></a>  <span class='hs-varid'>show</span> <span class='hs-conid'>Open</span>      <span class='hs-keyglyph'>=</span> <span class='hs-str'>"Open"</span>
<a name="line-392"></a>  <span class='hs-varid'>show</span> <span class='hs-conid'>OpenIFS</span>   <span class='hs-keyglyph'>=</span> <span class='hs-str'>"OpenIFS"</span>
<a name="line-393"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>BlockedConst</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"BlockedConst ("</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>t</span> <span class='hs-varop'>++</span> <span class='hs-str'>")"</span>
<a name="line-394"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>PostponedTypeCheckingProblem</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"PostponedTypeCheckingProblem (...)"</span>
<a name="line-395"></a>
<a name="line-396"></a><a name="MetaPriority"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>MetaPriority</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MetaPriority</span> <span class='hs-conid'>Int</span>
<a name="line-397"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-398"></a>
<a name="line-399"></a><a name="RunMetaOccursCheck"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>RunMetaOccursCheck</span>
<a name="line-400"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RunMetaOccursCheck</span>
<a name="line-401"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DontRunMetaOccursCheck</span>
<a name="line-402"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-403"></a>
<a name="line-404"></a><a name="MetaInfo"></a><span class='hs-comment'>-- | @MetaInfo@ is cloned from one meta to the next during pruning.</span>
<a name="line-405"></a><a name="MetaInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>MetaInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MetaInfo</span>
<a name="line-406"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>miClosRange</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Closure</span> <span class='hs-conid'>Range</span> <span class='hs-comment'>-- TODO: Not so nice. But we want both to have the environment of the meta (Closure) and its range.</span>
<a name="line-407"></a><span class='hs-comment'>--  , miRelevance       :: Relevance          -- ^ Created in irrelevant position?</span>
<a name="line-408"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>miMetaOccursCheck</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RunMetaOccursCheck</span> <span class='hs-comment'>-- ^ Run the extended occurs check that goes in definitions?</span>
<a name="line-409"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>miNameSuggestion</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaNameSuggestion</span>
<a name="line-410"></a>    <span class='hs-comment'>-- ^ Used for printing.</span>
<a name="line-411"></a>    <span class='hs-comment'>--   @Just x@ if meta-variable comes from omitted argument with name @x@.</span>
<a name="line-412"></a>  <span class='hs-layout'>}</span>
<a name="line-413"></a>
<a name="line-414"></a><a name="MetaNameSuggestion"></a><span class='hs-comment'>-- | Name suggestion for meta variable.  Empty string means no suggestion.</span>
<a name="line-415"></a><a name="MetaNameSuggestion"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>MetaNameSuggestion</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span>
<a name="line-416"></a>
<a name="line-417"></a><a name="NamedMeta"></a><span class='hs-comment'>-- | For printing, we couple a meta with its name suggestion.</span>
<a name="line-418"></a><a name="NamedMeta"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>NamedMeta</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NamedMeta</span>
<a name="line-419"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>nmSuggestion</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaNameSuggestion</span>
<a name="line-420"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>nmid</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaId</span>
<a name="line-421"></a>  <span class='hs-layout'>}</span>
<a name="line-422"></a>
<a name="line-423"></a><a name="instance%20Show%20NamedMeta"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>NamedMeta</span> <span class='hs-keyword'>where</span>
<a name="line-424"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>NamedMeta</span> <span class='hs-str'>""</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varid'>x</span>
<a name="line-425"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>NamedMeta</span> <span class='hs-varid'>s</span>  <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"_"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>s</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>x</span>
<a name="line-426"></a>
<a name="line-427"></a><a name="MetaStore"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>MetaStore</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>MetaId</span> <span class='hs-conid'>MetaVariable</span>
<a name="line-428"></a>
<a name="line-429"></a><a name="instance%20HasRange%20MetaVariable"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasRange</span> <span class='hs-conid'>MetaVariable</span> <span class='hs-keyword'>where</span>
<a name="line-430"></a>    <span class='hs-varid'>getRange</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getMetaInfo</span> <span class='hs-varid'>m</span>
<a name="line-431"></a>
<a name="line-432"></a><a name="instance%20SetRange%20MetaVariable"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>SetRange</span> <span class='hs-conid'>MetaVariable</span> <span class='hs-keyword'>where</span>
<a name="line-433"></a>  <span class='hs-varid'>setRange</span> <span class='hs-varid'>r</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>m</span> <span class='hs-layout'>{</span> <span class='hs-varid'>mvInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>mvInfo</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-434"></a>                     <span class='hs-layout'>{</span> <span class='hs-varid'>miClosRange</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>miClosRange</span> <span class='hs-layout'>(</span><span class='hs-varid'>mvInfo</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-435"></a>                       <span class='hs-layout'>{</span> <span class='hs-varid'>clValue</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-436"></a>
<a name="line-437"></a><a name="normalMetaPriority"></a><span class='hs-definition'>normalMetaPriority</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaPriority</span>
<a name="line-438"></a><span class='hs-definition'>normalMetaPriority</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MetaPriority</span> <span class='hs-num'>0</span>
<a name="line-439"></a>
<a name="line-440"></a><a name="lowMetaPriority"></a><span class='hs-definition'>lowMetaPriority</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaPriority</span>
<a name="line-441"></a><span class='hs-definition'>lowMetaPriority</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MetaPriority</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>10</span><span class='hs-layout'>)</span>
<a name="line-442"></a>
<a name="line-443"></a><a name="highMetaPriority"></a><span class='hs-definition'>highMetaPriority</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaPriority</span>
<a name="line-444"></a><span class='hs-definition'>highMetaPriority</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MetaPriority</span> <span class='hs-num'>10</span>
<a name="line-445"></a>
<a name="line-446"></a><a name="getMetaInfo"></a><span class='hs-definition'>getMetaInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaVariable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Closure</span> <span class='hs-conid'>Range</span>
<a name="line-447"></a><span class='hs-definition'>getMetaInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>miClosRange</span> <span class='hs-varop'>.</span> <span class='hs-varid'>mvInfo</span>
<a name="line-448"></a>
<a name="line-449"></a><a name="getMetaScope"></a><span class='hs-definition'>getMetaScope</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaVariable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ScopeInfo</span>
<a name="line-450"></a><span class='hs-definition'>getMetaScope</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>clScope</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getMetaInfo</span> <span class='hs-varid'>m</span>
<a name="line-451"></a>
<a name="line-452"></a><a name="getMetaEnv"></a><span class='hs-definition'>getMetaEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaVariable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCEnv</span>
<a name="line-453"></a><span class='hs-definition'>getMetaEnv</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>clEnv</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getMetaInfo</span> <span class='hs-varid'>m</span>
<a name="line-454"></a>
<a name="line-455"></a><a name="getMetaSig"></a><span class='hs-definition'>getMetaSig</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaVariable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Signature</span>
<a name="line-456"></a><span class='hs-definition'>getMetaSig</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>clSignature</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getMetaInfo</span> <span class='hs-varid'>m</span>
<a name="line-457"></a>
<a name="line-458"></a><a name="getMetaRelevance"></a><span class='hs-definition'>getMetaRelevance</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MetaVariable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Relevance</span>
<a name="line-459"></a><span class='hs-definition'>getMetaRelevance</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>envRelevance</span> <span class='hs-varop'>.</span> <span class='hs-varid'>getMetaEnv</span>
<a name="line-460"></a>
<a name="line-461"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-462"></a><span class='hs-comment'>-- ** Interaction meta variables</span>
<a name="line-463"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-464"></a>
<a name="line-465"></a><a name="InteractionPoints"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>InteractionPoints</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>InteractionId</span> <span class='hs-conid'>MetaId</span>
<a name="line-466"></a>
<a name="line-467"></a><a name="InteractionId"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>InteractionId</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InteractionId</span> <span class='hs-conid'>Nat</span>
<a name="line-468"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>,</span><span class='hs-conid'>Num</span><span class='hs-layout'>,</span><span class='hs-conid'>Integral</span><span class='hs-layout'>,</span><span class='hs-conid'>Real</span><span class='hs-layout'>,</span><span class='hs-conid'>Enum</span><span class='hs-layout'>)</span>
<a name="line-469"></a>
<a name="line-470"></a><a name="instance%20Show%20InteractionId"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>InteractionId</span> <span class='hs-keyword'>where</span>
<a name="line-471"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>InteractionId</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"?"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>x</span>
<a name="line-472"></a>
<a name="line-473"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-474"></a><span class='hs-comment'>-- ** Signature</span>
<a name="line-475"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-476"></a>
<a name="line-477"></a><a name="Signature"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Signature</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Sig</span>
<a name="line-478"></a>      <span class='hs-layout'>{</span> <span class='hs-varid'>sigSections</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Sections</span>
<a name="line-479"></a>      <span class='hs-layout'>,</span> <span class='hs-varid'>sigDefinitions</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Definitions</span>
<a name="line-480"></a>      <span class='hs-layout'>}</span>
<a name="line-481"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-482"></a>
<a name="line-483"></a><a name="Sections"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Sections</span>	 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>ModuleName</span> <span class='hs-conid'>Section</span>
<a name="line-484"></a><a name="Definitions"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Definitions</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HashMap</span> <span class='hs-conid'>QName</span> <span class='hs-conid'>Definition</span>
<a name="line-485"></a>
<a name="line-486"></a><a name="Section"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Section</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Section</span>
<a name="line-487"></a>      <span class='hs-layout'>{</span> <span class='hs-varid'>secTelescope</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Telescope</span>
<a name="line-488"></a>      <span class='hs-layout'>,</span> <span class='hs-varid'>secFreeVars</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span>	    <span class='hs-comment'>-- ^ This is the number of parameters when</span>
<a name="line-489"></a>				    <span class='hs-comment'>--	 we're inside the section and 0</span>
<a name="line-490"></a>				    <span class='hs-comment'>--	 outside. It's used to know how much of</span>
<a name="line-491"></a>				    <span class='hs-comment'>--	 the context to apply function from the</span>
<a name="line-492"></a>				    <span class='hs-comment'>--	 section to when translating from</span>
<a name="line-493"></a>				    <span class='hs-comment'>--	 abstract to internal syntax.</span>
<a name="line-494"></a>      <span class='hs-layout'>}</span>
<a name="line-495"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-496"></a>
<a name="line-497"></a><a name="emptySignature"></a><span class='hs-definition'>emptySignature</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Signature</span>
<a name="line-498"></a><span class='hs-definition'>emptySignature</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Sig</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span> <span class='hs-conid'>HMap</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-499"></a>
<a name="line-500"></a><a name="DisplayForm"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>DisplayForm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Display</span> <span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Term</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>DisplayTerm</span>
<a name="line-501"></a>		<span class='hs-comment'>-- ^ The three arguments are:</span>
<a name="line-502"></a>		<span class='hs-comment'>--</span>
<a name="line-503"></a>		<span class='hs-comment'>--   * @n@: number of free variables;</span>
<a name="line-504"></a>		<span class='hs-comment'>--</span>
<a name="line-505"></a>		<span class='hs-comment'>--   * Patterns for arguments, one extra free var which</span>
<a name="line-506"></a>		<span class='hs-comment'>--     represents pattern vars. There should @n@ of them.</span>
<a name="line-507"></a>		<span class='hs-comment'>--</span>
<a name="line-508"></a>		<span class='hs-comment'>--   * Display form. @n@ free variables.</span>
<a name="line-509"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-510"></a>
<a name="line-511"></a><a name="DisplayTerm"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>DisplayTerm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DWithApp</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DisplayTerm</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>Args</span>
<a name="line-512"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DCon</span> <span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>DisplayTerm</span><span class='hs-keyglyph'>]</span>
<a name="line-513"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DDef</span> <span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>DisplayTerm</span><span class='hs-keyglyph'>]</span>
<a name="line-514"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DDot</span> <span class='hs-conid'>Term</span>
<a name="line-515"></a>		 <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DTerm</span> <span class='hs-conid'>Term</span>
<a name="line-516"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-517"></a>
<a name="line-518"></a><a name="defaultDisplayForm"></a><span class='hs-definition'>defaultDisplayForm</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Open</span> <span class='hs-conid'>DisplayForm</span><span class='hs-keyglyph'>]</span>
<a name="line-519"></a><span class='hs-definition'>defaultDisplayForm</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-520"></a>
<a name="line-521"></a><a name="Definition"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Definition</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Defn</span>
<a name="line-522"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>defRelevance</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Relevance</span> <span class='hs-comment'>-- ^ Some defs can be irrelevant (but not hidden).</span>
<a name="line-523"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>defName</span>           <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span>
<a name="line-524"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>defType</span>           <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span>	      <span class='hs-comment'>-- ^ Type of the lifted definition.</span>
<a name="line-525"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>defPolarity</span>       <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Polarity</span><span class='hs-keyglyph'>]</span>
<a name="line-526"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>defArgOccurrences</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Occurrence</span><span class='hs-keyglyph'>]</span>
<a name="line-527"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>defDisplay</span>        <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Open</span> <span class='hs-conid'>DisplayForm</span><span class='hs-keyglyph'>]</span>
<a name="line-528"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>defMutual</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MutualId</span>
<a name="line-529"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>defCompiledRep</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompiledRepresentation</span>
<a name="line-530"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>theDef</span>            <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Defn</span>
<a name="line-531"></a>  <span class='hs-layout'>}</span>
<a name="line-532"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-533"></a>
<a name="line-534"></a><a name="HaskellCode"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>HaskellCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span>
<a name="line-535"></a><a name="HaskellType"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>HaskellType</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span>
<a name="line-536"></a><a name="EpicCode"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>EpicCode</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span>
<a name="line-537"></a><a name="JSCode"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>JSCode</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>JS</span><span class='hs-varop'>.</span><span class='hs-conid'>Exp</span>
<a name="line-538"></a>
<a name="line-539"></a><a name="HaskellRepresentation"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HaskellRepresentation</span>
<a name="line-540"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HsDefn</span> <span class='hs-conid'>HaskellType</span> <span class='hs-conid'>HaskellCode</span>
<a name="line-541"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>HaskellType</span>
<a name="line-542"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-543"></a>
<a name="line-544"></a><a name="Polarity"></a><span class='hs-comment'>-- | Polarity for equality and subtype checking.</span>
<a name="line-545"></a><a name="Polarity"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Polarity</span>
<a name="line-546"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Covariant</span>      <span class='hs-comment'>-- ^ monotone</span>
<a name="line-547"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Contravariant</span>  <span class='hs-comment'>-- ^ antitone</span>
<a name="line-548"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Invariant</span>      <span class='hs-comment'>-- ^ no information (mixed variance)</span>
<a name="line-549"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Nonvariant</span>     <span class='hs-comment'>-- ^ constant</span>
<a name="line-550"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>)</span>
<a name="line-551"></a>
<a name="line-552"></a><a name="CompiledRepresentation"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CompiledRepresentation</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompiledRep</span>
<a name="line-553"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>compiledHaskell</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>HaskellRepresentation</span>
<a name="line-554"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>compiledEpic</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>EpicCode</span>
<a name="line-555"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>compiledJS</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>JSCode</span>
<a name="line-556"></a>  <span class='hs-layout'>}</span>
<a name="line-557"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-558"></a>
<a name="line-559"></a><a name="noCompiledRep"></a><span class='hs-definition'>noCompiledRep</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompiledRepresentation</span>
<a name="line-560"></a><span class='hs-definition'>noCompiledRep</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompiledRep</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span>
<a name="line-561"></a>
<a name="line-562"></a><a name="Occurrence"></a><span class='hs-comment'>-- | Subterm occurrences for positivity checking.</span>
<a name="line-563"></a><a name="Occurrence"></a><span class='hs-comment'>--   The constructors are listed in increasing information they provide:</span>
<a name="line-564"></a><a name="Occurrence"></a><span class='hs-comment'>--   @Mixed &lt;= JustPos &lt;= StrictPos &lt;= GuardPos &lt;= Unused@</span>
<a name="line-565"></a><a name="Occurrence"></a><span class='hs-comment'>--   @Mixed &lt;= JustNeg &lt;= Unused@.</span>
<a name="line-566"></a><a name="Occurrence"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Occurrence</span>
<a name="line-567"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Mixed</span>     <span class='hs-comment'>-- ^ Arbitrary occurrence (positive and negative).</span>
<a name="line-568"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>JustNeg</span>   <span class='hs-comment'>-- ^ Negative occurrence.</span>
<a name="line-569"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>JustPos</span>   <span class='hs-comment'>-- ^ Positive occurrence, but not strictly positive.</span>
<a name="line-570"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>StrictPos</span> <span class='hs-comment'>-- ^ Strictly positive occurrence.</span>
<a name="line-571"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>GuardPos</span>  <span class='hs-comment'>-- ^ Guarded strictly positive occurrence (i.e., under ∞).  For checking recursive records.</span>
<a name="line-572"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Unused</span>    <span class='hs-comment'>--  ^ No occurrence.</span>
<a name="line-573"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>)</span>
<a name="line-574"></a>
<a name="line-575"></a><a name="instance%20NFData%20Occurrence%20data%20Defn%20=%20Axiom%20%7c%20Function%20%7b%20funClauses%20::%20%5bClause%5d%20,%20funCompiled%20::%20CompiledClauses%20,%20funInv%20::%20FunctionInverse%20%7b-%20MOVED%20to%20Definition%20,%20funPolarity%20::%20%5bPolarity%5d%20,%20funArgOccurrences%20::%20%5bOccurrence%5d%20-%7d%20,%20funMutual%20::%20%5bQName%5d%20--%20%5e%20Mutually%20recursive%20functions,%20@data@s%20and%20@record@s.%20,%20funAbstr%20::%20IsAbstract%20,%20funDelayed%20::%20Delayed%20--%20%5e%20Are%20the%20clauses%20of%20this%20definition%20delayed?%20,%20funProjection%20::%20Maybe%20(QName,%20Int)%20--%20%5e%20Is%20it%20a%20record%20projection?%20--%20If%20yes,%20then%20return%20the%20name%20of%20the%20record%20type%20and%20index%20of%20--%20the%20record%20argument.%20Start%20counting%20with%201,%20because%200%20means%20that%20--%20it%20is%20already%20applied%20to%20the%20record.%20(Can%20happen%20in%20module%20--%20instantiation.)%20This%20information%20is%20used%20in%20the%20termination%20--%20checker.%20,%20funStatic%20::%20Bool%20--%20%5e%20Should%20calls%20to%20this%20function%20be%20normalised%20at%20compile-time?%20,%20funCopy%20::%20Bool%20--%20%5e%20Has%20this%20function%20been%20created%20by%20a%20module%20--%20instantiation?%20,%20funTerminates%20::%20Maybe%20Bool%20--%20%5e%20Has%20this%20function%20been%20termination%20checked?%20Did%20it%20pass?%20%7d%20%7c%20Datatype%20%7b%20dataPars%20::%20Nat%20--%20nof%20parameters%20,%20dataIxs%20::%20Nat%20--%20nof%20indices%20,%20dataInduction%20::%20Induction%20--%20data%20or%20codata?%20,%20dataClause%20::%20(Maybe%20Clause)%20--%20this%20might%20be%20in%20an%20instantiated%20module%20,%20dataCons%20::%20%5bQName%5d%20--%20constructor%20names%20,%20dataSort%20::%20Sort%20%7b-%20MOVED%20,%20dataPolarity%20::%20%5bPolarity%5d%20,%20dataArgOccurrences%20::%20%5bOccurrence%5d%20-%7d%20,%20dataMutual%20::%20%5bQName%5d%20--%20%5e%20Mutually%20recursive%20functions,%20@data@s%20and%20@record@s.%20,%20dataAbstr%20::%20IsAbstract%20%7d%20%7c%20Record%20%7b%20recPars%20::%20Nat%20--%20%5e%20Number%20of%20parameters.%20,%20recClause%20::%20Maybe%20Clause%20,%20recCon%20::%20QName%20--%20%5e%20Constructor%20name.%20,%20recNamedCon%20::%20Bool%20,%20recConType%20::%20Type%20--%20%5e%20The%20record%20constructor's%20type.%20,%20recFields%20::%20%5bArg%20A.QName%5d%20,%20recTel%20::%20Telescope%20--%20%5e%20The%20record%20field%20telescope%20%7b-%20MOVED%20,%20recPolarity%20::%20%5bPolarity%5d%20,%20recArgOccurrences%20::%20%5bOccurrence%5d%20-%7d%20,%20recMutual%20::%20%5bQName%5d%20--%20%5e%20Mutually%20recursive%20functions,%20@data@s%20and%20@record@s.%20,%20recEtaEquality%20::%20Bool%20--%20%5e%20Eta-expand%20at%20this%20record%20type.%20@False@%20for%20unguarded%20recursive%20records.%20,%20recInduction%20::%20Induction%20--%20%5e%20'Inductive'%20or%20'Coinductive'?%20Matters%20only%20for%20recursive%20records.%20,%20recRecursive%20::%20Bool%20--%20%5e%20Recursive%20record.%20Implies%20@recEtaEquality%20=%20False@.%20Projections%20are%20not%20size-preserving.%20,%20recAbstr%20::%20IsAbstract%20%7d%20%7c%20Constructor%20%7b%20conPars%20::%20Nat%20--%20nof%20parameters%20,%20conSrcCon%20::%20QName%20--%20original%20constructor%20(this%20might%20be%20in%20a%20module%20instance)%20,%20conData%20::%20QName%20--%20name%20of%20datatype%20or%20record%20type%20,%20conAbstr%20::%20IsAbstract%20,%20conInd%20::%20Induction%20--%20%5e%20Inductive%20or%20coinductive?%20%7d%20%7c%20Primitive%20%7b%20primAbstr%20::%20IsAbstract%20,%20primName%20::%20String%20,%20primClauses%20::%20Maybe%20%5bClause%5d%20--%20%5e%20'Nothing'%20for%20primitive%20functions,%20@'Just'%20--%20something@%20for%20builtin%20functions.%20,%20primCompiled%20::%20Maybe%20CompiledClauses%20--%20%5e%20'Nothing'%20for%20primitive%20functions,%20@'Just'%20--%20something@%20for%20builtin%20functions.%20%7d%20--%20%5e%20Primitive%20or%20builtin%20functions.%20deriving%20(Typeable,%20Show)%20defIsRecord%20::%20Defn%20-%3e%20Bool%20defIsRecord%20Record%7b%7d%20=%20True%20defIsRecord%20_%20=%20False%20defIsDataOrRecord%20::%20Defn%20-%3e%20Bool%20defIsDataOrRecord%20Record%7b%7d%20=%20True%20defIsDataOrRecord%20Datatype%7b%7d%20=%20True%20defIsDataOrRecord%20_%20=%20False%20newtype%20Fields%20=%20Fields%20%5b(C.Name,%20Type)%5d%20deriving%20(Typeable)%20data%20Reduced%20no%20yes%20=%20NoReduction%20no%20%7c%20YesReduction%20yes%20deriving%20(Typeable,%20Functor)%20data%20IsReduced%20=%20NotReduced%20%7c%20Reduced%20(Blocked%20())%20data%20MaybeReduced%20a%20=%20MaybeRed%20%7b%20isReduced%20::%20IsReduced%20,%20ignoreReduced%20::%20a%20%7d%20deriving%20(Functor)%20type%20MaybeReducedArgs%20=%20%5bMaybeReduced%20(Arg%20Term)%5d%20notReduced%20::%20a%20-%3e%20MaybeReduced%20a%20notReduced%20x%20=%20MaybeRed%20NotReduced%20x%20reduced%20::%20Blocked%20(Arg%20Term)%20-%3e%20MaybeReduced%20(Arg%20Term)%20reduced%20b%20=%20case%20fmap%20ignoreSharing%20%3c$%3e%20b%20of%20NotBlocked%20(Arg%20_%20_%20(MetaV%20x%20_))%20-%3e%20MaybeRed%20(Reduced%20$%20Blocked%20x%20())%20v%20_%20-%3e%20MaybeRed%20(Reduced%20$%20()%20%3c$%20b)%20v"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>NFData</span> <span class='hs-conid'>Occurrence</span>
<a name="line-576"></a>
<a name="line-577"></a><a name="Defn"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Defn</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Axiom</span>
<a name="line-578"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Function</span>
<a name="line-579"></a>            <span class='hs-layout'>{</span> <span class='hs-varid'>funClauses</span>        <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Clause</span><span class='hs-keyglyph'>]</span>
<a name="line-580"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funCompiled</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompiledClauses</span>
<a name="line-581"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funInv</span>            <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FunctionInverse</span>
<a name="line-582"></a><span class='hs-comment'>{- MOVED to Definition
<a name="line-583"></a>            , funPolarity       :: [Polarity]
<a name="line-584"></a>            , funArgOccurrences :: [Occurrence]
<a name="line-585"></a>-}</span>
<a name="line-586"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funMutual</span>         <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>QName</span><span class='hs-keyglyph'>]</span>
<a name="line-587"></a>              <span class='hs-comment'>-- ^ Mutually recursive functions, @data@s and @record@s.</span>
<a name="line-588"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funAbstr</span>          <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IsAbstract</span>
<a name="line-589"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funDelayed</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Delayed</span>
<a name="line-590"></a>              <span class='hs-comment'>-- ^ Are the clauses of this definition delayed?</span>
<a name="line-591"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funProjection</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>QName</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-592"></a>              <span class='hs-comment'>-- ^ Is it a record projection?</span>
<a name="line-593"></a>              <span class='hs-comment'>--   If yes, then return the name of the record type and index of</span>
<a name="line-594"></a>              <span class='hs-comment'>--   the record argument.  Start counting with 1, because 0 means that</span>
<a name="line-595"></a>              <span class='hs-comment'>--   it is already applied to the record. (Can happen in module</span>
<a name="line-596"></a>              <span class='hs-comment'>--   instantiation.) This information is used in the termination</span>
<a name="line-597"></a>              <span class='hs-comment'>--   checker.</span>
<a name="line-598"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funStatic</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-599"></a>              <span class='hs-comment'>-- ^ Should calls to this function be normalised at compile-time?</span>
<a name="line-600"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funCopy</span>           <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-601"></a>              <span class='hs-comment'>-- ^ Has this function been created by a module</span>
<a name="line-602"></a>                                   <span class='hs-comment'>-- instantiation?</span>
<a name="line-603"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>funTerminates</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Bool</span>
<a name="line-604"></a>              <span class='hs-comment'>-- ^ Has this function been termination checked?  Did it pass?</span>
<a name="line-605"></a>            <span class='hs-layout'>}</span>
<a name="line-606"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Datatype</span>
<a name="line-607"></a>            <span class='hs-layout'>{</span> <span class='hs-varid'>dataPars</span>           <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span>           <span class='hs-comment'>-- nof parameters</span>
<a name="line-608"></a>	    <span class='hs-layout'>,</span> <span class='hs-varid'>dataIxs</span>            <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span>           <span class='hs-comment'>-- nof indices</span>
<a name="line-609"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>dataInduction</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Induction</span>  <span class='hs-comment'>-- data or codata?</span>
<a name="line-610"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>dataClause</span>         <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Clause</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- this might be in an instantiated module</span>
<a name="line-611"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>dataCons</span>           <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>QName</span><span class='hs-keyglyph'>]</span>        <span class='hs-comment'>-- constructor names</span>
<a name="line-612"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>dataSort</span>           <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Sort</span>
<a name="line-613"></a><span class='hs-comment'>{- MOVED
<a name="line-614"></a>            , dataPolarity       :: [Polarity]
<a name="line-615"></a>            , dataArgOccurrences :: [Occurrence]
<a name="line-616"></a>-}</span>
<a name="line-617"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>dataMutual</span>         <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>QName</span><span class='hs-keyglyph'>]</span>        <span class='hs-comment'>-- ^ Mutually recursive functions, @data@s and @record@s.</span>
<a name="line-618"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>dataAbstr</span>          <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IsAbstract</span>
<a name="line-619"></a>            <span class='hs-layout'>}</span>
<a name="line-620"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Record</span>
<a name="line-621"></a>            <span class='hs-layout'>{</span> <span class='hs-varid'>recPars</span>           <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span>                  <span class='hs-comment'>-- ^ Number of parameters.</span>
<a name="line-622"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recClause</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Clause</span>
<a name="line-623"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recCon</span>            <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span>                <span class='hs-comment'>-- ^ Constructor name.</span>
<a name="line-624"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recNamedCon</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-625"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recConType</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span>                 <span class='hs-comment'>-- ^ The record constructor's type.</span>
<a name="line-626"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recFields</span>         <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span><span class='hs-keyglyph'>]</span>
<a name="line-627"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recTel</span>            <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Telescope</span>            <span class='hs-comment'>-- ^ The record field telescope</span>
<a name="line-628"></a><span class='hs-comment'>{- MOVED
<a name="line-629"></a>            , recPolarity       :: [Polarity]
<a name="line-630"></a>            , recArgOccurrences :: [Occurrence]
<a name="line-631"></a>-}</span>
<a name="line-632"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recMutual</span>         <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>QName</span><span class='hs-keyglyph'>]</span>              <span class='hs-comment'>-- ^ Mutually recursive functions, @data@s and @record@s.</span>
<a name="line-633"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recEtaEquality</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>                 <span class='hs-comment'>-- ^ Eta-expand at this record type.  @False@ for unguarded recursive records.</span>
<a name="line-634"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recInduction</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Induction</span>            <span class='hs-comment'>-- ^ 'Inductive' or 'Coinductive'?  Matters only for recursive records.</span>
<a name="line-635"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recRecursive</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>                 <span class='hs-comment'>-- ^ Recursive record.  Implies @recEtaEquality = False@.  Projections are not size-preserving.</span>
<a name="line-636"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>recAbstr</span>          <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IsAbstract</span>
<a name="line-637"></a>            <span class='hs-layout'>}</span>
<a name="line-638"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Constructor</span>
<a name="line-639"></a>            <span class='hs-layout'>{</span> <span class='hs-varid'>conPars</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span>         <span class='hs-comment'>-- nof parameters</span>
<a name="line-640"></a>	    <span class='hs-layout'>,</span> <span class='hs-varid'>conSrcCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span>       <span class='hs-comment'>-- original constructor (this might be in a module instance)</span>
<a name="line-641"></a>	    <span class='hs-layout'>,</span> <span class='hs-varid'>conData</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span>       <span class='hs-comment'>-- name of datatype or record type</span>
<a name="line-642"></a>	    <span class='hs-layout'>,</span> <span class='hs-varid'>conAbstr</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IsAbstract</span>
<a name="line-643"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>conInd</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Induction</span>   <span class='hs-comment'>-- ^ Inductive or coinductive?</span>
<a name="line-644"></a>            <span class='hs-layout'>}</span>
<a name="line-645"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Primitive</span>
<a name="line-646"></a>            <span class='hs-layout'>{</span> <span class='hs-varid'>primAbstr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IsAbstract</span>
<a name="line-647"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>primName</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>
<a name="line-648"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>primClauses</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Clause</span><span class='hs-keyglyph'>]</span>
<a name="line-649"></a>              <span class='hs-comment'>-- ^ 'Nothing' for primitive functions, @'Just'</span>
<a name="line-650"></a>              <span class='hs-comment'>-- something@ for builtin functions.</span>
<a name="line-651"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>primCompiled</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>CompiledClauses</span>
<a name="line-652"></a>              <span class='hs-comment'>-- ^ 'Nothing' for primitive functions, @'Just'</span>
<a name="line-653"></a>              <span class='hs-comment'>-- something@ for builtin functions.</span>
<a name="line-654"></a>            <span class='hs-layout'>}</span>
<a name="line-655"></a>            <span class='hs-comment'>-- ^ Primitive or builtin functions.</span>
<a name="line-656"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-657"></a>
<a name="line-658"></a><a name="defIsRecord"></a><span class='hs-definition'>defIsRecord</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Defn</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-659"></a><span class='hs-definition'>defIsRecord</span> <span class='hs-conid'>Record</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-660"></a><span class='hs-definition'>defIsRecord</span> <span class='hs-keyword'>_</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-661"></a>
<a name="line-662"></a><a name="defIsDataOrRecord"></a><span class='hs-definition'>defIsDataOrRecord</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Defn</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-663"></a><span class='hs-definition'>defIsDataOrRecord</span> <span class='hs-conid'>Record</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-664"></a><span class='hs-definition'>defIsDataOrRecord</span> <span class='hs-conid'>Datatype</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-665"></a><span class='hs-definition'>defIsDataOrRecord</span> <span class='hs-keyword'>_</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-666"></a>
<a name="line-667"></a><a name="Fields"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Fields</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fields</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-668"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-669"></a>
<a name="line-670"></a><a name="Reduced"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Reduced</span> <span class='hs-varid'>no</span> <span class='hs-varid'>yes</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoReduction</span> <span class='hs-varid'>no</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>YesReduction</span> <span class='hs-varid'>yes</span>
<a name="line-671"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>)</span>
<a name="line-672"></a>
<a name="line-673"></a><a name="IsReduced"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>IsReduced</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NotReduced</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Reduced</span> <span class='hs-layout'>(</span><span class='hs-conid'>Blocked</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-674"></a><a name="MaybeReduced"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>MaybeReduced</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MaybeRed</span>
<a name="line-675"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>isReduced</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IsReduced</span>
<a name="line-676"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>ignoreReduced</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span>
<a name="line-677"></a>  <span class='hs-layout'>}</span>
<a name="line-678"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Functor</span><span class='hs-layout'>)</span>
<a name="line-679"></a>
<a name="line-680"></a><a name="MaybeReducedArgs"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>MaybeReducedArgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>MaybeReduced</span> <span class='hs-layout'>(</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Term</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-681"></a>
<a name="line-682"></a><a name="notReduced"></a><span class='hs-definition'>notReduced</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MaybeReduced</span> <span class='hs-varid'>a</span>
<a name="line-683"></a><span class='hs-definition'>notReduced</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MaybeRed</span> <span class='hs-conid'>NotReduced</span> <span class='hs-varid'>x</span>
<a name="line-684"></a>
<a name="line-685"></a><a name="reduced"></a><span class='hs-definition'>reduced</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Blocked</span> <span class='hs-layout'>(</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Term</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MaybeReduced</span> <span class='hs-layout'>(</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Term</span><span class='hs-layout'>)</span>
<a name="line-686"></a><span class='hs-definition'>reduced</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>ignoreSharing</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>of</span>
<a name="line-687"></a>  <span class='hs-conid'>NotBlocked</span> <span class='hs-layout'>(</span><span class='hs-conid'>Arg</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>MetaV</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MaybeRed</span> <span class='hs-layout'>(</span><span class='hs-conid'>Reduced</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Blocked</span> <span class='hs-varid'>x</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-688"></a>  <span class='hs-keyword'>_</span>                                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MaybeRed</span> <span class='hs-layout'>(</span><span class='hs-conid'>Reduced</span> <span class='hs-varop'>$</span> <span class='hs-conid'>()</span> <span class='hs-varop'>&lt;$</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>      <span class='hs-varid'>v</span>
<a name="line-689"></a>  <span class='hs-keyword'>where</span>
<a name="line-690"></a>    <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ignoreBlocking</span> <span class='hs-varid'>b</span>
<a name="line-691"></a>
<a name="line-692"></a><a name="PrimFun"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PrimFun</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrimFun</span>
<a name="line-693"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>primFunName</span>		<span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span>
<a name="line-694"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>primFunArity</span>		<span class='hs-keyglyph'>::</span> <span class='hs-conid'>Arity</span>
<a name="line-695"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>primFunImplementation</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Term</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Reduced</span> <span class='hs-conid'>MaybeReducedArgs</span> <span class='hs-conid'>Term</span><span class='hs-layout'>)</span>
<a name="line-696"></a>	<span class='hs-layout'>}</span>
<a name="line-697"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-698"></a>
<a name="line-699"></a><a name="defClauses"></a><span class='hs-definition'>defClauses</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Definition</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Clause</span><span class='hs-keyglyph'>]</span>
<a name="line-700"></a><span class='hs-definition'>defClauses</span> <span class='hs-conid'>Defn</span><span class='hs-layout'>{</span><span class='hs-varid'>theDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Function</span><span class='hs-layout'>{</span><span class='hs-varid'>funClauses</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cs</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cs</span>
<a name="line-701"></a><span class='hs-definition'>defClauses</span> <span class='hs-conid'>Defn</span><span class='hs-layout'>{</span><span class='hs-varid'>theDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Primitive</span><span class='hs-layout'>{</span><span class='hs-varid'>primClauses</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>cs</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cs</span>
<a name="line-702"></a><span class='hs-definition'>defClauses</span> <span class='hs-conid'>Defn</span><span class='hs-layout'>{</span><span class='hs-varid'>theDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Datatype</span><span class='hs-layout'>{</span><span class='hs-varid'>dataClause</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>c</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c</span><span class='hs-keyglyph'>]</span>
<a name="line-703"></a><span class='hs-definition'>defClauses</span> <span class='hs-conid'>Defn</span><span class='hs-layout'>{</span><span class='hs-varid'>theDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Record</span><span class='hs-layout'>{</span><span class='hs-varid'>recClause</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>c</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>       <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c</span><span class='hs-keyglyph'>]</span>
<a name="line-704"></a><span class='hs-definition'>defClauses</span> <span class='hs-keyword'>_</span>                                               <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-705"></a>
<a name="line-706"></a><a name="defCompiled"></a><span class='hs-definition'>defCompiled</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Definition</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>CompiledClauses</span>
<a name="line-707"></a><span class='hs-definition'>defCompiled</span> <span class='hs-conid'>Defn</span><span class='hs-layout'>{</span><span class='hs-varid'>theDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Function</span><span class='hs-layout'>{</span><span class='hs-varid'>funCompiled</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cc</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>cc</span>
<a name="line-708"></a><span class='hs-definition'>defCompiled</span> <span class='hs-conid'>Defn</span><span class='hs-layout'>{</span><span class='hs-varid'>theDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Primitive</span><span class='hs-layout'>{</span><span class='hs-varid'>primCompiled</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mcc</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mcc</span>
<a name="line-709"></a><span class='hs-definition'>defCompiled</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-710"></a>
<a name="line-711"></a><a name="defJSDef"></a><span class='hs-definition'>defJSDef</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Definition</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>JSCode</span>
<a name="line-712"></a><span class='hs-definition'>defJSDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compiledJS</span> <span class='hs-varop'>.</span> <span class='hs-varid'>defCompiledRep</span>
<a name="line-713"></a>
<a name="line-714"></a><a name="defEpicDef"></a><span class='hs-definition'>defEpicDef</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Definition</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>EpicCode</span>
<a name="line-715"></a><span class='hs-definition'>defEpicDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compiledEpic</span> <span class='hs-varop'>.</span> <span class='hs-varid'>defCompiledRep</span>
<a name="line-716"></a>
<a name="line-717"></a><a name="defDelayed"></a><span class='hs-comment'>-- | Are the clauses of this definition delayed?</span>
<a name="line-718"></a><span class='hs-definition'>defDelayed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Definition</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Delayed</span>
<a name="line-719"></a><span class='hs-definition'>defDelayed</span> <span class='hs-conid'>Defn</span><span class='hs-layout'>{</span><span class='hs-varid'>theDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Function</span><span class='hs-layout'>{</span><span class='hs-varid'>funDelayed</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span>
<a name="line-720"></a><span class='hs-definition'>defDelayed</span> <span class='hs-keyword'>_</span>                                       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NotDelayed</span>
<a name="line-721"></a>
<a name="line-722"></a><a name="defCopy"></a><span class='hs-comment'>-- | Is the definition just a copy created by a module instantiation?</span>
<a name="line-723"></a><span class='hs-definition'>defCopy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Definition</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-724"></a><span class='hs-definition'>defCopy</span> <span class='hs-conid'>Defn</span><span class='hs-layout'>{</span><span class='hs-varid'>theDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Function</span><span class='hs-layout'>{</span><span class='hs-varid'>funCopy</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span>
<a name="line-725"></a><span class='hs-definition'>defCopy</span> <span class='hs-keyword'>_</span>                                    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-726"></a>
<a name="line-727"></a><a name="defAbstract"></a><span class='hs-definition'>defAbstract</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Definition</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IsAbstract</span>
<a name="line-728"></a><span class='hs-definition'>defAbstract</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>theDef</span> <span class='hs-varid'>d</span> <span class='hs-keyword'>of</span>
<a name="line-729"></a>    <span class='hs-conid'>Axiom</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ConcreteDef</span>
<a name="line-730"></a>    <span class='hs-conid'>Function</span><span class='hs-layout'>{</span><span class='hs-varid'>funAbstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span><span class='hs-layout'>}</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-731"></a>    <span class='hs-conid'>Datatype</span><span class='hs-layout'>{</span><span class='hs-varid'>dataAbstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span><span class='hs-layout'>}</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-732"></a>    <span class='hs-conid'>Record</span><span class='hs-layout'>{</span><span class='hs-varid'>recAbstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span><span class='hs-layout'>}</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-733"></a>    <span class='hs-conid'>Constructor</span><span class='hs-layout'>{</span><span class='hs-varid'>conAbstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-734"></a>    <span class='hs-conid'>Primitive</span><span class='hs-layout'>{</span><span class='hs-varid'>primAbstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span><span class='hs-layout'>}</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-735"></a>
<a name="line-736"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-737"></a><span class='hs-comment'>-- ** Injectivity</span>
<a name="line-738"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-739"></a>
<a name="line-740"></a><a name="FunctionInverse"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>FunctionInverse</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FunctionInverse'</span> <span class='hs-conid'>Clause</span>
<a name="line-741"></a>
<a name="line-742"></a><a name="FunctionInverse'"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>FunctionInverse'</span> <span class='hs-varid'>c</span>
<a name="line-743"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NotInjective</span>
<a name="line-744"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Inverse</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-conid'>TermHead</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-745"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>)</span>
<a name="line-746"></a>
<a name="line-747"></a><a name="TermHead"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TermHead</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SortHead</span>
<a name="line-748"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PiHead</span>
<a name="line-749"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ConHead</span> <span class='hs-conid'>QName</span>
<a name="line-750"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-751"></a>
<a name="line-752"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-753"></a><span class='hs-comment'>-- ** Mutual blocks</span>
<a name="line-754"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-755"></a>
<a name="line-756"></a><a name="MutualId"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>MutualId</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MutId</span> <span class='hs-conid'>Int32</span>
<a name="line-757"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Num</span><span class='hs-layout'>)</span>
<a name="line-758"></a>
<a name="line-759"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-760"></a><span class='hs-comment'>-- ** Statistics</span>
<a name="line-761"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-762"></a>
<a name="line-763"></a><a name="Statistics"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Statistics</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>String</span> <span class='hs-conid'>Integer</span>
<a name="line-764"></a>
<a name="line-765"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-766"></a><span class='hs-comment'>-- ** Trace</span>
<a name="line-767"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-768"></a>
<a name="line-769"></a><a name="Call"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Call</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CheckClause</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Clause</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Clause</span><span class='hs-layout'>)</span>
<a name="line-770"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>CheckPattern</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span> <span class='hs-conid'>Telescope</span> <span class='hs-conid'>Type</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-771"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckLetBinding</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>LetBinding</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-772"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>InferExpr</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Term</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-773"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckExpr</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span> <span class='hs-conid'>Type</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Term</span><span class='hs-layout'>)</span>
<a name="line-774"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckDotPattern</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span> <span class='hs-conid'>Term</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Constraints</span><span class='hs-layout'>)</span>
<a name="line-775"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckPatternShadowing</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Clause</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-776"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IsTypeCall</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span> <span class='hs-conid'>Sort</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-777"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IsType_</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-778"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>InferVar</span> <span class='hs-conid'>Name</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Term</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-779"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>InferDef</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>QName</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Term</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-780"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckArguments</span> <span class='hs-conid'>Range</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NamedArg</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>Type</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Args</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-781"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckDataDef</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>LamBinding</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Constructor</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-782"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckRecDef</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>LamBinding</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Constructor</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-783"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckConstructor</span> <span class='hs-conid'>QName</span> <span class='hs-conid'>Telescope</span> <span class='hs-conid'>Sort</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Constructor</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-784"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckFunDef</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Clause</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-785"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckPragma</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Pragma</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-786"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckPrimitive</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>Name</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-787"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckIsEmpty</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>Type</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-788"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckWithFunctionType</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-789"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CheckSectionApplication</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>ModuleName</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>ModuleApplication</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-790"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ScopeCheckExpr</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span><span class='hs-layout'>)</span>
<a name="line-791"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ScopeCheckDeclaration</span> <span class='hs-conid'>D</span><span class='hs-varop'>.</span><span class='hs-conid'>NiceDeclaration</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Declaration</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-792"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ScopeCheckLHS</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>LHS</span><span class='hs-layout'>)</span>
<a name="line-793"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>NoHighlighting</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-794"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>SetRange</span> <span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- ^ used by 'setCurrentRange'</span>
<a name="line-795"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-796"></a>
<a name="line-797"></a><a name="instance%20HasRange%20Call"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasRange</span> <span class='hs-conid'>Call</span> <span class='hs-keyword'>where</span>
<a name="line-798"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckClause</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>c</span>
<a name="line-799"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckPattern</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>p</span>
<a name="line-800"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>InferExpr</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>e</span>
<a name="line-801"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckExpr</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>e</span>
<a name="line-802"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckLetBinding</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>b</span>
<a name="line-803"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>IsTypeCall</span> <span class='hs-varid'>e</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>e</span>
<a name="line-804"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>IsType_</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>e</span>
<a name="line-805"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>InferVar</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>x</span>
<a name="line-806"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>InferDef</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>f</span>
<a name="line-807"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckArguments</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-808"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckDataDef</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>i</span>
<a name="line-809"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckRecDef</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>i</span>
<a name="line-810"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckConstructor</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>c</span>
<a name="line-811"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckFunDef</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>i</span>
<a name="line-812"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckPragma</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-813"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckPrimitive</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>i</span>
<a name="line-814"></a>    <span class='hs-varid'>getRange</span> <span class='hs-conid'>CheckWithFunctionType</span><span class='hs-layout'>{</span><span class='hs-layout'>}</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noRange</span>
<a name="line-815"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>ScopeCheckExpr</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>e</span>
<a name="line-816"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>ScopeCheckDeclaration</span> <span class='hs-varid'>d</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>d</span>
<a name="line-817"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>ScopeCheckLHS</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>p</span>
<a name="line-818"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckDotPattern</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>e</span>
<a name="line-819"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckPatternShadowing</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getRange</span> <span class='hs-varid'>c</span>
<a name="line-820"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>SetRange</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-821"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckSectionApplication</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-822"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>CheckIsEmpty</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-823"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>NoHighlighting</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noRange</span>
<a name="line-824"></a>
<a name="line-825"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-826"></a><span class='hs-comment'>-- ** Builtin things</span>
<a name="line-827"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-828"></a>
<a name="line-829"></a><a name="BuiltinDescriptor"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>BuiltinDescriptor</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BuiltinData</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-830"></a>                       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BuiltinDataCons</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-831"></a>                       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BuiltinPrim</span> <span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>Term</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-832"></a>                       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BuiltinPostulate</span> <span class='hs-conid'>Relevance</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-833"></a>                       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BuiltinUnknown</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Term</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-834"></a>
<a name="line-835"></a><a name="BuiltinInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>BuiltinInfo</span> <span class='hs-keyglyph'>=</span>
<a name="line-836"></a>   <span class='hs-conid'>BuiltinInfo</span> <span class='hs-layout'>{</span> <span class='hs-varid'>builtinName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>
<a name="line-837"></a>               <span class='hs-layout'>,</span> <span class='hs-varid'>builtinDesc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BuiltinDescriptor</span> <span class='hs-layout'>}</span>
<a name="line-838"></a>
<a name="line-839"></a><a name="BuiltinThings"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>BuiltinThings</span> <span class='hs-varid'>pf</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>Builtin</span> <span class='hs-varid'>pf</span><span class='hs-layout'>)</span>
<a name="line-840"></a>
<a name="line-841"></a><a name="Builtin"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Builtin</span> <span class='hs-varid'>pf</span>
<a name="line-842"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builtin</span> <span class='hs-conid'>Term</span>
<a name="line-843"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>Prim</span> <span class='hs-varid'>pf</span>
<a name="line-844"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>,</span> <span class='hs-conid'>Foldable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Traversable</span><span class='hs-layout'>)</span>
<a name="line-845"></a>
<a name="line-846"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-847"></a><span class='hs-comment'>-- * Highlighting levels</span>
<a name="line-848"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-849"></a>
<a name="line-850"></a><span class='hs-comment'>-- | How much highlighting should be sent to the user interface?</span>
<a name="line-851"></a>
<a name="line-852"></a><a name="HighlightingLevel"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HighlightingLevel</span>
<a name="line-853"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>None</span>
<a name="line-854"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NonInteractive</span>
<a name="line-855"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Interactive</span>
<a name="line-856"></a>    <span class='hs-comment'>-- ^ This includes both non-interactive highlighting and</span>
<a name="line-857"></a>    <span class='hs-comment'>-- interactive highlighting of the expression that is currently</span>
<a name="line-858"></a>    <span class='hs-comment'>-- being type-checked.</span>
<a name="line-859"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>)</span>
<a name="line-860"></a>
<a name="line-861"></a><span class='hs-comment'>-- | How should highlighting be sent to the user interface?</span>
<a name="line-862"></a>
<a name="line-863"></a><a name="HighlightingMethod"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HighlightingMethod</span>
<a name="line-864"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Direct</span>
<a name="line-865"></a>    <span class='hs-comment'>-- ^ Via stdout.</span>
<a name="line-866"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Indirect</span>
<a name="line-867"></a>    <span class='hs-comment'>-- ^ Both via files and via stdout.</span>
<a name="line-868"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>)</span>
<a name="line-869"></a>
<a name="line-870"></a><span class='hs-comment'>-- | @ifTopLevelAndHighlightingLevelIs l m@ runs @m@ when we're</span>
<a name="line-871"></a><span class='hs-comment'>-- type-checking the top-level module and the highlighting level is</span>
<a name="line-872"></a><span class='hs-comment'>-- /at least/ @l@.</span>
<a name="line-873"></a>
<a name="line-874"></a><a name="ifTopLevelAndHighlightingLevelIs"></a><span class='hs-definition'>ifTopLevelAndHighlightingLevelIs</span> <span class='hs-keyglyph'>::</span>
<a name="line-875"></a>  <span class='hs-conid'>MonadTCM</span> <span class='hs-varid'>tcm</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HighlightingLevel</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tcm</span> <span class='hs-conid'>()</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tcm</span> <span class='hs-conid'>()</span>
<a name="line-876"></a><span class='hs-definition'>ifTopLevelAndHighlightingLevelIs</span> <span class='hs-varid'>l</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-877"></a>  <span class='hs-varid'>e</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ask</span>
<a name="line-878"></a>  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>envModuleNestingLevel</span> <span class='hs-varid'>e</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-varop'>&amp;&amp;</span>
<a name="line-879"></a>        <span class='hs-varid'>envHighlightingLevel</span> <span class='hs-varid'>e</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-880"></a>       <span class='hs-varid'>m</span>
<a name="line-881"></a>
<a name="line-882"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-883"></a><span class='hs-comment'>-- * Type checking environment</span>
<a name="line-884"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-885"></a>
<a name="line-886"></a><a name="TCEnv"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TCEnv</span> <span class='hs-keyglyph'>=</span>
<a name="line-887"></a>    <span class='hs-conid'>TCEnv</span> <span class='hs-layout'>{</span> <span class='hs-varid'>envContext</span>             <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Context</span>
<a name="line-888"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>envLetBindings</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LetBindings</span>
<a name="line-889"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>envCurrentModule</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModuleName</span>
<a name="line-890"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>envCurrentPath</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AbsolutePath</span>
<a name="line-891"></a>            <span class='hs-comment'>-- ^ The path to the file that is currently being</span>
<a name="line-892"></a>            <span class='hs-comment'>-- type-checked.</span>
<a name="line-893"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envAnonymousModules</span>    <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span> <span class='hs-conid'>Nat</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ anonymous modules and their number of free variables</span>
<a name="line-894"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>envImportPath</span>          <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ to detect import cycles</span>
<a name="line-895"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>envMutualBlock</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>MutualId</span> <span class='hs-comment'>-- ^ the current (if any) mutual block</span>
<a name="line-896"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envSolvingConstraints</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-897"></a>                <span class='hs-comment'>-- ^ Are we currently in the process of solving active constraints?</span>
<a name="line-898"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envAssignMetas</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-899"></a>            <span class='hs-comment'>-- ^ Are we allowed to assign metas?</span>
<a name="line-900"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envActiveProblems</span>      <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ProblemId</span><span class='hs-keyglyph'>]</span>
<a name="line-901"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>envAbstractMode</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AbstractMode</span>
<a name="line-902"></a>		<span class='hs-comment'>-- ^ When checking the typesignature of a public definition</span>
<a name="line-903"></a>		<span class='hs-comment'>--   or the body of a non-abstract definition this is true.</span>
<a name="line-904"></a>		<span class='hs-comment'>--   To prevent information about abstract things leaking</span>
<a name="line-905"></a>		<span class='hs-comment'>--   outside the module.</span>
<a name="line-906"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envRelevance</span>           <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Relevance</span>
<a name="line-907"></a>                <span class='hs-comment'>-- ^ Are we checking an irrelevant argument? (=@Irrelevant@)</span>
<a name="line-908"></a>                <span class='hs-comment'>-- Then top-level irrelevant declarations are enabled.</span>
<a name="line-909"></a>                <span class='hs-comment'>-- Other value: @Relevant@, then only relevant decls. are avail.</span>
<a name="line-910"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envDisplayFormsEnabled</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-911"></a>                <span class='hs-comment'>-- ^ Sometimes we want to disable display forms.</span>
<a name="line-912"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envReifyInteractionPoints</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-913"></a>                <span class='hs-comment'>-- ^ should we try to recover interaction points when reifying?</span>
<a name="line-914"></a>                <span class='hs-comment'>--   disabled when generating types for with functions</span>
<a name="line-915"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envEtaContractImplicit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-916"></a>                <span class='hs-comment'>-- ^ it's safe to eta contract implicit lambdas as long as we're</span>
<a name="line-917"></a>                <span class='hs-comment'>--   not going to reify and retypecheck (like when doing with</span>
<a name="line-918"></a>                <span class='hs-comment'>--   abstraction)</span>
<a name="line-919"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Range</span>
<a name="line-920"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envHighlightingRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Range</span>
<a name="line-921"></a>                <span class='hs-comment'>-- ^ Interactive highlighting uses this range rather</span>
<a name="line-922"></a>                <span class='hs-comment'>--   than 'envRange'.</span>
<a name="line-923"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envCall</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Closure</span> <span class='hs-conid'>Call</span><span class='hs-layout'>)</span>
<a name="line-924"></a>                <span class='hs-comment'>-- ^ what we're doing at the moment</span>
<a name="line-925"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envEmacs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-926"></a>                <span class='hs-comment'>-- ^ True when called from the Emacs mode.</span>
<a name="line-927"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envHighlightingLevel</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HighlightingLevel</span>
<a name="line-928"></a>                <span class='hs-comment'>-- ^ Set to 'None' when imported modules are</span>
<a name="line-929"></a>                <span class='hs-comment'>--   type-checked.</span>
<a name="line-930"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envHighlightingMethod</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HighlightingMethod</span>
<a name="line-931"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envModuleNestingLevel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span>
<a name="line-932"></a>                <span class='hs-comment'>-- ^ This number indicates how far away from the</span>
<a name="line-933"></a>                <span class='hs-comment'>--   top-level module Agda has come when chasing</span>
<a name="line-934"></a>                <span class='hs-comment'>--   modules. The level of a given module is not</span>
<a name="line-935"></a>                <span class='hs-comment'>--   necessarily the same as the length, in the module</span>
<a name="line-936"></a>                <span class='hs-comment'>--   dependency graph, of the shortest path from the</span>
<a name="line-937"></a>                <span class='hs-comment'>--   top-level module; it depends on in which order</span>
<a name="line-938"></a>                <span class='hs-comment'>--   Agda chooses to chase dependencies.</span>
<a name="line-939"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>envAllowDestructiveUpdate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-940"></a>                <span class='hs-comment'>-- ^ When True, allows destructively shared updating terms</span>
<a name="line-941"></a>                <span class='hs-comment'>--   during evaluation or unification. This is disabled when</span>
<a name="line-942"></a>                <span class='hs-comment'>--   doing speculative checking, like solve instance metas, or</span>
<a name="line-943"></a>                <span class='hs-comment'>--   when updating might break abstraction, as is the case when</span>
<a name="line-944"></a>                <span class='hs-comment'>--   checking abstract definitions.</span>
<a name="line-945"></a>	  <span class='hs-layout'>}</span>
<a name="line-946"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-947"></a>
<a name="line-948"></a><a name="initEnv"></a><span class='hs-definition'>initEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCEnv</span>
<a name="line-949"></a><span class='hs-definition'>initEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCEnv</span> <span class='hs-layout'>{</span> <span class='hs-varid'>envContext</span>	         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-950"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>envLetBindings</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-951"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>envCurrentModule</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noModuleName</span>
<a name="line-952"></a>	        <span class='hs-layout'>,</span> <span class='hs-varid'>envCurrentPath</span>         <span class='hs-keyglyph'>=</span> <span class='hs-sel'>__IMPOSSIBLE__</span>
<a name="line-953"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envAnonymousModules</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-954"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>envImportPath</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-955"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>envMutualBlock</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-956"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envSolvingConstraints</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-957"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envActiveProblems</span>      <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>]</span>
<a name="line-958"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envAssignMetas</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-959"></a>		<span class='hs-layout'>,</span> <span class='hs-varid'>envAbstractMode</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AbstractMode</span>
<a name="line-960"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envRelevance</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Relevant</span>
<a name="line-961"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envDisplayFormsEnabled</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-962"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envReifyInteractionPoints</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-963"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envEtaContractImplicit</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-964"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envRange</span>                  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noRange</span>
<a name="line-965"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envHighlightingRange</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noRange</span>
<a name="line-966"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envCall</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-967"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envEmacs</span>                  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-968"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envHighlightingLevel</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>None</span>
<a name="line-969"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envHighlightingMethod</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Indirect</span>
<a name="line-970"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envModuleNestingLevel</span>     <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span>
<a name="line-971"></a>                <span class='hs-layout'>,</span> <span class='hs-varid'>envAllowDestructiveUpdate</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-972"></a>		<span class='hs-layout'>}</span>
<a name="line-973"></a>
<a name="line-974"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-975"></a><span class='hs-comment'>-- ** Context</span>
<a name="line-976"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-977"></a>
<a name="line-978"></a><a name="Context"></a><span class='hs-comment'>-- | The @Context@ is a stack of 'ContextEntry's.</span>
<a name="line-979"></a><a name="Context"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Context</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ContextEntry</span><span class='hs-keyglyph'>]</span>
<a name="line-980"></a><a name="ContextEntry"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ContextEntry</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ctx</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ctxId</span>	   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CtxId</span>
<a name="line-981"></a>			<span class='hs-layout'>,</span> <span class='hs-varid'>ctxEntry</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Dom</span> <span class='hs-layout'>(</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-982"></a>			<span class='hs-layout'>}</span>
<a name="line-983"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-984"></a>
<a name="line-985"></a><a name="CtxId"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>CtxId</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CtxId</span> <span class='hs-conid'>Nat</span>
<a name="line-986"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Enum</span><span class='hs-layout'>,</span> <span class='hs-conid'>Real</span><span class='hs-layout'>,</span> <span class='hs-conid'>Integral</span><span class='hs-layout'>,</span> <span class='hs-conid'>Num</span><span class='hs-layout'>)</span>
<a name="line-987"></a>
<a name="line-988"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-989"></a><span class='hs-comment'>-- ** Let bindings</span>
<a name="line-990"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-991"></a>
<a name="line-992"></a><a name="LetBindings"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>LetBindings</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span> <span class='hs-conid'>Name</span> <span class='hs-layout'>(</span><span class='hs-conid'>Open</span> <span class='hs-layout'>(</span><span class='hs-conid'>Term</span><span class='hs-layout'>,</span> <span class='hs-conid'>Dom</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-993"></a>
<a name="line-994"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-995"></a><span class='hs-comment'>-- ** Abstract mode</span>
<a name="line-996"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-997"></a>
<a name="line-998"></a><a name="AbstractMode"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>AbstractMode</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AbstractMode</span>       <span class='hs-comment'>-- ^ abstract things in the current module can be accessed</span>
<a name="line-999"></a>		  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ConcreteMode</span>       <span class='hs-comment'>-- ^ no abstract things can be accessed</span>
<a name="line-1000"></a>		  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IgnoreAbstractMode</span> <span class='hs-comment'>-- ^ all abstract things can be accessed</span>
<a name="line-1001"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-1002"></a>
<a name="line-1003"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-1004"></a><span class='hs-comment'>-- ** Insertion of implicit arguments</span>
<a name="line-1005"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-1006"></a>
<a name="line-1007"></a><a name="ExpandHidden"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ExpandHidden</span>
<a name="line-1008"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExpandLast</span>      <span class='hs-comment'>-- ^ Add implicit arguments in the end until type is no longer hidden 'Pi'.</span>
<a name="line-1009"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DontExpandLast</span>  <span class='hs-comment'>-- ^ Do not append implicit arguments.</span>
<a name="line-1010"></a>
<a name="line-1011"></a><a name="ExpandInstances"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ExpandInstances</span>
<a name="line-1012"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExpandInstanceArguments</span>
<a name="line-1013"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DontExpandInstanceArguments</span>
<a name="line-1014"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>)</span>
<a name="line-1015"></a>
<a name="line-1016"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-1017"></a><span class='hs-comment'>-- * Type checking errors</span>
<a name="line-1018"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-1019"></a>
<a name="line-1020"></a><a name="Occ"></a><span class='hs-comment'>-- Occurence of a name in a datatype definition</span>
<a name="line-1021"></a><a name="Occ"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OccCon</span> <span class='hs-layout'>{</span> <span class='hs-varid'>occDatatype</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span>
<a name="line-1022"></a>	          <span class='hs-layout'>,</span> <span class='hs-varid'>occConstructor</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span>
<a name="line-1023"></a>	          <span class='hs-layout'>,</span> <span class='hs-varid'>occPosition</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccPos</span>
<a name="line-1024"></a>	          <span class='hs-layout'>}</span>
<a name="line-1025"></a>         <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OccClause</span> <span class='hs-layout'>{</span> <span class='hs-varid'>occFunction</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>QName</span>
<a name="line-1026"></a>                     <span class='hs-layout'>,</span> <span class='hs-varid'>occClause</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-1027"></a>                     <span class='hs-layout'>,</span> <span class='hs-varid'>occPosition</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccPos</span>
<a name="line-1028"></a>                     <span class='hs-layout'>}</span>
<a name="line-1029"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-1030"></a>
<a name="line-1031"></a><a name="OccPos"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>OccPos</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NonPositively</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ArgumentTo</span> <span class='hs-conid'>Nat</span> <span class='hs-conid'>QName</span>
<a name="line-1032"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-1033"></a>
<a name="line-1034"></a><span class='hs-comment'>-- | Information about a call.</span>
<a name="line-1035"></a>
<a name="line-1036"></a><a name="CallInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CallInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CallInfo</span>
<a name="line-1037"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>callInfoRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Range</span>
<a name="line-1038"></a>    <span class='hs-comment'>-- ^ Range of the head identifier.</span>
<a name="line-1039"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>callInfoCall</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>
<a name="line-1040"></a>    <span class='hs-comment'>-- ^ Formatted representation of the call.</span>
<a name="line-1041"></a>    <span class='hs-comment'>--</span>
<a name="line-1042"></a>    <span class='hs-comment'>-- ('Doc' would perhaps be better here, but 'Doc' doesn't come</span>
<a name="line-1043"></a>    <span class='hs-comment'>-- with an 'Ord' instance.)</span>
<a name="line-1044"></a>  <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-1045"></a>
<a name="line-1046"></a><span class='hs-comment'>-- | Information about a mutual block which did not pass the</span>
<a name="line-1047"></a><span class='hs-comment'>-- termination checker.</span>
<a name="line-1048"></a>
<a name="line-1049"></a><a name="TerminationError"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TerminationError</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TerminationError</span>
<a name="line-1050"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>termErrFunctions</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>QName</span><span class='hs-keyglyph'>]</span>
<a name="line-1051"></a>    <span class='hs-comment'>-- ^ The functions which failed to check. (May not include</span>
<a name="line-1052"></a>    <span class='hs-comment'>-- automatically generated functions.)</span>
<a name="line-1053"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>termErrCalls</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CallInfo</span><span class='hs-keyglyph'>]</span>
<a name="line-1054"></a>    <span class='hs-comment'>-- ^ The problematic call sites.</span>
<a name="line-1055"></a>  <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>)</span>
<a name="line-1056"></a>
<a name="line-1057"></a><span class='hs-comment'>{-
<a name="line-1058"></a>-- | We consider two 'TerminationError's equal if they report the same
<a name="line-1059"></a>--   invalid calls.
<a name="line-1060"></a>instance Eq TerminationError where
<a name="line-1061"></a>  (==) = (==) `on` termErrCalls
<a name="line-1062"></a>-}</span>
<a name="line-1063"></a>
<a name="line-1064"></a><a name="TypeError"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TypeError</span>
<a name="line-1065"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>InternalError</span> <span class='hs-conid'>String</span>
<a name="line-1066"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotImplemented</span> <span class='hs-conid'>String</span>
<a name="line-1067"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotSupported</span> <span class='hs-conid'>String</span>
<a name="line-1068"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CompilationError</span> <span class='hs-conid'>String</span>
<a name="line-1069"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>TerminationCheckFailed</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TerminationError</span><span class='hs-keyglyph'>]</span>
<a name="line-1070"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>PropMustBeSingleton</span>
<a name="line-1071"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>DataMustEndInSort</span> <span class='hs-conid'>Term</span>
<a name="line-1072"></a><span class='hs-comment'>{- UNUSED
<a name="line-1073"></a>        | DataTooManyParameters
<a name="line-1074"></a>            -- ^ In @data D xs where@ the number of parameters @xs@ does not fit the
<a name="line-1075"></a>            --   the parameters given in the forward declaraion @data D Gamma : T@.
<a name="line-1076"></a>-}</span>
<a name="line-1077"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShouldEndInApplicationOfTheDatatype</span> <span class='hs-conid'>Type</span>
<a name="line-1078"></a>	    <span class='hs-comment'>-- ^ The target of a constructor isn't an application of its</span>
<a name="line-1079"></a>	    <span class='hs-comment'>-- datatype. The 'Type' records what it does target.</span>
<a name="line-1080"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShouldBeAppliedToTheDatatypeParameters</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Term</span>
<a name="line-1081"></a>	    <span class='hs-comment'>-- ^ The target of a constructor isn't its datatype applied to</span>
<a name="line-1082"></a>	    <span class='hs-comment'>--	 something that isn't the parameters. First term is the correct</span>
<a name="line-1083"></a>	    <span class='hs-comment'>--	 target and the second term is the actual target.</span>
<a name="line-1084"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShouldBeApplicationOf</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>QName</span>
<a name="line-1085"></a>	    <span class='hs-comment'>-- ^ Expected a type to be an application of a particular datatype.</span>
<a name="line-1086"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ConstructorPatternInWrongDatatype</span> <span class='hs-conid'>QName</span> <span class='hs-conid'>QName</span> <span class='hs-comment'>-- ^ constructor, datatype</span>
<a name="line-1087"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IndicesNotConstructorApplications</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Term</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ Indices.</span>
<a name="line-1088"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IndexVariablesNotDistinct</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Nat</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Term</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ Variables, indices.</span>
<a name="line-1089"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IndicesFreeInParameters</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Nat</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Term</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Term</span><span class='hs-keyglyph'>]</span>
<a name="line-1090"></a>          <span class='hs-comment'>-- ^ Indices (variables), index expressions (with</span>
<a name="line-1091"></a>          <span class='hs-comment'>-- constructors applied to reconstructed parameters),</span>
<a name="line-1092"></a>          <span class='hs-comment'>-- parameters.</span>
<a name="line-1093"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DoesNotConstructAnElementOf</span> <span class='hs-conid'>QName</span> <span class='hs-conid'>Term</span> <span class='hs-comment'>-- ^ constructor, type</span>
<a name="line-1094"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>DifferentArities</span>
<a name="line-1095"></a>	    <span class='hs-comment'>-- ^ Varying number of arguments for a function.</span>
<a name="line-1096"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>WrongHidingInLHS</span> <span class='hs-conid'>Type</span>
<a name="line-1097"></a>	    <span class='hs-comment'>-- ^ The left hand side of a function definition has a hidden argument</span>
<a name="line-1098"></a>	    <span class='hs-comment'>--	 where a non-hidden was expected.</span>
<a name="line-1099"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>WrongHidingInLambda</span> <span class='hs-conid'>Type</span>
<a name="line-1100"></a>	    <span class='hs-comment'>-- ^ Expected a non-hidden function and found a hidden lambda.</span>
<a name="line-1101"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>WrongHidingInApplication</span> <span class='hs-conid'>Type</span>
<a name="line-1102"></a>	    <span class='hs-comment'>-- ^ A function is applied to a hidden argument where a non-hidden was expected.</span>
<a name="line-1103"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>WrongIrrelevanceInLambda</span> <span class='hs-conid'>Type</span>
<a name="line-1104"></a>	    <span class='hs-comment'>-- ^ Expected a relevant function and found an irrelevant lambda.</span>
<a name="line-1105"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotInductive</span> <span class='hs-conid'>Term</span>
<a name="line-1106"></a>          <span class='hs-comment'>-- ^ The term does not correspond to an inductive data type.</span>
<a name="line-1107"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UninstantiatedDotPattern</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span>
<a name="line-1108"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>IlltypedPattern</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span> <span class='hs-conid'>Type</span>
<a name="line-1109"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>TooManyArgumentsInLHS</span> <span class='hs-conid'>Type</span>
<a name="line-1110"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>WrongNumberOfConstructorArguments</span> <span class='hs-conid'>QName</span> <span class='hs-conid'>Nat</span> <span class='hs-conid'>Nat</span>
<a name="line-1111"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShouldBeEmpty</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pattern</span><span class='hs-keyglyph'>]</span>
<a name="line-1112"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShouldBeASort</span> <span class='hs-conid'>Type</span>
<a name="line-1113"></a>	    <span class='hs-comment'>-- ^ The given type should have been a sort.</span>
<a name="line-1114"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShouldBePi</span> <span class='hs-conid'>Type</span>
<a name="line-1115"></a>	    <span class='hs-comment'>-- ^ The given type should have been a pi.</span>
<a name="line-1116"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShouldBeRecordType</span> <span class='hs-conid'>Type</span>
<a name="line-1117"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShouldBeRecordPattern</span> <span class='hs-conid'>Pattern</span>
<a name="line-1118"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotAProperTerm</span>
<a name="line-1119"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SetOmegaNotValidType</span>
<a name="line-1120"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SplitOnIrrelevant</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dom</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-1121"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DefinitionIsIrrelevant</span> <span class='hs-conid'>QName</span>
<a name="line-1122"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>VariableIsIrrelevant</span> <span class='hs-conid'>Name</span>
<a name="line-1123"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnequalLevel</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Term</span>
<a name="line-1124"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnequalTerms</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Type</span>
<a name="line-1125"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnequalTypes</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>Type</span>
<a name="line-1126"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnequalTelescopes</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Telescope</span> <span class='hs-conid'>Telescope</span>
<a name="line-1127"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnequalRelevance</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Term</span>
<a name="line-1128"></a>	    <span class='hs-comment'>-- ^ The two function types have different relevance.</span>
<a name="line-1129"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnequalHiding</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Term</span>
<a name="line-1130"></a>	    <span class='hs-comment'>-- ^ The two function types have different hiding.</span>
<a name="line-1131"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnequalSorts</span> <span class='hs-conid'>Sort</span> <span class='hs-conid'>Sort</span>
<a name="line-1132"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnequalBecauseOfUniverseConflict</span> <span class='hs-conid'>Comparison</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Term</span>
<a name="line-1133"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HeterogeneousEquality</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Type</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Type</span>
<a name="line-1134"></a>            <span class='hs-comment'>-- ^ We ended up with an equality constraint where the terms</span>
<a name="line-1135"></a>            <span class='hs-comment'>--   have different types.  This is not supported.</span>
<a name="line-1136"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotLeqSort</span> <span class='hs-conid'>Sort</span> <span class='hs-conid'>Sort</span>
<a name="line-1137"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>MetaCannotDependOn</span> <span class='hs-conid'>MetaId</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Nat</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>Nat</span>
<a name="line-1138"></a>	    <span class='hs-comment'>-- ^ The arguments are the meta variable, the parameters it can</span>
<a name="line-1139"></a>	    <span class='hs-comment'>--	 depend on and the paratemeter that it wants to depend on.</span>
<a name="line-1140"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>MetaOccursInItself</span> <span class='hs-conid'>MetaId</span>
<a name="line-1141"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>GenericError</span> <span class='hs-conid'>String</span>
<a name="line-1142"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>GenericDocError</span> <span class='hs-conid'>Doc</span>
<a name="line-1143"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BuiltinMustBeConstructor</span> <span class='hs-conid'>String</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span>
<a name="line-1144"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoSuchBuiltinName</span> <span class='hs-conid'>String</span>
<a name="line-1145"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>DuplicateBuiltinBinding</span> <span class='hs-conid'>String</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Term</span>
<a name="line-1146"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoBindingForBuiltin</span> <span class='hs-conid'>String</span>
<a name="line-1147"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoSuchPrimitiveFunction</span> <span class='hs-conid'>String</span>
<a name="line-1148"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ShadowedModule</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>ModuleName</span><span class='hs-keyglyph'>]</span>
<a name="line-1149"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>BuiltinInParameterisedModule</span> <span class='hs-conid'>String</span>
<a name="line-1150"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoRHSRequiresAbsurdPattern</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NamedArg</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span><span class='hs-keyglyph'>]</span>
<a name="line-1151"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>AbsurdPatternRequiresNoRHS</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NamedArg</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span><span class='hs-keyglyph'>]</span>
<a name="line-1152"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>TooFewFields</span> <span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-1153"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>TooManyFields</span> <span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-1154"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>DuplicateFields</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-1155"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>DuplicateConstructors</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-1156"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnexpectedWithPatterns</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span><span class='hs-keyglyph'>]</span>
<a name="line-1157"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>WithClausePatternMismatch</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span> <span class='hs-conid'>Pattern</span>
<a name="line-1158"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FieldOutsideRecord</span>
<a name="line-1159"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ModuleArityMismatch</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>ModuleName</span> <span class='hs-conid'>Telescope</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NamedArg</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span><span class='hs-keyglyph'>]</span>
<a name="line-1160"></a>    <span class='hs-comment'>-- Coverage errors</span>
<a name="line-1161"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>IncompletePatternMatching</span> <span class='hs-conid'>Term</span> <span class='hs-conid'>Args</span> <span class='hs-comment'>-- can only happen if coverage checking is switched off</span>
<a name="line-1162"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CoverageFailure</span> <span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Pattern</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-1163"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnreachableClauses</span> <span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Arg</span> <span class='hs-conid'>Pattern</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-1164"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CoverageCantSplitOn</span> <span class='hs-conid'>QName</span> <span class='hs-conid'>Telescope</span> <span class='hs-conid'>Args</span> <span class='hs-conid'>Args</span>
<a name="line-1165"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CoverageCantSplitIrrelevantType</span> <span class='hs-conid'>Type</span>
<a name="line-1166"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CoverageCantSplitType</span> <span class='hs-conid'>Type</span>
<a name="line-1167"></a>    <span class='hs-comment'>-- Positivity errors</span>
<a name="line-1168"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotStrictlyPositive</span> <span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Occ</span><span class='hs-keyglyph'>]</span>
<a name="line-1169"></a>    <span class='hs-comment'>-- Import errors</span>
<a name="line-1170"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>LocalVsImportedModuleClash</span> <span class='hs-conid'>ModuleName</span>
<a name="line-1171"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnsolvedMetas</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Range</span><span class='hs-keyglyph'>]</span>
<a name="line-1172"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnsolvedConstraints</span> <span class='hs-conid'>Constraints</span>
<a name="line-1173"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>CyclicModuleDependency</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span><span class='hs-keyglyph'>]</span>
<a name="line-1174"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>FileNotFound</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AbsolutePath</span><span class='hs-keyglyph'>]</span>
<a name="line-1175"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OverlappingProjects</span> <span class='hs-conid'>AbsolutePath</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span>
<a name="line-1176"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>AmbiguousTopLevelModuleName</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AbsolutePath</span><span class='hs-keyglyph'>]</span>
<a name="line-1177"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ModuleNameDoesntMatchFileName</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AbsolutePath</span><span class='hs-keyglyph'>]</span>
<a name="line-1178"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ClashingFileNamesFor</span> <span class='hs-conid'>ModuleName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AbsolutePath</span><span class='hs-keyglyph'>]</span>
<a name="line-1179"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ModuleDefinedInOtherFile</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>TopLevelModuleName</span> <span class='hs-conid'>AbsolutePath</span> <span class='hs-conid'>AbsolutePath</span>
<a name="line-1180"></a>          <span class='hs-comment'>-- ^ Module name, file from which it was loaded, file which</span>
<a name="line-1181"></a>          <span class='hs-comment'>-- the include path says contains the module.</span>
<a name="line-1182"></a>    <span class='hs-comment'>-- Scope errors</span>
<a name="line-1183"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>BothWithAndRHS</span>
<a name="line-1184"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotInScope</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span><span class='hs-keyglyph'>]</span>
<a name="line-1185"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoSuchModule</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span>
<a name="line-1186"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>AmbiguousName</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span><span class='hs-keyglyph'>]</span>
<a name="line-1187"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>AmbiguousModule</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>ModuleName</span><span class='hs-keyglyph'>]</span>
<a name="line-1188"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>UninstantiatedModule</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span>
<a name="line-1189"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ClashingDefinition</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span>
<a name="line-1190"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ClashingModule</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>ModuleName</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>ModuleName</span>
<a name="line-1191"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ClashingImport</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span>
<a name="line-1192"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ClashingModuleImport</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>ModuleName</span>
<a name="line-1193"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>PatternShadowsConstructor</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span>
<a name="line-1194"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>ModuleDoesntExport</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>ImportedName</span><span class='hs-keyglyph'>]</span>
<a name="line-1195"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DuplicateImports</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>ImportedName</span><span class='hs-keyglyph'>]</span>
<a name="line-1196"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>InvalidPattern</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span>
<a name="line-1197"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>RepeatedVariablesInPattern</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-1198"></a>    <span class='hs-comment'>-- Concrete to Abstract errors</span>
<a name="line-1199"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotAModuleExpr</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span>
<a name="line-1200"></a>	    <span class='hs-comment'>-- ^ The expr was used in the right hand side of an implicit module</span>
<a name="line-1201"></a>	    <span class='hs-comment'>--	 definition, but it wasn't of the form @m Delta@.</span>
<a name="line-1202"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotAnExpression</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span>
<a name="line-1203"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotAValidLetBinding</span> <span class='hs-conid'>D</span><span class='hs-varop'>.</span><span class='hs-conid'>NiceDeclaration</span>
<a name="line-1204"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NothingAppliedToHiddenArg</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span>
<a name="line-1205"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NothingAppliedToInstanceArg</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span>
<a name="line-1206"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnusedVariableInPatternSynonym</span>
<a name="line-1207"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PatternSynonymArityMismatch</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>QName</span>
<a name="line-1208"></a>    <span class='hs-comment'>-- Operator errors</span>
<a name="line-1209"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoParseForApplication</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span><span class='hs-keyglyph'>]</span>
<a name="line-1210"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>AmbiguousParseForApplication</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span><span class='hs-keyglyph'>]</span>
<a name="line-1211"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoParseForLHS</span> <span class='hs-conid'>LHSOrPatSyn</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span>
<a name="line-1212"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>AmbiguousParseForLHS</span> <span class='hs-conid'>LHSOrPatSyn</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Pattern</span><span class='hs-keyglyph'>]</span>
<a name="line-1213"></a><span class='hs-comment'>{- UNUSED
<a name="line-1214"></a>	| NoParseForPatternSynonym C.Pattern
<a name="line-1215"></a>	| AmbiguousParseForPatternSynonym C.Pattern [C.Pattern]
<a name="line-1216"></a>-}</span>
<a name="line-1217"></a>    <span class='hs-comment'>-- Usage errors</span>
<a name="line-1218"></a>    <span class='hs-comment'>-- Implicit From Scope errors</span>
<a name="line-1219"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IFSNoCandidateInScope</span> <span class='hs-conid'>Type</span>
<a name="line-1220"></a>    <span class='hs-comment'>-- Safe flag errors</span>
<a name="line-1221"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SafeFlagPostulate</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span>
<a name="line-1222"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SafeFlagPragma</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-1223"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SafeFlagNoTerminationCheck</span>
<a name="line-1224"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SafeFlagPrimTrustMe</span>
<a name="line-1225"></a>    <span class='hs-comment'>-- Language option errors</span>
<a name="line-1226"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NeedOptionCopatterns</span>
<a name="line-1227"></a>          <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-1228"></a>
<a name="line-1229"></a><a name="LHSOrPatSyn"></a><span class='hs-comment'>-- | Distinguish error message when parsing lhs or pattern synonym, resp.</span>
<a name="line-1230"></a><a name="LHSOrPatSyn"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>LHSOrPatSyn</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IsLHS</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IsPatSyn</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-1231"></a>
<a name="line-1232"></a><span class='hs-comment'>-- instance Show TypeError where</span>
<a name="line-1233"></a><span class='hs-comment'>--   show _ = "&lt;TypeError&gt;" -- TODO: more info?</span>
<a name="line-1234"></a>
<a name="line-1235"></a><a name="instance%20Error%20TypeError"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Error</span> <span class='hs-conid'>TypeError</span> <span class='hs-keyword'>where</span>
<a name="line-1236"></a>    <span class='hs-varid'>noMsg</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strMsg</span> <span class='hs-str'>""</span>
<a name="line-1237"></a>    <span class='hs-varid'>strMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GenericError</span>
<a name="line-1238"></a>
<a name="line-1239"></a><span class='hs-comment'>-- | Type-checking errors.</span>
<a name="line-1240"></a>
<a name="line-1241"></a><a name="TCErr"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TCErr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TypeError</span> <span class='hs-conid'>TCState</span> <span class='hs-layout'>(</span><span class='hs-conid'>Closure</span> <span class='hs-conid'>TypeError</span><span class='hs-layout'>)</span>
<a name="line-1242"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Exception</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>String</span>
<a name="line-1243"></a>           <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IOException</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>E</span><span class='hs-varop'>.</span><span class='hs-conid'>IOException</span>
<a name="line-1244"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PatternErr</span>  <span class='hs-conid'>TCState</span> <span class='hs-comment'>-- ^ for pattern violations</span>
<a name="line-1245"></a>	   <span class='hs-comment'>{- AbortAssign TCState -- ^ used to abort assignment to meta when there are instantiations -- UNUSED -}</span>
<a name="line-1246"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-1247"></a>
<a name="line-1248"></a><a name="instance%20Error%20TCErr"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Error</span> <span class='hs-conid'>TCErr</span> <span class='hs-keyword'>where</span>
<a name="line-1249"></a>    <span class='hs-varid'>noMsg</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strMsg</span> <span class='hs-str'>""</span>
<a name="line-1250"></a>    <span class='hs-varid'>strMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Exception</span> <span class='hs-varid'>noRange</span> <span class='hs-varop'>.</span> <span class='hs-varid'>strMsg</span>
<a name="line-1251"></a>
<a name="line-1252"></a><a name="instance%20Show%20TCErr"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>TCErr</span> <span class='hs-keyword'>where</span>
<a name="line-1253"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>TypeError</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>envRange</span> <span class='hs-varop'>$</span> <span class='hs-varid'>clEnv</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-str'>": "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>clValue</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-1254"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>Exception</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varid'>r</span> <span class='hs-varop'>++</span> <span class='hs-str'>": "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>s</span>
<a name="line-1255"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>IOException</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varid'>r</span> <span class='hs-varop'>++</span> <span class='hs-str'>": "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>e</span>
<a name="line-1256"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatternErr</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-str'>"Pattern violation (you shouldn't see this)"</span>
<a name="line-1257"></a>    <span class='hs-comment'>{- show (AbortAssign _) = "Abort assignment (you shouldn't see this)" -- UNUSED -}</span>
<a name="line-1258"></a>
<a name="line-1259"></a><a name="instance%20HasRange%20TCErr"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasRange</span> <span class='hs-conid'>TCErr</span> <span class='hs-keyword'>where</span>
<a name="line-1260"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>TypeError</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>cl</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>envRange</span> <span class='hs-varop'>$</span> <span class='hs-varid'>clEnv</span> <span class='hs-varid'>cl</span>
<a name="line-1261"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>Exception</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-1262"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>IOException</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-1263"></a>    <span class='hs-varid'>getRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatternErr</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noRange</span>
<a name="line-1264"></a>    <span class='hs-comment'>{- getRange (AbortAssign s)   = noRange -- UNUSED -}</span>
<a name="line-1265"></a>
<a name="line-1266"></a><a name="instance%20MonadReader%20TCEnv%20(TCMT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Exception</span> <span class='hs-conid'>TCErr</span>
<a name="line-1267"></a>
<a name="line-1268"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-1269"></a><span class='hs-comment'>-- * Type checking monad transformer</span>
<a name="line-1270"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-1271"></a>
<a name="line-1272"></a><a name="TCMT"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-layout'>{</span> <span class='hs-varid'>unTCM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IORef</span> <span class='hs-conid'>TCState</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-layout'>}</span>
<a name="line-1273"></a>
<a name="line-1274"></a><a name="instance%20MonadReader%20TCEnv%20(TCMT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadReader</span> <span class='hs-conid'>TCEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1275"></a>  <span class='hs-varid'>ask</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>e</span>
<a name="line-1276"></a>  <span class='hs-varid'>local</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-1277"></a>
<a name="line-1278"></a><a name="instance%20MonadState%20TCState%20(TCMT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadState</span> <span class='hs-conid'>TCState</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1279"></a>  <span class='hs-varid'>get</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>readIORef</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-1280"></a>  <span class='hs-varid'>put</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>writeIORef</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-1281"></a>
<a name="line-1282"></a><a name="TCM"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>TCM</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCMT</span> <span class='hs-conid'>IO</span>
<a name="line-1283"></a>
<a name="line-1284"></a><a name="MonadTCM"></a><span class='hs-keyword'>class</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Applicative</span> <span class='hs-varid'>tcm</span><span class='hs-layout'>,</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>tcm</span>
<a name="line-1285"></a>      <span class='hs-layout'>,</span> <span class='hs-conid'>MonadReader</span> <span class='hs-conid'>TCEnv</span> <span class='hs-varid'>tcm</span>
<a name="line-1286"></a>      <span class='hs-layout'>,</span> <span class='hs-conid'>MonadState</span> <span class='hs-conid'>TCState</span> <span class='hs-varid'>tcm</span>
<a name="line-1287"></a>      <span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadTCM</span> <span class='hs-varid'>tcm</span> <span class='hs-keyword'>where</span>
<a name="line-1288"></a>    <span class='hs-varid'>liftTCM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tcm</span> <span class='hs-varid'>a</span>
<a name="line-1289"></a>
<a name="line-1290"></a><a name="instance%20MonadError%20TCErr%20(TCMT%20IO)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadError</span> <span class='hs-conid'>TCErr</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCMT</span> <span class='hs-conid'>IO</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1291"></a>  <span class='hs-varid'>throwError</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>.</span> <span class='hs-varid'>throwIO</span>
<a name="line-1292"></a>  <span class='hs-varid'>catchError</span> <span class='hs-varid'>m</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-1293"></a>    <span class='hs-varid'>oldState</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>readIORef</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-1294"></a>    <span class='hs-varid'>unTCM</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-varop'>`</span><span class='hs-conid'>E</span><span class='hs-varop'>.</span><span class='hs-varid'>catch</span><span class='hs-varop'>`</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-1295"></a>      <span class='hs-comment'>-- Reset the state, but do not forget changes to the persistent</span>
<a name="line-1296"></a>      <span class='hs-comment'>-- component.</span>
<a name="line-1297"></a>      <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-1298"></a>        <span class='hs-varid'>newState</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>r</span>
<a name="line-1299"></a>        <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>r</span> <span class='hs-varop'>$</span> <span class='hs-varid'>oldState</span> <span class='hs-layout'>{</span> <span class='hs-varid'>stPersistent</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>stPersistent</span> <span class='hs-varid'>newState</span> <span class='hs-layout'>}</span>
<a name="line-1300"></a>      <span class='hs-varid'>unTCM</span> <span class='hs-layout'>(</span><span class='hs-varid'>h</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span>
<a name="line-1301"></a>
<a name="line-1302"></a><a name="catchError_"></a><span class='hs-comment'>-- | Preserve the state of the failing computation.</span>
<a name="line-1303"></a><span class='hs-definition'>catchError_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCErr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-varid'>a</span>
<a name="line-1304"></a><span class='hs-definition'>catchError_</span> <span class='hs-varid'>m</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-1305"></a>  <span class='hs-varid'>unTCM</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span>
<a name="line-1306"></a>  <span class='hs-varop'>`</span><span class='hs-conid'>E</span><span class='hs-varop'>.</span><span class='hs-varid'>catch</span><span class='hs-varop'>`</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unTCM</span> <span class='hs-layout'>(</span><span class='hs-varid'>h</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span>
<a name="line-1307"></a>
<a name="line-1308"></a><a name="mapTCMT"></a><span class='hs-comment'>{-# SPECIALIZE INLINE mapTCMT :: (forall a. IO a -&gt; IO a) -&gt; TCM a -&gt; TCM a #-}</span>
<a name="line-1309"></a><span class='hs-definition'>mapTCMT</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>n</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>n</span> <span class='hs-varid'>a</span>
<a name="line-1310"></a><span class='hs-definition'>mapTCMT</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varid'>s</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-1311"></a>
<a name="line-1312"></a><a name="pureTCM"></a><span class='hs-definition'>pureTCM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCState</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-1313"></a><span class='hs-definition'>pureTCM</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-1314"></a>  <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>r</span>
<a name="line-1315"></a>  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-1316"></a>
<a name="line-1317"></a><a name="instance%20MonadTCM%20(TCMT%20m)"></a><span class='hs-comment'>{-# RULES "liftTCM/id" liftTCM = id #-}</span>
<a name="line-1318"></a><a name="instance%20MonadTCM%20(TCMT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadTCM</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1319"></a>    <span class='hs-varid'>liftTCM</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapTCMT</span> <span class='hs-varid'>liftIO</span>
<a name="line-1320"></a>
<a name="line-1321"></a><a name="instance%20MonadTCM%20(ErrorT%20err%20tcm)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Error</span> <span class='hs-varid'>err</span><span class='hs-layout'>,</span> <span class='hs-conid'>MonadTCM</span> <span class='hs-varid'>tcm</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadTCM</span> <span class='hs-layout'>(</span><span class='hs-conid'>ErrorT</span> <span class='hs-varid'>err</span> <span class='hs-varid'>tcm</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1322"></a>  <span class='hs-varid'>liftTCM</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>liftTCM</span>
<a name="line-1323"></a>
<a name="line-1324"></a><a name="instance%20MonadTrans%20TCMT"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadTrans</span> <span class='hs-conid'>TCMT</span> <span class='hs-keyword'>where</span>
<a name="line-1325"></a>    <span class='hs-varid'>lift</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span>
<a name="line-1326"></a>
<a name="line-1327"></a><a name="instance%20Monad%20(TCMT%20m)"></a><span class='hs-comment'>-- We want a special monad implementation of fail.</span>
<a name="line-1328"></a><a name="instance%20Monad%20(TCMT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1329"></a>    <span class='hs-varid'>return</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>returnTCMT</span>
<a name="line-1330"></a>    <span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;=</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindTCMT</span>
<a name="line-1331"></a>    <span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>thenTCMT</span>
<a name="line-1332"></a>    <span class='hs-varid'>fail</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>internalError</span>
<a name="line-1333"></a>
<a name="line-1334"></a><span class='hs-comment'>-- One goal of the definitions and pragmas below is to inline the</span>
<a name="line-1335"></a><span class='hs-comment'>-- monad operations as much as possible. This doesn't seem to have a</span>
<a name="line-1336"></a><span class='hs-comment'>-- large effect on the performance of the normal executable, but (at</span>
<a name="line-1337"></a><span class='hs-comment'>-- least on one machine/configuration) it has a massive effect on the</span>
<a name="line-1338"></a><span class='hs-comment'>-- performance of the profiling executable [1], and reduces the time</span>
<a name="line-1339"></a><span class='hs-comment'>-- attributed to bind from over 90% to about 25%.</span>
<a name="line-1340"></a><span class='hs-comment'>--</span>
<a name="line-1341"></a><span class='hs-comment'>-- [1] When compiled with -auto-all and run with -p: roughly 750%</span>
<a name="line-1342"></a><span class='hs-comment'>-- faster for one example.</span>
<a name="line-1343"></a>
<a name="line-1344"></a><a name="returnTCMT"></a><span class='hs-definition'>returnTCMT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-1345"></a><span class='hs-definition'>returnTCMT</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-1346"></a><span class='hs-comment'>{-# RULES "returnTCMT"
<a name="line-1347"></a>      returnTCMT = \x -&gt; TCM $ \_ _ -&gt; return x
<a name="line-1348"></a>  #-}</span>
<a name="line-1349"></a><span class='hs-comment'>{-# INLINE returnTCMT #-}</span>
<a name="line-1350"></a><span class='hs-comment'>{-# SPECIALIZE INLINE returnTCMT :: a -&gt; TCM a #-}</span>
<a name="line-1351"></a>
<a name="line-1352"></a><a name="bindTCMT"></a><span class='hs-definition'>bindTCMT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-1353"></a><span class='hs-definition'>bindTCMT</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unTCM</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span>
<a name="line-1354"></a><span class='hs-comment'>{-# RULES "bindTCMT"
<a name="line-1355"></a>      bindTCMT = \(TCM m) k -&gt; TCM $ \r e -&gt;
<a name="line-1356"></a>                   m r e &gt;&gt;= \x -&gt; unTCM (k x) r e
<a name="line-1357"></a>  #-}</span>
<a name="line-1358"></a><span class='hs-comment'>{-# INLINE bindTCMT #-}</span>
<a name="line-1359"></a><span class='hs-comment'>{-# SPECIALIZE INLINE bindTCMT :: TCM a -&gt; (a -&gt; TCM b) -&gt; TCM b #-}</span>
<a name="line-1360"></a>
<a name="line-1361"></a><a name="thenTCMT"></a><span class='hs-definition'>thenTCMT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-1362"></a><span class='hs-definition'>thenTCMT</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-varid'>m1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-varid'>m2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>m2</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span>
<a name="line-1363"></a><span class='hs-comment'>{-# RULES "thenTCMT"
<a name="line-1364"></a>      thenTCMT = \(TCM m1) (TCM m2) -&gt; TCM $ \r e -&gt; m1 r e &gt;&gt; m2 r e
<a name="line-1365"></a>  #-}</span>
<a name="line-1366"></a><span class='hs-comment'>{-# INLINE thenTCMT #-}</span>
<a name="line-1367"></a><span class='hs-comment'>{-# SPECIALIZE INLINE thenTCMT :: TCM a -&gt; TCM b -&gt; TCM b #-}</span>
<a name="line-1368"></a>
<a name="line-1369"></a><a name="instance%20Functor%20(TCMT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1370"></a>    <span class='hs-varid'>fmap</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmapTCMT</span>
<a name="line-1371"></a>
<a name="line-1372"></a><a name="fmapTCMT"></a><span class='hs-definition'>fmapTCMT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-1373"></a><span class='hs-definition'>fmapTCMT</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftM</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-1374"></a><span class='hs-comment'>{-# RULES "fmapTCMT"
<a name="line-1375"></a>      fmapTCMT = \f (TCM m) -&gt; TCM $ \r e -&gt; liftM f (m r e)
<a name="line-1376"></a>  #-}</span>
<a name="line-1377"></a><span class='hs-comment'>{-# INLINE fmapTCMT #-}</span>
<a name="line-1378"></a><span class='hs-comment'>{-# SPECIALIZE INLINE fmapTCMT :: (a -&gt; b) -&gt; TCM a -&gt; TCM b #-}</span>
<a name="line-1379"></a>
<a name="line-1380"></a><a name="instance%20Applicative%20(TCMT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1381"></a>    <span class='hs-varid'>pure</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>returnTCMT</span>
<a name="line-1382"></a>    <span class='hs-layout'>(</span><span class='hs-varop'>&lt;*&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>apTCMT</span>
<a name="line-1383"></a>
<a name="line-1384"></a><a name="apTCMT"></a><span class='hs-definition'>apTCMT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-1385"></a><span class='hs-definition'>apTCMT</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-varid'>mf</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCM</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ap</span> <span class='hs-layout'>(</span><span class='hs-varid'>mf</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-1386"></a><span class='hs-comment'>{-# RULES "apTCMT"
<a name="line-1387"></a>      apTCMT = \(TCM mf) (TCM m) -&gt; TCM $ \r e -&gt; ap (mf r e) (m r e)
<a name="line-1388"></a>  #-}</span>
<a name="line-1389"></a><span class='hs-comment'>{-# INLINE apTCMT #-}</span>
<a name="line-1390"></a><span class='hs-comment'>{-# SPECIALIZE INLINE apTCMT :: TCM (a -&gt; b) -&gt; TCM a -&gt; TCM b #-}</span>
<a name="line-1391"></a>
<a name="line-1392"></a><a name="instance%20MonadIO%20(TCMT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadIO</span> <span class='hs-layout'>(</span><span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-1393"></a>  <span class='hs-varid'>liftIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TCM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-1394"></a>              <span class='hs-keyword'>do</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>envRange</span> <span class='hs-varid'>e</span>
<a name="line-1395"></a>                 <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wrap</span> <span class='hs-varid'>r</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-1396"></a>                 <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>m</span>
<a name="line-1397"></a>                 <span class='hs-varid'>x</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-1398"></a>    <span class='hs-keyword'>where</span>
<a name="line-1399"></a>      <span class='hs-varid'>wrap</span> <span class='hs-varid'>r</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failOnException</span> <span class='hs-varid'>handleException</span>
<a name="line-1400"></a>               <span class='hs-varop'>$</span> <span class='hs-conid'>E</span><span class='hs-varop'>.</span><span class='hs-varid'>catch</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>handleIOException</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-1401"></a>
<a name="line-1402"></a>      <span class='hs-varid'>handleIOException</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwIO</span> <span class='hs-varop'>$</span> <span class='hs-conid'>IOException</span> <span class='hs-varid'>r</span> <span class='hs-varid'>e</span>
<a name="line-1403"></a>      <span class='hs-varid'>handleException</span>   <span class='hs-varid'>r</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwIO</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Exception</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s</span>
<a name="line-1404"></a>
<a name="line-1405"></a><a name="patternViolation"></a><span class='hs-definition'>patternViolation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCM</span> <span class='hs-varid'>a</span>
<a name="line-1406"></a><span class='hs-definition'>patternViolation</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-1407"></a>    <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span>
<a name="line-1408"></a>    <span class='hs-varid'>throwError</span> <span class='hs-varop'>$</span> <span class='hs-conid'>PatternErr</span> <span class='hs-varid'>s</span>
<a name="line-1409"></a>
<a name="line-1410"></a><a name="internalError"></a><span class='hs-definition'>internalError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadTCM</span> <span class='hs-varid'>tcm</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tcm</span> <span class='hs-varid'>a</span>
<a name="line-1411"></a><span class='hs-definition'>internalError</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>typeError</span> <span class='hs-varop'>$</span> <span class='hs-conid'>InternalError</span> <span class='hs-varid'>s</span>
<a name="line-1412"></a>
<a name="line-1413"></a><a name="typeError"></a><span class='hs-definition'>typeError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadTCM</span> <span class='hs-varid'>tcm</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>TypeError</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tcm</span> <span class='hs-varid'>a</span>
<a name="line-1414"></a><span class='hs-definition'>typeError</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftTCM</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-1415"></a>    <span class='hs-varid'>cl</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>buildClosure</span> <span class='hs-varid'>err</span>
<a name="line-1416"></a>    <span class='hs-varid'>s</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span>
<a name="line-1417"></a>    <span class='hs-varid'>throwError</span> <span class='hs-varop'>$</span> <span class='hs-conid'>TypeError</span> <span class='hs-varid'>s</span> <span class='hs-varid'>cl</span>
<a name="line-1418"></a>
<a name="line-1419"></a><a name="runTCM"></a><span class='hs-comment'>-- | Running the type checking monad</span>
<a name="line-1420"></a><span class='hs-definition'>runTCM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCMT</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>TCErr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-1421"></a><span class='hs-definition'>runTCM</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>runTCM'</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varop'>`</span><span class='hs-conid'>E</span><span class='hs-varop'>.</span><span class='hs-varid'>catch</span><span class='hs-varop'>`</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Left</span><span class='hs-layout'>)</span>
<a name="line-1422"></a>
<a name="line-1423"></a><a name="runTCM'"></a><span class='hs-definition'>runTCM'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>TCMT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-1424"></a><span class='hs-definition'>runTCM'</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-1425"></a>  <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>newIORef</span> <span class='hs-varid'>initState</span>
<a name="line-1426"></a>  <span class='hs-varid'>unTCM</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-varid'>initEnv</span>
<a name="line-1427"></a>
<a name="line-1428"></a><span class='hs-comment'>-- | Runs the given computation in a separate thread, with /a copy/ of</span>
<a name="line-1429"></a><span class='hs-comment'>-- the current state and environment.</span>
<a name="line-1430"></a><span class='hs-comment'>--</span>
<a name="line-1431"></a><span class='hs-comment'>-- Note that Agda sometimes uses actual, mutable state. If the</span>
<a name="line-1432"></a><span class='hs-comment'>-- computation given to @forkTCM@ tries to /modify/ this state, then</span>
<a name="line-1433"></a><span class='hs-comment'>-- bad things can happen, because accesses are not mutually exclusive.</span>
<a name="line-1434"></a><span class='hs-comment'>-- The @forkTCM@ function has been added mainly to allow the thread to</span>
<a name="line-1435"></a><span class='hs-comment'>-- /read/ (a snapshot of) the current state in a convenient way.</span>
<a name="line-1436"></a><span class='hs-comment'>--</span>
<a name="line-1437"></a><span class='hs-comment'>-- Note also that exceptions which are raised in the thread are not</span>
<a name="line-1438"></a><span class='hs-comment'>-- propagated to the parent, so the thread should not do anything</span>
<a name="line-1439"></a><span class='hs-comment'>-- important.</span>
<a name="line-1440"></a>
<a name="line-1441"></a><a name="forkTCM"></a><span class='hs-definition'>forkTCM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TCM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TCM</span> <span class='hs-conid'>()</span>
<a name="line-1442"></a><span class='hs-definition'>forkTCM</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-1443"></a>  <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span>
<a name="line-1444"></a>  <span class='hs-varid'>e</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ask</span>
<a name="line-1445"></a>  <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-varid'>forkIO</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-1446"></a>    <span class='hs-varid'>runTCM</span> <span class='hs-varop'>$</span> <span class='hs-varid'>local</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-1447"></a>      <span class='hs-varid'>put</span> <span class='hs-varid'>s</span>
<a name="line-1448"></a>      <span class='hs-varid'>m</span>
<a name="line-1449"></a>    <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-1450"></a>  <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-1451"></a>
<a name="line-1452"></a>
<a name="line-1453"></a>
<a name="line-1454"></a><a name="extendlambdaname"></a><span class='hs-comment'>-- | Base name for extended lambda patterns</span>
<a name="line-1455"></a><span class='hs-definition'>extendlambdaname</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>".extendedlambda"</span>
</pre></body>
</html>