Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > db7a4a658d190b3e658423135710c498 > files > 1048

ghc-darcs-devel-2.8.3-1.fc18.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/Darcs/Patch/Match.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>--  Copyright (C) 2004 David Roundy</span>
<a name="line-2"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><span class='hs-comment'>--  This program is free software; you can redistribute it and/or modify</span>
<a name="line-4"></a><span class='hs-comment'>--  it under the terms of the GNU General Public License as published by</span>
<a name="line-5"></a><span class='hs-comment'>--  the Free Software Foundation; either version 2, or (at your option)</span>
<a name="line-6"></a><span class='hs-comment'>--  any later version.</span>
<a name="line-7"></a><span class='hs-comment'>--</span>
<a name="line-8"></a><span class='hs-comment'>--  This program is distributed in the hope that it will be useful,</span>
<a name="line-9"></a><span class='hs-comment'>--  but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="line-10"></a><span class='hs-comment'>--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="line-11"></a><span class='hs-comment'>--  GNU General Public License for more details.</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>--  You should have received a copy of the GNU General Public License</span>
<a name="line-14"></a><span class='hs-comment'>--  along with this program; see the file COPYING.  If not, write to</span>
<a name="line-15"></a><span class='hs-comment'>--  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span>
<a name="line-16"></a><span class='hs-comment'>--  Boston, MA 02110-1301, USA.</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='hs-cpp'>#include "gadts.h"</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span><span class='hs-varop'>.</span><span class='hs-conid'>Match</span> <span class='hs-layout'>(</span> <span class='hs-conid'>PatchMatch</span><span class='hs-layout'>,</span> <span class='hs-conid'>Matcher</span><span class='hs-layout'>,</span> <span class='hs-conid'>MatchFun</span><span class='hs-layout'>,</span>
<a name="line-21"></a>                    <span class='hs-varid'>patchMatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>matchPattern</span><span class='hs-layout'>,</span>
<a name="line-22"></a>                    <span class='hs-varid'>applyMatcher</span><span class='hs-layout'>,</span> <span class='hs-varid'>makeMatcher</span><span class='hs-layout'>,</span>
<a name="line-23"></a>                    <span class='hs-varid'>parseMatch</span><span class='hs-layout'>,</span>
<a name="line-24"></a>                    <span class='hs-varid'>matchParser</span><span class='hs-layout'>,</span> <span class='hs-varid'>helpOnMatchers</span><span class='hs-layout'>,</span>
<a name="line-25"></a>                  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>ParserCombinators</span><span class='hs-varop'>.</span><span class='hs-conid'>Parsec</span>
<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'>ParserCombinators</span><span class='hs-varop'>.</span><span class='hs-conid'>Parsec</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</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'>Regex</span> <span class='hs-layout'>(</span> <span class='hs-varid'>mkRegex</span><span class='hs-layout'>,</span> <span class='hs-varid'>matchRegex</span> <span class='hs-layout'>)</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Unsafe</span> <span class='hs-layout'>(</span> <span class='hs-varid'>unsafePerformIO</span> <span class='hs-layout'>)</span>
<a name="line-32"></a>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span><span class='hs-varop'>.</span><span class='hs-conid'>PatchInfoAnd</span> <span class='hs-layout'>(</span> <span class='hs-conid'>PatchInfoAnd</span><span class='hs-layout'>,</span> <span class='hs-varid'>hopefully</span><span class='hs-layout'>,</span> <span class='hs-varid'>info</span> <span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Patchy</span><span class='hs-layout'>,</span> <span class='hs-varid'>hunkMatches</span><span class='hs-layout'>,</span> <span class='hs-varid'>listTouchedFiles</span><span class='hs-layout'>,</span> <span class='hs-varid'>patchcontents</span> <span class='hs-layout'>)</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span><span class='hs-varop'>.</span><span class='hs-conid'>Info</span> <span class='hs-layout'>(</span> <span class='hs-varid'>justName</span><span class='hs-layout'>,</span> <span class='hs-varid'>justAuthor</span><span class='hs-layout'>,</span> <span class='hs-varid'>justLog</span><span class='hs-layout'>,</span> <span class='hs-varid'>makeFilename</span><span class='hs-layout'>,</span>
<a name="line-36"></a>                          <span class='hs-varid'>piDate</span> <span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Witnesses</span><span class='hs-varop'>.</span><span class='hs-conid'>Sealed</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Sealed2</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>seal2</span> <span class='hs-layout'>)</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DateMatcher</span> <span class='hs-layout'>(</span> <span class='hs-varid'>parseDateMatcher</span> <span class='hs-layout'>)</span>
<a name="line-39"></a>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span><span class='hs-varop'>.</span><span class='hs-conid'>MatchData</span> <span class='hs-layout'>(</span> <span class='hs-conid'>PatchMatch</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>patchMatch</span> <span class='hs-layout'>)</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Char8</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>BC</span>
<a name="line-42"></a>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span><span class='hs-varop'>.</span><span class='hs-conid'>Dummy</span> <span class='hs-layout'>(</span> <span class='hs-conid'>DummyPatch</span> <span class='hs-layout'>)</span>
<a name="line-44"></a>
<a name="line-45"></a><a name="MatchFun"></a><span class='hs-comment'>-- | A type for predicates over patches which do not care about</span>
<a name="line-46"></a><a name="MatchFun"></a><span class='hs-comment'>-- contexts</span>
<a name="line-47"></a><a name="MatchFun"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Sealed2</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchInfoAnd</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="Matcher"></a><span class='hs-comment'>-- | A @Matcher@ is made of a 'MatchFun' which we will use to match</span>
<a name="line-50"></a><a name="Matcher"></a><span class='hs-comment'>-- patches and a @String@ representing it.</span>
<a name="line-51"></a><a name="Matcher"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MATCH</span> <span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="instance%20Show%20(Matcher%20p)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-54"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>MATCH</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-chr'>'"'</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span> <span class='hs-varop'>++</span> <span class='hs-str'>"\""</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="makeMatcher"></a><span class='hs-definition'>makeMatcher</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchInfoAnd</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span>
<a name="line-57"></a><span class='hs-definition'>makeMatcher</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MATCH</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="applyMatcher"></a><span class='hs-comment'>-- | @applyMatcher@ applies a matcher to a patch.</span>
<a name="line-60"></a><span class='hs-definition'>applyMatcher</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchInfoAnd</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-61"></a><span class='hs-definition'>applyMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>MATCH</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>m</span> <span class='hs-varop'>.</span> <span class='hs-varid'>seal2</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="parseMatch"></a><span class='hs-definition'>parseMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>PatchMatch</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-64"></a><span class='hs-definition'>parseMatch</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatternMatch</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-65"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>parse</span> <span class='hs-varid'>matchParser</span> <span class='hs-str'>"match"</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>of</span>
<a name="line-66"></a>    <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Left</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Invalid -"</span><span class='hs-varop'>++</span><span class='hs-str'>"-match pattern '"</span><span class='hs-varop'>++</span><span class='hs-varid'>s</span><span class='hs-varop'>++</span>
<a name="line-67"></a>                <span class='hs-str'>"'.\n"</span><span class='hs-varop'>++</span> <span class='hs-varid'>unlines</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-str'>"    "</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>lines</span> <span class='hs-varop'>$</span> <span class='hs-varid'>show</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- indent</span>
<a name="line-68"></a>    <span class='hs-conid'>Right</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Right</span> <span class='hs-varid'>m</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="matchPattern"></a><span class='hs-definition'>matchPattern</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>PatchMatch</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span>
<a name="line-71"></a><span class='hs-definition'>matchPattern</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PatternMatch</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-72"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>parseMatch</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>of</span>
<a name="line-73"></a>    <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-varid'>err</span>
<a name="line-74"></a>    <span class='hs-conid'>Right</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>makeMatcher</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span>
<a name="line-75"></a>
<a name="line-76"></a><a name="trivial"></a><span class='hs-definition'>trivial</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span>
<a name="line-77"></a><span class='hs-definition'>trivial</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>const</span> <span class='hs-conid'>True</span>
<a name="line-78"></a>
<a name="line-79"></a><a name="matchParser"></a><span class='hs-definition'>matchParser</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>CharParser</span> <span class='hs-varid'>st</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-80"></a><span class='hs-definition'>matchParser</span> <span class='hs-keyglyph'>=</span>  <span class='hs-keyword'>do</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>option</span> <span class='hs-varid'>trivial</span> <span class='hs-varid'>submatch</span>
<a name="line-81"></a>                  <span class='hs-varid'>eof</span>
<a name="line-82"></a>                  <span class='hs-varid'>return</span> <span class='hs-varid'>m</span>
<a name="line-83"></a>
<a name="line-84"></a><a name="submatch"></a><span class='hs-definition'>submatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>CharParser</span> <span class='hs-varid'>st</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-85"></a><span class='hs-definition'>submatch</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>buildExpressionParser</span> <span class='hs-varid'>table</span> <span class='hs-varid'>match</span> <span class='hs-varop'>&lt;?&gt;</span> <span class='hs-str'>"match rule"</span>
<a name="line-86"></a>
<a name="line-87"></a><a name="table"></a><span class='hs-definition'>table</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OperatorTable</span> <span class='hs-conid'>Char</span> <span class='hs-varid'>st</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-88"></a><span class='hs-definition'>table</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>prefix</span> <span class='hs-str'>"not"</span> <span class='hs-varid'>negate_match</span><span class='hs-layout'>,</span>
<a name="line-89"></a>             <span class='hs-varid'>prefix</span> <span class='hs-str'>"!"</span> <span class='hs-varid'>negate_match</span> <span class='hs-keyglyph'>]</span>
<a name="line-90"></a>          <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>binary</span> <span class='hs-str'>"||"</span> <span class='hs-varid'>or_match</span><span class='hs-layout'>,</span>
<a name="line-91"></a>             <span class='hs-varid'>binary</span> <span class='hs-str'>"or"</span> <span class='hs-varid'>or_match</span><span class='hs-layout'>,</span>
<a name="line-92"></a>             <span class='hs-varid'>binary</span> <span class='hs-str'>"&amp;&amp;"</span> <span class='hs-varid'>and_match</span><span class='hs-layout'>,</span>
<a name="line-93"></a>            <span class='hs-varid'>binary</span> <span class='hs-str'>"and"</span> <span class='hs-varid'>and_match</span> <span class='hs-keyglyph'>]</span>
<a name="line-94"></a>          <span class='hs-keyglyph'>]</span>
<a name="line-95"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>binary</span> <span class='hs-varid'>name</span> <span class='hs-varid'>fun</span> <span class='hs-keyglyph'>=</span>
<a name="line-96"></a>              <span class='hs-conid'>Infix</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>trystring</span> <span class='hs-varid'>name</span>
<a name="line-97"></a>                        <span class='hs-varid'>spaces</span>
<a name="line-98"></a>                        <span class='hs-varid'>return</span> <span class='hs-varid'>fun</span><span class='hs-layout'>)</span> <span class='hs-conid'>AssocLeft</span>
<a name="line-99"></a>          <span class='hs-varid'>prefix</span>  <span class='hs-varid'>name</span> <span class='hs-varid'>fun</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Prefix</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>trystring</span> <span class='hs-varid'>name</span>
<a name="line-100"></a>                                         <span class='hs-varid'>spaces</span>
<a name="line-101"></a>                                         <span class='hs-varid'>return</span> <span class='hs-varid'>fun</span>
<a name="line-102"></a>          <span class='hs-varid'>negate_match</span> <span class='hs-varid'>a</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-103"></a>          <span class='hs-varid'>or_match</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>m1</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-layout'>(</span><span class='hs-varid'>m2</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-104"></a>          <span class='hs-varid'>and_match</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>m1</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-layout'>(</span><span class='hs-varid'>m2</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-105"></a>
<a name="line-106"></a><a name="trystring"></a><span class='hs-definition'>trystring</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CharParser</span> <span class='hs-varid'>st</span> <span class='hs-conid'>String</span>
<a name="line-107"></a><span class='hs-definition'>trystring</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>try</span> <span class='hs-varop'>$</span> <span class='hs-varid'>string</span> <span class='hs-varid'>s</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="match"></a><span class='hs-definition'>match</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>CharParser</span> <span class='hs-varid'>st</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-110"></a><span class='hs-definition'>match</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>between</span> <span class='hs-varid'>spaces</span> <span class='hs-varid'>spaces</span>
<a name="line-111"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>parens</span> <span class='hs-varid'>submatch</span>
<a name="line-112"></a>         <span class='hs-varop'>&lt;|&gt;</span> <span class='hs-varid'>choice</span> <span class='hs-varid'>matchers_</span>
<a name="line-113"></a>         <span class='hs-varop'>&lt;?&gt;</span> <span class='hs-str'>"simple match"</span><span class='hs-layout'>)</span>
<a name="line-114"></a>        <span class='hs-keyword'>where</span> <span class='hs-varid'>matchers_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>createMatchHelper</span> <span class='hs-varid'>primitiveMatchers</span>
<a name="line-115"></a>
<a name="line-116"></a>
<a name="line-117"></a><a name="createMatchHelper"></a><span class='hs-definition'>createMatchHelper</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-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-118"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CharParser</span> <span class='hs-varid'>st</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-119"></a><span class='hs-definition'>createMatchHelper</span> <span class='hs-layout'>(</span><span class='hs-varid'>key</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>matcher</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-120"></a>  <span class='hs-keyword'>do</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>trystring</span> <span class='hs-varid'>key</span>
<a name="line-121"></a>     <span class='hs-varid'>spaces</span>
<a name="line-122"></a>     <span class='hs-varid'>q</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>quoted</span>
<a name="line-123"></a>     <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>matcher</span> <span class='hs-varid'>q</span>
<a name="line-124"></a>
<a name="line-125"></a><a name="helpOnMatchers"></a><span class='hs-comment'>-- FIXME: would this be better defined in Darcs.Commands.Help?</span>
<a name="line-126"></a><span class='hs-comment'>-- | The string that is emitted when the user runs @darcs help --match@.</span>
<a name="line-127"></a><span class='hs-definition'>helpOnMatchers</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>
<a name="line-128"></a><span class='hs-definition'>helpOnMatchers</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unlines</span> <span class='hs-varop'>$</span>
<a name="line-129"></a>  <span class='hs-keyglyph'>[</span><span class='hs-str'>"Selecting Patches:"</span><span class='hs-layout'>,</span>
<a name="line-130"></a>   <span class='hs-str'>""</span><span class='hs-layout'>,</span>
<a name="line-131"></a>   <span class='hs-str'>"The --patches option yields patches with names matching an `extended'"</span><span class='hs-layout'>,</span>
<a name="line-132"></a>   <span class='hs-str'>"regular expression.  See regex(7) for details.  The --matches option"</span><span class='hs-layout'>,</span>
<a name="line-133"></a>   <span class='hs-str'>"yields patches that match a logical (Boolean) expression: one or more"</span><span class='hs-layout'>,</span>
<a name="line-134"></a>   <span class='hs-str'>"primitive expressions combined by grouping (parentheses) and the"</span><span class='hs-layout'>,</span>
<a name="line-135"></a>   <span class='hs-str'>"complement (not), conjunction (and) and disjunction (or) operators."</span><span class='hs-layout'>,</span>
<a name="line-136"></a>   <span class='hs-str'>"The C notation for logic operators (!, &amp;&amp; and ||) can also be used."</span><span class='hs-layout'>,</span>
<a name="line-137"></a>   <span class='hs-str'>""</span><span class='hs-layout'>,</span>
<a name="line-138"></a>   <span class='hs-str'>" --patches=regex is a synonym for --matches='name regex'"</span><span class='hs-layout'>,</span>
<a name="line-139"></a>   <span class='hs-str'>" --from-patch and --to-patch are synonyms for --from-match='name... and --to-match='name..."</span><span class='hs-layout'>,</span>
<a name="line-140"></a>   <span class='hs-str'>" --from-patch and --to-match can be unproblematically combined:"</span><span class='hs-layout'>,</span>
<a name="line-141"></a>   <span class='hs-str'>" darcs changes --from-patch='html.*documentation' --to-match='date 20040212'"</span><span class='hs-layout'>,</span>
<a name="line-142"></a>   <span class='hs-str'>""</span><span class='hs-layout'>,</span>
<a name="line-143"></a>   <span class='hs-str'>"The following primitive Boolean expressions are supported:"</span><span class='hs-keyglyph'>]</span>
<a name="line-144"></a>  <span class='hs-varop'>++</span> <span class='hs-varid'>keywords</span>
<a name="line-145"></a>  <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>""</span><span class='hs-layout'>,</span> <span class='hs-str'>"Here are some examples:"</span><span class='hs-keyglyph'>]</span>
<a name="line-146"></a>  <span class='hs-varop'>++</span> <span class='hs-varid'>examples</span>
<a name="line-147"></a>  <span class='hs-keyword'>where</span> <span class='hs-comment'>-- This type signature exists to appease GHC.</span>
<a name="line-148"></a>        <span class='hs-varid'>ps</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-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MatchFun</span> <span class='hs-conid'>DummyPatch</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-149"></a>        <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>primitiveMatchers</span>
<a name="line-150"></a>        <span class='hs-varid'>keywords</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>showKeyword</span> <span class='hs-varid'>k</span> <span class='hs-varid'>d</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'>d</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ps</span><span class='hs-keyglyph'>]</span>
<a name="line-151"></a>        <span class='hs-varid'>examples</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>showExample</span> <span class='hs-varid'>k</span> <span class='hs-varid'>e</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'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>es</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ps</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>es</span><span class='hs-keyglyph'>]</span>
<a name="line-152"></a>        <span class='hs-varid'>showKeyword</span> <span class='hs-varid'>keyword</span> <span class='hs-varid'>description</span> <span class='hs-keyglyph'>=</span>
<a name="line-153"></a>            <span class='hs-comment'>-- FIXME: it would be nice to have a variable name here:</span>
<a name="line-154"></a>            <span class='hs-comment'>-- "author REGEX - match against author (email address)"</span>
<a name="line-155"></a>            <span class='hs-comment'>-- or "exact STRING - match against exact patch name".</span>
<a name="line-156"></a>            <span class='hs-str'>"  "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>keyword</span> <span class='hs-varop'>++</span> <span class='hs-str'>" - "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>description</span> <span class='hs-varop'>++</span> <span class='hs-str'>"."</span>
<a name="line-157"></a>        <span class='hs-varid'>showExample</span> <span class='hs-varid'>keyword</span> <span class='hs-varid'>example</span> <span class='hs-keyglyph'>=</span>
<a name="line-158"></a>            <span class='hs-comment'>-- FIXME: this string is long, and its not a use case I've</span>
<a name="line-159"></a>            <span class='hs-comment'>-- ever seen in practice.  Can we use something else,</span>
<a name="line-160"></a>            <span class='hs-comment'>-- like "darcs changes --matches"? --twb, 2008-12-28</span>
<a name="line-161"></a>            <span class='hs-str'>"  darcs annotate --summary --match "</span>
<a name="line-162"></a>            <span class='hs-varop'>++</span> <span class='hs-str'>"'"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>keyword</span> <span class='hs-varop'>++</span> <span class='hs-str'>" "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>example</span> <span class='hs-varop'>++</span> <span class='hs-str'>"'"</span>
<a name="line-163"></a>
<a name="line-164"></a><a name="primitiveMatchers"></a><span class='hs-definition'>primitiveMatchers</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</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><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-165"></a>                     <span class='hs-comment'>-- ^ keyword (operator), help description, list</span>
<a name="line-166"></a>                     <span class='hs-comment'>-- of examples, matcher function</span>
<a name="line-167"></a><span class='hs-definition'>primitiveMatchers</span> <span class='hs-keyglyph'>=</span>
<a name="line-168"></a> <span class='hs-keyglyph'>[</span> <span class='hs-layout'>(</span><span class='hs-str'>"exact"</span><span class='hs-layout'>,</span> <span class='hs-str'>"check a literal string against the patch name"</span>
<a name="line-169"></a>           <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"\"Resolve issue17: use dynamic memory allocation.\""</span><span class='hs-keyglyph'>]</span>
<a name="line-170"></a>           <span class='hs-layout'>,</span> <span class='hs-varid'>exactmatch</span> <span class='hs-layout'>)</span>
<a name="line-171"></a> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-str'>"name"</span><span class='hs-layout'>,</span> <span class='hs-str'>"check a regular expression against the patch name"</span>
<a name="line-172"></a>          <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"issue17"</span><span class='hs-layout'>,</span> <span class='hs-str'>"\"^[Rr]esolve issue17\\&gt;\""</span><span class='hs-keyglyph'>]</span>
<a name="line-173"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>mymatch</span> <span class='hs-layout'>)</span>
<a name="line-174"></a> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-str'>"author"</span><span class='hs-layout'>,</span> <span class='hs-str'>"check a regular expression against the author name"</span>
<a name="line-175"></a>            <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"\"David Roundy\""</span><span class='hs-layout'>,</span> <span class='hs-str'>"droundy"</span><span class='hs-layout'>,</span> <span class='hs-str'>"droundy@darcs.net"</span><span class='hs-keyglyph'>]</span>
<a name="line-176"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>authormatch</span> <span class='hs-layout'>)</span>
<a name="line-177"></a> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-str'>"hunk"</span><span class='hs-layout'>,</span> <span class='hs-str'>"check a regular expression against the contents of a hunk patch"</span>
<a name="line-178"></a>            <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"\"foo = 2\""</span><span class='hs-layout'>,</span> <span class='hs-str'>"\"^instance .* Foo where$\""</span><span class='hs-keyglyph'>]</span>
<a name="line-179"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>hunkmatch</span> <span class='hs-layout'>)</span>
<a name="line-180"></a> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-str'>"comment"</span><span class='hs-layout'>,</span> <span class='hs-str'>"check a regular expression against the log message"</span>
<a name="line-181"></a>         <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"\"prevent deadlocks\""</span><span class='hs-keyglyph'>]</span>
<a name="line-182"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>logmatch</span> <span class='hs-layout'>)</span>
<a name="line-183"></a> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-str'>"hash"</span><span class='hs-layout'>,</span>  <span class='hs-str'>"match the darcs hash for a patch"</span>
<a name="line-184"></a>          <span class='hs-layout'>,</span>  <span class='hs-keyglyph'>[</span><span class='hs-str'>"20040403105958-53a90-c719567e92c3b0ab9eddd5290b705712b8b918ef"</span><span class='hs-keyglyph'>]</span>
<a name="line-185"></a>          <span class='hs-layout'>,</span>  <span class='hs-varid'>hashmatch</span> <span class='hs-layout'>)</span>
<a name="line-186"></a> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-str'>"date"</span><span class='hs-layout'>,</span> <span class='hs-str'>"match the patch date"</span>
<a name="line-187"></a>          <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"\"2006-04-02 22:41\""</span><span class='hs-layout'>,</span> <span class='hs-str'>"\"tea time yesterday\""</span><span class='hs-keyglyph'>]</span>
<a name="line-188"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>datematch</span> <span class='hs-layout'>)</span>
<a name="line-189"></a> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-str'>"touch"</span><span class='hs-layout'>,</span> <span class='hs-str'>"match file paths for a patch"</span>
<a name="line-190"></a>          <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"src/foo.c"</span><span class='hs-layout'>,</span> <span class='hs-str'>"src/"</span><span class='hs-layout'>,</span> <span class='hs-str'>"\"src/*.(c|h)\""</span><span class='hs-keyglyph'>]</span>
<a name="line-191"></a>          <span class='hs-layout'>,</span> <span class='hs-varid'>touchmatch</span> <span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>
<a name="line-192"></a>
<a name="line-193"></a><a name="parens"></a><span class='hs-definition'>parens</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CharParser</span> <span class='hs-varid'>st</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-194"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CharParser</span> <span class='hs-varid'>st</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-195"></a><span class='hs-definition'>parens</span> <span class='hs-varid'>p</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>between</span> <span class='hs-layout'>(</span><span class='hs-varid'>string</span> <span class='hs-str'>"("</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>string</span> <span class='hs-str'>")"</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span>
<a name="line-196"></a>
<a name="line-197"></a><a name="quoted"></a><span class='hs-definition'>quoted</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CharParser</span> <span class='hs-varid'>st</span> <span class='hs-conid'>String</span>
<a name="line-198"></a><span class='hs-definition'>quoted</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>between</span> <span class='hs-layout'>(</span><span class='hs-varid'>char</span> <span class='hs-chr'>'"'</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>char</span> <span class='hs-chr'>'"'</span><span class='hs-layout'>)</span>
<a name="line-199"></a>                 <span class='hs-layout'>(</span><span class='hs-varid'>many</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'\\'</span> <span class='hs-comment'>-- allow escapes</span>
<a name="line-200"></a>                            <span class='hs-layout'>;</span> <span class='hs-varid'>try</span> <span class='hs-layout'>(</span><span class='hs-varid'>oneOf</span> <span class='hs-keyglyph'>[</span><span class='hs-chr'>'\\'</span><span class='hs-layout'>,</span> <span class='hs-chr'>'"'</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;|&gt;</span> <span class='hs-varid'>return</span> <span class='hs-chr'>'\\'</span>
<a name="line-201"></a>                            <span class='hs-layout'>}</span>
<a name="line-202"></a>                         <span class='hs-varop'>&lt;|&gt;</span>  <span class='hs-varid'>noneOf</span> <span class='hs-keyglyph'>[</span><span class='hs-chr'>'"'</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-203"></a>         <span class='hs-varop'>&lt;|&gt;</span> <span class='hs-varid'>between</span> <span class='hs-varid'>spaces</span> <span class='hs-varid'>spaces</span> <span class='hs-layout'>(</span><span class='hs-varid'>many</span> <span class='hs-varop'>$</span> <span class='hs-varid'>noneOf</span> <span class='hs-str'>" ()"</span><span class='hs-layout'>)</span>
<a name="line-204"></a>         <span class='hs-varop'>&lt;?&gt;</span> <span class='hs-str'>"string"</span>
<a name="line-205"></a>
<a name="line-206"></a><a name="mymatch"></a><span class='hs-definition'>mymatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>exactmatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>authormatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>hunkmatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>hashmatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>datematch</span><span class='hs-layout'>,</span> <span class='hs-varid'>touchmatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span>
<a name="line-207"></a>
<a name="line-208"></a><span class='hs-definition'>mymatch</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>matchRegex</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkRegex</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>justName</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span>
<a name="line-209"></a>
<a name="line-210"></a><a name="exactmatch"></a><span class='hs-definition'>exactmatch</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>justName</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-211"></a>
<a name="line-212"></a><a name="authormatch"></a><span class='hs-definition'>authormatch</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>matchRegex</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkRegex</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>justAuthor</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span>
<a name="line-213"></a>
<a name="line-214"></a><a name="logmatch"></a><span class='hs-definition'>logmatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MatchFun</span> <span class='hs-varid'>p</span>
<a name="line-215"></a><span class='hs-definition'>logmatch</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>matchRegex</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkRegex</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>justLog</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span>
<a name="line-216"></a>
<a name="line-217"></a><a name="hunkmatch"></a><span class='hs-definition'>hunkmatch</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>patch</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>patchcontents</span> <span class='hs-varop'>$</span> <span class='hs-varid'>hopefully</span> <span class='hs-varid'>hp</span>
<a name="line-218"></a>                               <span class='hs-varid'>regexMatcher</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-varid'>matchRegex</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkRegex</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span><span class='hs-layout'>)</span>
<a name="line-219"></a>                           <span class='hs-keyword'>in</span> <span class='hs-varid'>hunkMatches</span> <span class='hs-varid'>regexMatcher</span> <span class='hs-varid'>patch</span>
<a name="line-220"></a>
<a name="line-221"></a><a name="hashmatch"></a><span class='hs-definition'>hashmatch</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>rh</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeFilename</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyword'>in</span>
<a name="line-222"></a>                                  <span class='hs-layout'>(</span><span class='hs-varid'>rh</span> <span class='hs-varop'>==</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-layout'>(</span><span class='hs-varid'>rh</span> <span class='hs-varop'>==</span> <span class='hs-varid'>h</span><span class='hs-varop'>++</span><span class='hs-str'>".gz"</span><span class='hs-layout'>)</span>
<a name="line-223"></a>
<a name="line-224"></a><a name="datematch"></a><span class='hs-definition'>datematch</span> <span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>dm</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafePerformIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>parseDateMatcher</span> <span class='hs-varid'>d</span>
<a name="line-225"></a>                                  <span class='hs-keyword'>in</span> <span class='hs-varid'>dm</span> <span class='hs-varop'>$</span> <span class='hs-varid'>piDate</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span>
<a name="line-226"></a>
<a name="line-227"></a><a name="touchmatch"></a><span class='hs-definition'>touchmatch</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>files</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>listTouchedFiles</span> <span class='hs-varop'>$</span> <span class='hs-varid'>patchcontents</span> <span class='hs-varop'>$</span> <span class='hs-varid'>hopefully</span> <span class='hs-varid'>hp</span>
<a name="line-228"></a>                            <span class='hs-keyword'>in</span> <span class='hs-varid'>or</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>isJust</span> <span class='hs-varop'>.</span> <span class='hs-varid'>matchRegex</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkRegex</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>files</span>
</pre></body>
</html>