Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > 985645091e820b64b6dd8f6fff6fd68e > files > 136

ghc-citeproc-hs-devel-0.3.2-2.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>src/Text/CSL/Proc/Disamb.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE PatternGuards #-}</span>
<a name="line-2"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-3"></a><span class='hs-comment'>-- |</span>
<a name="line-4"></a><span class='hs-comment'>-- Module      :  Text.CSL.Proc.Disamb</span>
<a name="line-5"></a><span class='hs-comment'>-- Copyright   :  (c) Andrea Rossato</span>
<a name="line-6"></a><span class='hs-comment'>-- License     :  BSD-style (see LICENSE)</span>
<a name="line-7"></a><span class='hs-comment'>--</span>
<a name="line-8"></a><span class='hs-comment'>-- Maintainer  :  Andrea Rossato &lt;andrea.rossato@unitn.it&gt;</span>
<a name="line-9"></a><span class='hs-comment'>-- Stability   :  unstable</span>
<a name="line-10"></a><span class='hs-comment'>-- Portability :  unportable</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- This module provides functions for processing the evaluated</span>
<a name="line-13"></a><span class='hs-comment'>-- 'Output' for citation disambiguation.</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- Describe the disambiguation process.</span>
<a name="line-16"></a><span class='hs-comment'>--</span>
<a name="line-17"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>CSL</span><span class='hs-varop'>.</span><span class='hs-conid'>Proc</span><span class='hs-varop'>.</span><span class='hs-conid'>Disamb</span> <span class='hs-keyword'>where</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Arrow</span> <span class='hs-layout'>(</span> <span class='hs-layout'>(</span><span class='hs-varop'>&amp;&amp;&amp;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>second</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'>Char</span> <span class='hs-layout'>(</span> <span class='hs-varid'>chr</span> <span class='hs-layout'>)</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'>List</span> <span class='hs-layout'>(</span> <span class='hs-varid'>elemIndex</span><span class='hs-layout'>,</span> <span class='hs-varid'>find</span><span class='hs-layout'>,</span> <span class='hs-varid'>findIndex</span><span class='hs-layout'>,</span> <span class='hs-varid'>sortBy</span><span class='hs-layout'>,</span> <span class='hs-varid'>mapAccumL</span>
<a name="line-24"></a>                 <span class='hs-layout'>,</span> <span class='hs-varid'>nub</span><span class='hs-layout'>,</span> <span class='hs-varid'>groupBy</span><span class='hs-layout'>,</span> <span class='hs-varid'>isPrefixOf</span> <span class='hs-layout'>)</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'>Maybe</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ord</span> <span class='hs-layout'>(</span> <span class='hs-varid'>comparing</span> <span class='hs-layout'>)</span>
<a name="line-27"></a>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>CSL</span><span class='hs-varop'>.</span><span class='hs-conid'>Eval</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>CSL</span><span class='hs-varop'>.</span><span class='hs-conid'>Output</span><span class='hs-varop'>.</span><span class='hs-conid'>Plain</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>CSL</span><span class='hs-varop'>.</span><span class='hs-conid'>Reference</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>CSL</span><span class='hs-varop'>.</span><span class='hs-conid'>Style</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="disambCitations"></a><span class='hs-comment'>-- | Given the 'Style', the list of references and the citation</span>
<a name="line-34"></a><span class='hs-comment'>-- groups, disambiguate citations according to the style options.</span>
<a name="line-35"></a><span class='hs-definition'>disambCitations</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Style</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Reference</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Citations</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CitationGroup</span><span class='hs-keyglyph'>]</span>
<a name="line-36"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CitationGroup</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-definition'>disambCitations</span> <span class='hs-varid'>s</span> <span class='hs-varid'>bibs</span> <span class='hs-varid'>cs</span> <span class='hs-varid'>groups</span>
<a name="line-38"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>(,)</span> <span class='hs-varid'>yearSuffs</span> <span class='hs-varid'>citOutput</span>
<a name="line-39"></a>    <span class='hs-keyword'>where</span>
<a name="line-40"></a>      <span class='hs-comment'>-- utils</span>
<a name="line-41"></a>      <span class='hs-varid'>when_</span> <span class='hs-varid'>b</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>[]</span>
<a name="line-42"></a>      <span class='hs-varid'>filter_</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>fst</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>filter</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>uncurry</span> <span class='hs-varid'>zip</span><span class='hs-layout'>)</span>
<a name="line-43"></a>
<a name="line-44"></a>      <span class='hs-comment'>-- the list of the position and the reference of each citation</span>
<a name="line-45"></a>      <span class='hs-comment'>-- for each citation group.</span>
<a name="line-46"></a>      <span class='hs-varid'>refs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>processCites</span> <span class='hs-varid'>bibs</span> <span class='hs-varid'>cs</span>
<a name="line-47"></a>      <span class='hs-comment'>-- name data of name duplicates</span>
<a name="line-48"></a>      <span class='hs-varid'>nameDupls</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getDuplNameData</span> <span class='hs-varid'>groups</span>
<a name="line-49"></a>      <span class='hs-comment'>-- citation data of ambiguous cites</span>
<a name="line-50"></a>      <span class='hs-varid'>duplics</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getDuplCiteData</span> <span class='hs-varid'>hasNamesOpt</span> <span class='hs-varop'>$</span> <span class='hs-varid'>addGName</span> <span class='hs-varid'>groups</span>
<a name="line-51"></a>
<a name="line-52"></a>      <span class='hs-comment'>-- check the options set in the style</span>
<a name="line-53"></a>      <span class='hs-comment'>--isByCite = getOptionVal "givenname-disambiguation-rule" (citOptions . citation $ s) == "by-cite"</span>
<a name="line-54"></a>      <span class='hs-varid'>disOpts</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getCitDisambOptions</span> <span class='hs-varid'>s</span>
<a name="line-55"></a>      <span class='hs-varid'>hasNamesOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"disambiguate-add-names"</span>       <span class='hs-varop'>`elem`</span> <span class='hs-varid'>disOpts</span>
<a name="line-56"></a>      <span class='hs-varid'>hasGNameOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"disambiguate-add-givenname"</span>   <span class='hs-varop'>`elem`</span> <span class='hs-varid'>disOpts</span>
<a name="line-57"></a>      <span class='hs-varid'>hasYSuffOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"disambiguate-add-year-suffix"</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>disOpts</span>
<a name="line-58"></a>
<a name="line-59"></a>      <span class='hs-varid'>withNames</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>map</span> <span class='hs-varid'>duplics</span> <span class='hs-varop'>$</span> <span class='hs-varid'>same</span> <span class='hs-varop'>.</span> <span class='hs-varid'>proc</span> <span class='hs-varid'>rmNameHash</span> <span class='hs-varop'>.</span> <span class='hs-varid'>proc</span> <span class='hs-varid'>rmGivenNames</span> <span class='hs-varop'>.</span>
<a name="line-60"></a>                  <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-varid'>hasNamesOpt</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>disambData</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>disambYS</span><span class='hs-layout'>)</span>
<a name="line-61"></a>
<a name="line-62"></a>      <span class='hs-varid'>needNames</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filter_</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>disambAddNames</span> <span class='hs-varid'>duplics</span><span class='hs-layout'>)</span> <span class='hs-varid'>withNames</span>
<a name="line-63"></a>      <span class='hs-varid'>needYSuff</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filter_</span>        <span class='hs-varid'>snd</span>  <span class='hs-varop'>$</span> <span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>disambAddLast</span>  <span class='hs-varid'>duplics</span><span class='hs-layout'>)</span> <span class='hs-varid'>withNames</span>
<a name="line-64"></a>
<a name="line-65"></a>      <span class='hs-varid'>newNames</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span>
<a name="line-66"></a>      <span class='hs-varid'>newNames</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>when_</span> <span class='hs-varid'>hasNamesOpt</span> <span class='hs-varop'>$</span> <span class='hs-varid'>needNames</span> <span class='hs-varop'>++</span> <span class='hs-varid'>needYSuff</span>
<a name="line-67"></a>
<a name="line-68"></a>      <span class='hs-varid'>newGName</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NameData</span><span class='hs-keyglyph'>]</span>
<a name="line-69"></a>      <span class='hs-varid'>newGName</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>when_</span> <span class='hs-varid'>hasGNameOpt</span> <span class='hs-varop'>$</span> <span class='hs-varid'>concatMap</span> <span class='hs-varid'>disambAddGivenNames</span> <span class='hs-varid'>nameDupls</span>
<a name="line-70"></a>
<a name="line-71"></a>      <span class='hs-comment'>-- the list of citations that need re-evaluation with the</span>
<a name="line-72"></a>      <span class='hs-comment'>-- \"disambiguate\" condition set to 'True'</span>
<a name="line-73"></a>      <span class='hs-varid'>reEval</span>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>chk</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>hasYSuffOpt</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>.</span> <span class='hs-varid'>citYear</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>id</span>
<a name="line-74"></a>                    <span class='hs-keyword'>in</span>  <span class='hs-varid'>chk</span> <span class='hs-varid'>needYSuff</span>
<a name="line-75"></a>      <span class='hs-varid'>reEvaluated</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>or</span> <span class='hs-layout'>(</span><span class='hs-varid'>query</span> <span class='hs-varid'>hasIfDis</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>reEval</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span>
<a name="line-76"></a>                    <span class='hs-keyword'>then</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>uncurry</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reEvaluate</span> <span class='hs-varid'>s</span> <span class='hs-varid'>reEval</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>zip</span> <span class='hs-varid'>refs</span> <span class='hs-varid'>groups</span>
<a name="line-77"></a>                    <span class='hs-keyword'>else</span> <span class='hs-varid'>groups</span>
<a name="line-78"></a>
<a name="line-79"></a>      <span class='hs-varid'>addGName</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>proc</span> <span class='hs-layout'>(</span><span class='hs-varid'>updateOutput</span> <span class='hs-conid'>[]</span>       <span class='hs-varid'>newGName</span><span class='hs-layout'>)</span>
<a name="line-80"></a>      <span class='hs-varid'>addNames</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>proc</span> <span class='hs-layout'>(</span><span class='hs-varid'>updateOutput</span> <span class='hs-varid'>newNames</span> <span class='hs-varid'>newGName</span><span class='hs-layout'>)</span>
<a name="line-81"></a>
<a name="line-82"></a>      <span class='hs-varid'>withYearS</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>hasYSuffOpt</span>
<a name="line-83"></a>                  <span class='hs-keyword'>then</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapCitationGroup</span> <span class='hs-varop'>$</span> <span class='hs-varid'>setYearSuffCollision</span> <span class='hs-varid'>hasNamesOpt</span> <span class='hs-varid'>needYSuff</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reEvaluated</span>
<a name="line-84"></a>                  <span class='hs-keyword'>else</span> <span class='hs-varid'>rmYearSuff</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reEvaluated</span>
<a name="line-85"></a>
<a name="line-86"></a>      <span class='hs-varid'>yearSuffs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>when_</span> <span class='hs-varid'>hasYSuffOpt</span> <span class='hs-varop'>.</span> <span class='hs-varid'>generateYearSuffix</span> <span class='hs-varid'>bibs</span> <span class='hs-varop'>.</span> <span class='hs-varid'>query</span> <span class='hs-varid'>getYearSuffixes</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withYearS</span>
<a name="line-87"></a>
<a name="line-88"></a>      <span class='hs-varid'>processed</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>hasYSuffOpt</span>
<a name="line-89"></a>                  <span class='hs-keyword'>then</span> <span class='hs-varid'>proc</span> <span class='hs-layout'>(</span><span class='hs-varid'>updateYearSuffixes</span> <span class='hs-varid'>yearSuffs</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span>
<a name="line-90"></a>                       <span class='hs-varid'>addNames</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withYearS</span>
<a name="line-91"></a>                  <span class='hs-keyword'>else</span> <span class='hs-varid'>addNames</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withYearS</span>
<a name="line-92"></a>
<a name="line-93"></a>      <span class='hs-varid'>citOutput</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>disOpts</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>processed</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>groups</span>
<a name="line-94"></a>
<a name="line-95"></a><a name="mapDisambData"></a><span class='hs-definition'>mapDisambData</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Output</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Output</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CiteData</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CiteData</span>
<a name="line-96"></a><span class='hs-definition'>mapDisambData</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>CD</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <span class='hs-varid'>ys</span> <span class='hs-varid'>d</span> <span class='hs-varid'>r</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CD</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <span class='hs-varid'>ys</span> <span class='hs-layout'>(</span><span class='hs-varid'>proc</span> <span class='hs-varid'>f</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-varid'>y</span>
<a name="line-97"></a>
<a name="line-98"></a><a name="mapCitationGroup"></a><span class='hs-definition'>mapCitationGroup</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Output</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Output</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CitationGroup</span> <span class='hs-keyglyph'>-&gt;</span>  <span class='hs-conid'>CitationGroup</span>
<a name="line-99"></a><span class='hs-definition'>mapCitationGroup</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>CG</span> <span class='hs-varid'>cs</span> <span class='hs-varid'>fm</span> <span class='hs-varid'>d</span> <span class='hs-varid'>os</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CG</span> <span class='hs-varid'>cs</span> <span class='hs-varid'>fm</span> <span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>fst</span> <span class='hs-varid'>os</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>os</span><span class='hs-layout'>)</span>
<a name="line-100"></a>
<a name="line-101"></a><a name="disambAddNames"></a><span class='hs-definition'>disambAddNames</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span>
<a name="line-102"></a><span class='hs-definition'>disambAddNames</span> <span class='hs-varid'>needName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addLNames</span>
<a name="line-103"></a>    <span class='hs-keyword'>where</span>
<a name="line-104"></a>      <span class='hs-varid'>disSolved</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zip</span> <span class='hs-varid'>needName</span> <span class='hs-layout'>(</span><span class='hs-varid'>disambiguate</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>disambData</span> <span class='hs-varid'>needName</span><span class='hs-layout'>)</span>
<a name="line-105"></a>      <span class='hs-varid'>addLNames</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span> <span class='hs-layout'>{</span> <span class='hs-varid'>disambed</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>collision</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>head</span> <span class='hs-varid'>n</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>disSolved</span>
<a name="line-106"></a>
<a name="line-107"></a><a name="disambAddLast"></a><span class='hs-definition'>disambAddLast</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span>
<a name="line-108"></a><span class='hs-definition'>disambAddLast</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>last_</span>
<a name="line-109"></a>    <span class='hs-keyword'>where</span>
<a name="line-110"></a>      <span class='hs-varid'>last_</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-layout'>{</span> <span class='hs-varid'>disambed</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>disambData</span> <span class='hs-varid'>c</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>last</span> <span class='hs-varop'>$</span> <span class='hs-varid'>disambData</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>collision</span>  <span class='hs-varid'>c</span> <span class='hs-layout'>}</span>
<a name="line-111"></a>
<a name="line-112"></a><a name="disambAddGivenNames"></a><span class='hs-definition'>disambAddGivenNames</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NameData</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NameData</span><span class='hs-keyglyph'>]</span>
<a name="line-113"></a><span class='hs-definition'>disambAddGivenNames</span> <span class='hs-varid'>needName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addGName</span>
<a name="line-114"></a>    <span class='hs-keyword'>where</span>
<a name="line-115"></a>      <span class='hs-varid'>disSolved</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zip</span> <span class='hs-varid'>needName</span> <span class='hs-layout'>(</span><span class='hs-varid'>disambiguate</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>nameDisambData</span> <span class='hs-varid'>needName</span><span class='hs-layout'>)</span>
<a name="line-116"></a>      <span class='hs-varid'>addGName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span> <span class='hs-layout'>{</span> <span class='hs-varid'>nameDataSolved</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>nameCollision</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>head</span> <span class='hs-varid'>n</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>disSolved</span>
<a name="line-117"></a>
<a name="line-118"></a><a name="updateOutput"></a><span class='hs-comment'>-- | Given the list of 'CiteData' with the disambiguated field set</span>
<a name="line-119"></a><span class='hs-comment'>-- update the evaluated citations by setting the contributor list</span>
<a name="line-120"></a><span class='hs-comment'>-- accordingly.</span>
<a name="line-121"></a><span class='hs-definition'>updateOutput</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NameData</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Output</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Output</span>
<a name="line-122"></a><span class='hs-definition'>updateOutput</span> <span class='hs-varid'>c</span> <span class='hs-varid'>n</span> <span class='hs-varid'>o</span>
<a name="line-123"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OContrib</span> <span class='hs-varid'>k</span> <span class='hs-varid'>r</span> <span class='hs-varid'>x</span>  <span class='hs-keyword'>_</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>elemIndex</span> <span class='hs-layout'>(</span><span class='hs-conid'>CD</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>clean</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>of</span>
<a name="line-124"></a>                                   <span class='hs-conid'>Just</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OContrib</span> <span class='hs-varid'>k</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>disambed</span> <span class='hs-varop'>$</span> <span class='hs-varid'>c</span> <span class='hs-varop'>!!</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>d</span>
<a name="line-125"></a>                                   <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>o</span>
<a name="line-126"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OName</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>o</span>
<a name="line-127"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OName</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span>  <span class='hs-varid'>f</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>elemIndex</span> <span class='hs-layout'>(</span><span class='hs-conid'>ND</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>clean</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>of</span>
<a name="line-128"></a>                              <span class='hs-conid'>Just</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OName</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameDataSolved</span> <span class='hs-varop'>$</span> <span class='hs-varid'>n</span> <span class='hs-varop'>!!</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>f</span>
<a name="line-129"></a>                              <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>o</span>
<a name="line-130"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>o</span>
<a name="line-131"></a>    <span class='hs-keyword'>where</span>
<a name="line-132"></a>      <span class='hs-varid'>clean</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>proc</span> <span class='hs-varid'>rmGivenNames</span>
<a name="line-133"></a>
<a name="line-134"></a><a name="reEvaluate"></a><span class='hs-comment'>-- | Evaluate again a citation group with the 'EvalState' 'disamb'</span>
<a name="line-135"></a><span class='hs-comment'>-- field set to 'True' (for matching the @\"disambiguate\"@</span>
<a name="line-136"></a><span class='hs-comment'>-- condition).</span>
<a name="line-137"></a><span class='hs-definition'>reEvaluate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Style</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Cite</span><span class='hs-layout'>,</span> <span class='hs-conid'>Reference</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CitationGroup</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CitationGroup</span>
<a name="line-138"></a><span class='hs-definition'>reEvaluate</span> <span class='hs-layout'>(</span><span class='hs-conid'>Style</span> <span class='hs-layout'>{</span><span class='hs-varid'>citation</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ct</span><span class='hs-layout'>,</span> <span class='hs-varid'>csMacros</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ms</span> <span class='hs-layout'>,</span> <span class='hs-varid'>styleLocale</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lo</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <span class='hs-varid'>cr</span> <span class='hs-layout'>(</span><span class='hs-conid'>CG</span> <span class='hs-varid'>a</span> <span class='hs-varid'>f</span> <span class='hs-varid'>d</span> <span class='hs-varid'>os</span><span class='hs-layout'>)</span>
<a name="line-139"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CG</span> <span class='hs-varid'>a</span> <span class='hs-varid'>f</span> <span class='hs-varid'>d</span> <span class='hs-varop'>.</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-varid'>cr</span> <span class='hs-varid'>os</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-140"></a>      <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>out</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>refId</span> <span class='hs-varid'>r</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>map</span> <span class='hs-varid'>key</span> <span class='hs-varid'>l</span>
<a name="line-141"></a>                      <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>second</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-conid'>Output</span> <span class='hs-varid'>emptyFormatting</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-142"></a>                           <span class='hs-conid'>(,)</span> <span class='hs-varid'>c</span> <span class='hs-varop'>$</span> <span class='hs-varid'>evalLayout</span> <span class='hs-layout'>(</span><span class='hs-varid'>citLayout</span> <span class='hs-varid'>ct</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>EvalCite</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-conid'>True</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>ms</span> <span class='hs-layout'>(</span><span class='hs-varid'>citOptions</span> <span class='hs-varid'>ct</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span>
<a name="line-143"></a>                      <span class='hs-keyword'>else</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>out</span><span class='hs-keyglyph'>]</span>
<a name="line-144"></a>
<a name="line-145"></a><a name="hasIfDis"></a><span class='hs-comment'>-- | Check if the 'Style' has any conditional for disambiguation. In</span>
<a name="line-146"></a><span class='hs-comment'>-- this case the conditional will be try after all other</span>
<a name="line-147"></a><span class='hs-comment'>-- disambiguation strategies have failed. To be used with the generic</span>
<a name="line-148"></a><span class='hs-comment'>-- 'query' function.</span>
<a name="line-149"></a><span class='hs-definition'>hasIfDis</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfThen</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Bool</span><span class='hs-keyglyph'>]</span>
<a name="line-150"></a><span class='hs-definition'>hasIfDis</span> <span class='hs-varid'>o</span>
<a name="line-151"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IfThen</span> <span class='hs-layout'>(</span><span class='hs-conid'>Condition</span> <span class='hs-layout'>{</span><span class='hs-varid'>disambiguation</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-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span><span class='hs-keyglyph'>]</span>
<a name="line-152"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                                        <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>False</span>  <span class='hs-keyglyph'>]</span>
<a name="line-153"></a>
<a name="line-154"></a><a name="getCitDisambOptions"></a><span class='hs-comment'>-- | Get the list of disambiguation options set in the 'Style' for</span>
<a name="line-155"></a><span class='hs-comment'>-- citations.</span>
<a name="line-156"></a><span class='hs-definition'>getCitDisambOptions</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Style</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-157"></a><span class='hs-definition'>getCitDisambOptions</span>
<a name="line-158"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>fst</span> <span class='hs-varop'>.</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-str'>"true"</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span>
<a name="line-159"></a>      <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>isPrefixOf</span> <span class='hs-str'>"disambiguate"</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fst</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>citOptions</span> <span class='hs-varop'>.</span> <span class='hs-varid'>citation</span>
<a name="line-160"></a>
<a name="line-161"></a><a name="getDuplCiteData"></a><span class='hs-comment'>-- | Group citation data (with possible alternative names) of</span>
<a name="line-162"></a><span class='hs-comment'>-- citations which have a duplicate (same 'collision' and same</span>
<a name="line-163"></a><span class='hs-comment'>-- 'citYear'). If the first 'Bool' is 'False', then we need to</span>
<a name="line-164"></a><span class='hs-comment'>-- retrieve data for year suffix disambiguation.</span>
<a name="line-165"></a><span class='hs-definition'>getDuplCiteData</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CitationGroup</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-166"></a><span class='hs-definition'>getDuplCiteData</span> <span class='hs-varid'>b</span> <span class='hs-varid'>g</span>
<a name="line-167"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>groupBy</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>collide</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-varid'>collide</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>sortBy</span> <span class='hs-layout'>(</span><span class='hs-varid'>comparing</span> <span class='hs-varid'>collide</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>duplicates</span>
<a name="line-168"></a>    <span class='hs-keyword'>where</span>
<a name="line-169"></a>      <span class='hs-varid'>whatToGet</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>collision</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>disambYS</span>
<a name="line-170"></a>      <span class='hs-varid'>collide</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>proc</span> <span class='hs-varid'>rmNameHash</span> <span class='hs-varop'>.</span> <span class='hs-varid'>proc</span> <span class='hs-varid'>rmGivenNames</span> <span class='hs-varop'>.</span> <span class='hs-varid'>whatToGet</span>
<a name="line-171"></a>      <span class='hs-varid'>citeData</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nub</span> <span class='hs-varop'>$</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapGroupOutput</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getCiteData</span><span class='hs-layout'>)</span> <span class='hs-varid'>g</span>
<a name="line-172"></a>      <span class='hs-varid'>duplicates</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>collide</span> <span class='hs-varop'>&amp;&amp;&amp;</span> <span class='hs-varid'>citYear</span> <span class='hs-varop'>&gt;&gt;&gt;</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>elem</span> <span class='hs-layout'>(</span><span class='hs-varid'>getDuplNamesYear</span> <span class='hs-varid'>b</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>citeData</span>
<a name="line-173"></a>
<a name="line-174"></a><a name="getCiteData"></a><span class='hs-comment'>-- | For an evaluated citation get its 'CiteData'. The disambiguated</span>
<a name="line-175"></a><span class='hs-comment'>-- citation and the year fields are empty.</span>
<a name="line-176"></a><span class='hs-definition'>getCiteData</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Output</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span>
<a name="line-177"></a><span class='hs-definition'>getCiteData</span>
<a name="line-178"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>contribs</span> <span class='hs-varop'>&amp;&amp;&amp;</span> <span class='hs-varid'>years</span> <span class='hs-varop'>&gt;&gt;&gt;</span>
<a name="line-179"></a>      <span class='hs-varid'>zipData</span>
<a name="line-180"></a>    <span class='hs-keyword'>where</span>
<a name="line-181"></a>      <span class='hs-varid'>contribs</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>query</span> <span class='hs-varid'>contribsQ</span> <span class='hs-varid'>x</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span>
<a name="line-182"></a>                   <span class='hs-keyword'>then</span> <span class='hs-varid'>query</span> <span class='hs-varid'>contribsQ</span> <span class='hs-varid'>x</span>
<a name="line-183"></a>                   <span class='hs-keyword'>else</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CD</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span><span class='hs-keyglyph'>]</span>
<a name="line-184"></a>      <span class='hs-varid'>yearsQ</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>query</span> <span class='hs-varid'>getYears</span>
<a name="line-185"></a>      <span class='hs-varid'>years</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>yearsQ</span> <span class='hs-varid'>o</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>yearsQ</span> <span class='hs-varid'>o</span> <span class='hs-keyword'>else</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-186"></a>      <span class='hs-varid'>zipData</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uncurry</span> <span class='hs-varop'>.</span> <span class='hs-varid'>zipWith</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>key</span> <span class='hs-varid'>c</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span>
<a name="line-187"></a>                                            <span class='hs-keyword'>then</span> <span class='hs-varid'>c</span> <span class='hs-layout'>{</span><span class='hs-varid'>citYear</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>y</span><span class='hs-layout'>}</span>
<a name="line-188"></a>                                            <span class='hs-keyword'>else</span> <span class='hs-varid'>c</span> <span class='hs-layout'>{</span><span class='hs-varid'>key</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fst</span> <span class='hs-varid'>y</span>
<a name="line-189"></a>                                                   <span class='hs-layout'>,</span><span class='hs-varid'>citYear</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>y</span><span class='hs-layout'>}</span>
<a name="line-190"></a>      <span class='hs-varid'>contribsQ</span> <span class='hs-varid'>o</span>
<a name="line-191"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OContrib</span> <span class='hs-varid'>k</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span> <span class='hs-varid'>d</span> <span class='hs-varid'>dd</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CD</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <span class='hs-varid'>d</span> <span class='hs-varid'>dd</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span><span class='hs-keyglyph'>]</span>
<a name="line-192"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-193"></a>
<a name="line-194"></a><a name="NamesYear"></a><span class='hs-comment'>-- | The contributors diambiguation data, the list of names and</span>
<a name="line-195"></a><a name="NamesYear"></a><span class='hs-comment'>-- give-names, and the citation year ('OYear').</span>
<a name="line-196"></a><a name="NamesYear"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>NamesYear</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Output</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-conid'>String</span><span class='hs-layout'>)</span>
<a name="line-197"></a>
<a name="line-198"></a><a name="getDuplNamesYear"></a><span class='hs-comment'>-- | Get the contributors list ('OContrib') and the year occurring in</span>
<a name="line-199"></a><span class='hs-comment'>-- more then one citation.</span>
<a name="line-200"></a><span class='hs-definition'>getDuplNamesYear</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CitationGroup</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NamesYear</span><span class='hs-keyglyph'>]</span>
<a name="line-201"></a><span class='hs-definition'>getDuplNamesYear</span> <span class='hs-varid'>b</span>
<a name="line-202"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nub</span> <span class='hs-varop'>.</span> <span class='hs-varid'>catMaybes</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>.</span> <span class='hs-varid'>mapAccumL</span> <span class='hs-varid'>dupl</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>.</span> <span class='hs-varid'>getData</span>
<a name="line-203"></a>    <span class='hs-keyword'>where</span>
<a name="line-204"></a>      <span class='hs-varid'>getData</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nub</span> <span class='hs-varop'>.</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapGroupOutput</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getNamesYear</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-205"></a>      <span class='hs-varid'>dupl</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>c</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>a</span>
<a name="line-206"></a>                 <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-layout'>(</span><span class='hs-varid'>snd</span> <span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-207"></a>
<a name="line-208"></a><a name="getNamesYear"></a><span class='hs-comment'>-- | Get the list of citation keys coupled with their 'NamesYear' in</span>
<a name="line-209"></a><span class='hs-comment'>-- the evaluated 'Output'. If the 'Bool' is 'False' then the function</span>
<a name="line-210"></a><span class='hs-comment'>-- retrieves the names used in citations not occuring for the first</span>
<a name="line-211"></a><span class='hs-comment'>-- time.</span>
<a name="line-212"></a><span class='hs-definition'>getNamesYear</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Output</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-conid'>NamesYear</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-213"></a><span class='hs-definition'>getNamesYear</span> <span class='hs-varid'>b</span>
<a name="line-214"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>proc</span> <span class='hs-varid'>rmNameHash</span>    <span class='hs-varop'>&gt;&gt;&gt;</span>
<a name="line-215"></a>      <span class='hs-varid'>proc</span> <span class='hs-varid'>rmGivenNames</span>  <span class='hs-varop'>&gt;&gt;&gt;</span>
<a name="line-216"></a>      <span class='hs-varid'>contribs</span> <span class='hs-varop'>&amp;&amp;&amp;</span> <span class='hs-varid'>years</span> <span class='hs-varop'>&gt;&gt;&gt;</span>
<a name="line-217"></a>      <span class='hs-varid'>zipData</span>
<a name="line-218"></a>    <span class='hs-keyword'>where</span>
<a name="line-219"></a>      <span class='hs-varid'>contribs</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>query</span> <span class='hs-varid'>contribsQ</span> <span class='hs-varid'>x</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span>
<a name="line-220"></a>                   <span class='hs-keyword'>then</span> <span class='hs-varid'>query</span> <span class='hs-varid'>contribsQ</span> <span class='hs-varid'>x</span>
<a name="line-221"></a>                   <span class='hs-keyword'>else</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-222"></a>      <span class='hs-varid'>yearsQ</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>query</span> <span class='hs-varid'>getYears</span>
<a name="line-223"></a>      <span class='hs-varid'>years</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>yearsQ</span> <span class='hs-varid'>o</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>yearsQ</span> <span class='hs-varid'>o</span> <span class='hs-keyword'>else</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-224"></a>      <span class='hs-varid'>zipData</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uncurry</span> <span class='hs-varop'>.</span> <span class='hs-varid'>zipWith</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>k</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>[]</span>
<a name="line-225"></a>                                                <span class='hs-keyword'>then</span> <span class='hs-conid'>(,)</span> <span class='hs-varid'>k</span>       <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-226"></a>                                                <span class='hs-keyword'>else</span> <span class='hs-conid'>(,)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-227"></a>      <span class='hs-varid'>contribsQ</span> <span class='hs-varid'>o</span>
<a name="line-228"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OContrib</span> <span class='hs-varid'>k</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span> <span class='hs-varid'>d</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-229"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>               <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-230"></a>
<a name="line-231"></a><a name="getYears"></a><span class='hs-definition'>getYears</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Output</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-232"></a><span class='hs-definition'>getYears</span> <span class='hs-varid'>o</span>
<a name="line-233"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OYear</span> <span class='hs-varid'>x</span> <span class='hs-varid'>k</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-234"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-235"></a>
<a name="line-236"></a><a name="getDuplNameData"></a><span class='hs-definition'>getDuplNameData</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CitationGroup</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>NameData</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-237"></a><span class='hs-definition'>getDuplNameData</span> <span class='hs-varid'>g</span>
<a name="line-238"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>groupBy</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>collide</span> <span class='hs-varid'>a</span> <span class='hs-varop'>==</span> <span class='hs-varid'>collide</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>sortBy</span> <span class='hs-layout'>(</span><span class='hs-varid'>comparing</span> <span class='hs-varid'>collide</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>duplicates</span>
<a name="line-239"></a>    <span class='hs-keyword'>where</span>
<a name="line-240"></a>      <span class='hs-varid'>collide</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nameCollision</span>
<a name="line-241"></a>      <span class='hs-varid'>nameData</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nub</span> <span class='hs-varop'>$</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapGroupOutput</span> <span class='hs-varid'>getName</span><span class='hs-layout'>)</span> <span class='hs-varid'>g</span>
<a name="line-242"></a>      <span class='hs-varid'>duplicates</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-varid'>elem</span> <span class='hs-layout'>(</span><span class='hs-varid'>getDuplNames</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>collide</span><span class='hs-layout'>)</span> <span class='hs-varid'>nameData</span>
<a name="line-243"></a>
<a name="line-244"></a><a name="getDuplNames"></a><span class='hs-definition'>getDuplNames</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CitationGroup</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Output</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-245"></a><span class='hs-definition'>getDuplNames</span> <span class='hs-varid'>xs</span>
<a name="line-246"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nub</span> <span class='hs-varop'>.</span> <span class='hs-varid'>catMaybes</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>.</span> <span class='hs-varid'>mapAccumL</span> <span class='hs-varid'>dupl</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>.</span> <span class='hs-varid'>getData</span> <span class='hs-varop'>$</span> <span class='hs-varid'>xs</span>
<a name="line-247"></a>    <span class='hs-keyword'>where</span>
<a name="line-248"></a>      <span class='hs-varid'>getData</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapGroupOutput</span> <span class='hs-varid'>getName</span><span class='hs-layout'>)</span>
<a name="line-249"></a>      <span class='hs-varid'>dupl</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>nameCollision</span> <span class='hs-varid'>c</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>map</span> <span class='hs-varid'>nameCollision</span> <span class='hs-varid'>a</span>
<a name="line-250"></a>                 <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>nameCollision</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-251"></a>                 <span class='hs-keyword'>else</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-252"></a>
<a name="line-253"></a><a name="getName"></a><span class='hs-definition'>getName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Output</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NameData</span><span class='hs-keyglyph'>]</span>
<a name="line-254"></a><span class='hs-definition'>getName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>query</span> <span class='hs-varid'>getName'</span>
<a name="line-255"></a>    <span class='hs-keyword'>where</span>
<a name="line-256"></a>      <span class='hs-varid'>getName'</span> <span class='hs-varid'>o</span>
<a name="line-257"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OName</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ns</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ND</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-varid'>ns</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span><span class='hs-keyglyph'>]</span>
<a name="line-258"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-259"></a>
<a name="line-260"></a><a name="generateYearSuffix"></a><span class='hs-definition'>generateYearSuffix</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Reference</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Output</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-261"></a><span class='hs-definition'>generateYearSuffix</span> <span class='hs-varid'>refs</span>
<a name="line-262"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-varid'>zip</span> <span class='hs-varid'>suffs</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span>
<a name="line-263"></a>      <span class='hs-comment'>-- sort clashing cites using their position in the sorted bibliography</span>
<a name="line-264"></a>      <span class='hs-varid'>getFst</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-varid'>sort'</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>/=</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>getP</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span>
<a name="line-265"></a>      <span class='hs-comment'>-- group clashing cites</span>
<a name="line-266"></a>      <span class='hs-varid'>getFst</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-varid'>nub</span> <span class='hs-varop'>.</span> <span class='hs-varid'>groupBy</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>a</span> <span class='hs-varop'>==</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>sort'</span> <span class='hs-varop'>.</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>/=</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span>
<a name="line-267"></a>    <span class='hs-keyword'>where</span>
<a name="line-268"></a>      <span class='hs-varid'>sort'</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-269"></a>      <span class='hs-varid'>sort'</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sortBy</span> <span class='hs-layout'>(</span><span class='hs-varid'>comparing</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span>
<a name="line-270"></a>      <span class='hs-varid'>getFst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>fst</span>
<a name="line-271"></a>      <span class='hs-varid'>getP</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>findIndex</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-varid'>k</span> <span class='hs-varop'>.</span> <span class='hs-varid'>refId</span><span class='hs-layout'>)</span> <span class='hs-varid'>refs</span> <span class='hs-keyword'>of</span>
<a name="line-272"></a>                   <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-273"></a>                   <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span>     <span class='hs-num'>0</span><span class='hs-layout'>)</span>
<a name="line-274"></a>      <span class='hs-varid'>suffs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>]</span>
<a name="line-275"></a>      <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>chr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>97</span><span class='hs-keyglyph'>..</span><span class='hs-num'>122</span><span class='hs-keyglyph'>]</span>
<a name="line-276"></a>
<a name="line-277"></a><a name="setYearSuffCollision"></a><span class='hs-definition'>setYearSuffCollision</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CiteData</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Output</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Output</span><span class='hs-keyglyph'>]</span>
<a name="line-278"></a><span class='hs-definition'>setYearSuffCollision</span> <span class='hs-varid'>b</span> <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>proc</span> <span class='hs-layout'>(</span><span class='hs-varid'>setYS</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>hasYearSuf</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>addYearSuffix</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-279"></a>    <span class='hs-keyword'>where</span>
<a name="line-280"></a>      <span class='hs-varid'>setYS</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span>
<a name="line-281"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OYearSuf</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OYearSuf</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>getCollision</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>f</span>
<a name="line-282"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>             <span class='hs-keyglyph'>=</span> <span class='hs-varid'>o</span>
<a name="line-283"></a>      <span class='hs-varid'>collide</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>disambed</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>disambYS</span>
<a name="line-284"></a>      <span class='hs-varid'>getCollision</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>find</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-varid'>k</span> <span class='hs-varop'>.</span> <span class='hs-varid'>key</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>of</span>
<a name="line-285"></a>                           <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>collide</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-conid'>[]</span>
<a name="line-286"></a>                                     <span class='hs-keyword'>then</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OStr</span> <span class='hs-layout'>(</span><span class='hs-varid'>citYear</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>emptyFormatting</span><span class='hs-keyglyph'>]</span>
<a name="line-287"></a>                                     <span class='hs-keyword'>else</span> <span class='hs-varid'>collide</span> <span class='hs-varid'>x</span>
<a name="line-288"></a>                           <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>[]</span>
<a name="line-289"></a>
<a name="line-290"></a><a name="updateYearSuffixes"></a><span class='hs-definition'>updateYearSuffixes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Output</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Output</span>
<a name="line-291"></a><span class='hs-definition'>updateYearSuffixes</span> <span class='hs-varid'>yss</span> <span class='hs-varid'>o</span>
<a name="line-292"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OYearSuf</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookup</span> <span class='hs-varid'>k</span> <span class='hs-varid'>yss</span> <span class='hs-keyword'>of</span>
<a name="line-293"></a>                             <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OYearSuf</span> <span class='hs-varid'>x</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <span class='hs-varid'>f</span>
<a name="line-294"></a>                             <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ONull</span>
<a name="line-295"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>             <span class='hs-keyglyph'>=</span> <span class='hs-varid'>o</span>
<a name="line-296"></a>
<a name="line-297"></a><a name="getYearSuffixes"></a><span class='hs-definition'>getYearSuffixes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Output</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Output</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-298"></a><span class='hs-definition'>getYearSuffixes</span> <span class='hs-varid'>o</span>
<a name="line-299"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OYearSuf</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-300"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>             <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-301"></a>
<a name="line-302"></a><a name="rmYearSuff"></a><span class='hs-definition'>rmYearSuff</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CitationGroup</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CitationGroup</span><span class='hs-keyglyph'>]</span>
<a name="line-303"></a><span class='hs-definition'>rmYearSuff</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>proc</span> <span class='hs-varid'>rmYS</span>
<a name="line-304"></a>    <span class='hs-keyword'>where</span>
<a name="line-305"></a>      <span class='hs-varid'>rmYS</span> <span class='hs-varid'>o</span>
<a name="line-306"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OYearSuf</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ONull</span>
<a name="line-307"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>o</span>
<a name="line-308"></a>
<a name="line-309"></a><span class='hs-comment'>-- List Utilities</span>
<a name="line-310"></a>
<a name="line-311"></a><a name="disambiguate"></a><span class='hs-comment'>-- | Try to disambiguate a list of lists by returning the first non</span>
<a name="line-312"></a><span class='hs-comment'>-- colliding element, if any, of each list:</span>
<a name="line-313"></a><span class='hs-comment'>--</span>
<a name="line-314"></a><span class='hs-comment'>-- &gt; disambiguate [[1,2],[1,3],[2]] = [[2],[3],[2]]</span>
<a name="line-315"></a><span class='hs-definition'>disambiguate</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-316"></a><span class='hs-definition'>disambiguate</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-317"></a><span class='hs-definition'>disambiguate</span> <span class='hs-varid'>l</span>
<a name="line-318"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span>  <span class='hs-varid'>hasMult</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>allTheSame</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>hasDuplicates</span> <span class='hs-varid'>heads</span>
<a name="line-319"></a>      <span class='hs-keyword'>then</span> <span class='hs-varid'>disambiguate</span> <span class='hs-layout'>(</span><span class='hs-varid'>rest</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-320"></a>      <span class='hs-keyword'>else</span> <span class='hs-varid'>heads</span>
<a name="line-321"></a>    <span class='hs-keyword'>where</span>
<a name="line-322"></a>      <span class='hs-varid'>heads</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>head'</span> <span class='hs-varid'>l</span>
<a name="line-323"></a>      <span class='hs-varid'>rest</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>tail_</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>head'</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>same</span> <span class='hs-varid'>heads</span><span class='hs-layout'>)</span>
<a name="line-324"></a>
<a name="line-325"></a>      <span class='hs-varid'>hasMult</span> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-326"></a>      <span class='hs-varid'>hasMult</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span> <span class='hs-varop'>||</span> <span class='hs-varid'>hasMult</span> <span class='hs-varid'>xs</span>
<a name="line-327"></a>
<a name="line-328"></a>      <span class='hs-varid'>tail_</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span>
<a name="line-329"></a>      <span class='hs-varid'>tail_</span>  <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>tail</span> <span class='hs-varid'>x</span>
<a name="line-330"></a>
<a name="line-331"></a><a name="same"></a><span class='hs-comment'>-- | For each element a list of 'Bool': 'True' if the element has a</span>
<a name="line-332"></a><span class='hs-comment'>-- duplicate in the list:</span>
<a name="line-333"></a><span class='hs-comment'>--</span>
<a name="line-334"></a><span class='hs-comment'>-- &gt; same [1,2,1] = [True,False,True]</span>
<a name="line-335"></a><span class='hs-definition'>same</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Bool</span><span class='hs-keyglyph'>]</span>
<a name="line-336"></a><span class='hs-definition'>same</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-337"></a><span class='hs-definition'>same</span> <span class='hs-varid'>l</span>
<a name="line-338"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-varid'>elem</span> <span class='hs-varid'>dupl</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span>
<a name="line-339"></a>    <span class='hs-keyword'>where</span>
<a name="line-340"></a>      <span class='hs-varid'>dupl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>catMaybes</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>.</span> <span class='hs-varid'>macc</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>$</span> <span class='hs-varid'>l</span>
<a name="line-341"></a>      <span class='hs-varid'>macc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapAccumL</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>a</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-342"></a>
<a name="line-343"></a><a name="hasDuplicates"></a><span class='hs-definition'>hasDuplicates</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-344"></a><span class='hs-definition'>hasDuplicates</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>or</span> <span class='hs-varop'>.</span> <span class='hs-varid'>same</span>
<a name="line-345"></a>
<a name="line-346"></a><a name="allTheSame"></a><span class='hs-definition'>allTheSame</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-347"></a><span class='hs-definition'>allTheSame</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>and</span> <span class='hs-varop'>.</span> <span class='hs-varid'>same</span>
</pre></body>
</html>