Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > a0995fd4c38add851d8e9994a3499e40 > files > 668

ghc-darcs-devel-2.4.4-3.fc14.x86_64.rpm

<!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/Darcs/Match.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%  Copyright (C) 2004-2005 David Roundy
%
%  This program is free software; you can redistribute it and/or modify
%  it under the terms of the GNU General Public License as published by
%  the Free Software Foundation; either version 2, or (at your option)
%  any later version.
%
%  This program is distributed in the hope that it will be useful,
%  but WITHOUT ANY WARRANTY; without even the implied warranty of
%  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%  GNU General Public License for more details.
%
%  You should have received a copy of the GNU General Public License
%  along with this program; see the file COPYING.  If not, write to
%  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
%  Boston, MA 02110-1301, USA.

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS_GHC -cpp -fglasgow-exts #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# LANGUAGE CPP, ScopedTypeVariables, MultiParamTypeClasses, FlexibleInstances, Rank2Types #-}</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-cpp'>#include "gadts.h"</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Match</span> <span class='hs-layout'>(</span> <span class='hs-varid'>matchFirstPatchset</span><span class='hs-layout'>,</span> <span class='hs-varid'>matchSecondPatchset</span><span class='hs-layout'>,</span>
<a name="line-7"></a>               <span class='hs-varid'>matchPatch</span><span class='hs-layout'>,</span>
<a name="line-8"></a>               <span class='hs-varid'>matchAPatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>matchAPatchread</span><span class='hs-layout'>,</span>
<a name="line-9"></a>               <span class='hs-varid'>getFirstMatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>getNonrangeMatch</span><span class='hs-layout'>,</span>
<a name="line-10"></a>               <span class='hs-varid'>getPartialFirstMatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>getPartialSecondMatch</span><span class='hs-layout'>,</span>
<a name="line-11"></a>               <span class='hs-varid'>getPartialNonrangeMatch</span><span class='hs-layout'>,</span>
<a name="line-12"></a>               <span class='hs-varid'>firstMatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>secondMatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>haveNonrangeMatch</span><span class='hs-layout'>,</span>
<a name="line-13"></a>               <span class='hs-varid'>havePatchsetMatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>getOnePatchset</span><span class='hs-layout'>,</span>
<a name="line-14"></a>               <span class='hs-varid'>checkMatchSyntax</span><span class='hs-layout'>,</span> <span class='hs-varid'>applyInvToMatcher</span><span class='hs-layout'>,</span> <span class='hs-varid'>nonrangeMatcher</span><span class='hs-layout'>,</span>
<a name="line-15"></a>               <span class='hs-conid'>InclusiveOrExclusive</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'>matchExists</span>
<a name="line-16"></a>             <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-17"></a>
<a name="line-18"></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-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span> <span class='hs-varid'>when</span><span class='hs-layout'>,</span> <span class='hs-varid'>unless</span> <span class='hs-layout'>)</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>)</span>
<a name="line-21"></a>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Hopefully</span> <span class='hs-layout'>(</span> <span class='hs-conid'>PatchInfoAnd</span><span class='hs-layout'>,</span> <span class='hs-varid'>info</span><span class='hs-layout'>,</span> <span class='hs-varid'>piap</span><span class='hs-layout'>,</span>
<a name="line-23"></a>                         <span class='hs-varid'>conscientiously</span><span class='hs-layout'>,</span> <span class='hs-varid'>hopefully</span> <span class='hs-layout'>)</span>
<a name="line-24"></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'>just_name</span> <span class='hs-layout'>)</span>
<a name="line-25"></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'>RepoPatch</span><span class='hs-layout'>,</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-conid'>Named</span><span class='hs-layout'>,</span> <span class='hs-varid'>invert</span><span class='hs-layout'>,</span> <span class='hs-varid'>invertRL</span><span class='hs-layout'>,</span> <span class='hs-varid'>patch2patchinfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>apply</span> <span class='hs-layout'>)</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Repository</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Repository</span><span class='hs-layout'>,</span> <span class='hs-conid'>PatchSet</span><span class='hs-layout'>,</span> <span class='hs-conid'>SealedPatchSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>read_repo</span><span class='hs-layout'>,</span>
<a name="line-27"></a>                    <span class='hs-varid'>slurp_recorded</span><span class='hs-layout'>,</span> <span class='hs-varid'>createPristineDirectoryTree</span> <span class='hs-layout'>)</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Repository</span><span class='hs-varop'>.</span><span class='hs-conid'>ApplyPatches</span> <span class='hs-layout'>(</span> <span class='hs-varid'>apply_patches</span> <span class='hs-layout'>)</span>
<a name="line-29"></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'>Depends</span> <span class='hs-layout'>(</span> <span class='hs-varid'>get_patches_in_tag</span><span class='hs-layout'>,</span> <span class='hs-varid'>get_patches_beyond_tag</span> <span class='hs-layout'>)</span>
<a name="line-30"></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'>Ordered</span> <span class='hs-layout'>(</span> <span class='hs-conid'>RL</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'>concatRL</span><span class='hs-layout'>,</span> <span class='hs-varid'>consRLSealed</span> <span class='hs-layout'>)</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ByteStringUtils</span> <span class='hs-layout'>(</span> <span class='hs-varid'>mmapFilePS</span> <span class='hs-layout'>)</span>
<a name="line-33"></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-keyword'>as</span> <span class='hs-conid'>B</span> <span class='hs-layout'>(</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span>
<a name="line-34"></a>
<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'>Flags</span> <span class='hs-layout'>(</span> <span class='hs-conid'>DarcsFlag</span><span class='hs-layout'>(</span> <span class='hs-conid'>OnePatch</span><span class='hs-layout'>,</span> <span class='hs-conid'>SeveralPatch</span><span class='hs-layout'>,</span> <span class='hs-conid'>Context</span><span class='hs-layout'>,</span>
<a name="line-36"></a>                               <span class='hs-conid'>AfterPatch</span><span class='hs-layout'>,</span> <span class='hs-conid'>UpToPatch</span><span class='hs-layout'>,</span> <span class='hs-conid'>LastN</span><span class='hs-layout'>,</span> <span class='hs-conid'>PatchIndexRange</span><span class='hs-layout'>,</span>
<a name="line-37"></a>                               <span class='hs-conid'>OneTag</span><span class='hs-layout'>,</span> <span class='hs-conid'>AfterTag</span><span class='hs-layout'>,</span> <span class='hs-conid'>UpToTag</span><span class='hs-layout'>,</span>
<a name="line-38"></a>                               <span class='hs-conid'>OnePattern</span><span class='hs-layout'>,</span> <span class='hs-conid'>SeveralPattern</span><span class='hs-layout'>,</span>
<a name="line-39"></a>                               <span class='hs-conid'>AfterPattern</span><span class='hs-layout'>,</span> <span class='hs-conid'>UpToPattern</span> <span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>willStoreInMemory</span> <span class='hs-layout'>)</span>
<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'>Bundle</span> <span class='hs-layout'>(</span> <span class='hs-varid'>scan_context</span> <span class='hs-layout'>)</span>
<a name="line-41"></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'>Match</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> <span class='hs-varid'>match_pattern</span><span class='hs-layout'>,</span> <span class='hs-varid'>apply_matcher</span><span class='hs-layout'>,</span> <span class='hs-varid'>make_matcher</span><span class='hs-layout'>,</span> <span class='hs-varid'>parseMatch</span> <span class='hs-layout'>)</span>
<a name="line-42"></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>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Printer</span> <span class='hs-layout'>(</span> <span class='hs-varid'>text</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>RepoPath</span> <span class='hs-layout'>(</span> <span class='hs-varid'>toFilePath</span> <span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span> <span class='hs-layout'>(</span> <span class='hs-conid'>WriteableDirectory</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>ReadableDirectory</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>SlurpDirectory</span> <span class='hs-layout'>(</span> <span class='hs-conid'>SlurpMonad</span><span class='hs-layout'>,</span> <span class='hs-varid'>writeSlurpy</span><span class='hs-layout'>,</span> <span class='hs-varid'>withSlurpy</span> <span class='hs-layout'>)</span>
<a name="line-48"></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'>FileName</span> <span class='hs-layout'>(</span> <span class='hs-conid'>FileName</span><span class='hs-layout'>,</span> <span class='hs-varid'>superName</span><span class='hs-layout'>,</span> <span class='hs-varid'>norm_path</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>///</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-49"></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'>FlippedSeal</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</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>
<a name="line-50"></a>                      <span class='hs-varid'>seal</span><span class='hs-layout'>,</span> <span class='hs-varid'>flipSeal</span><span class='hs-layout'>,</span> <span class='hs-varid'>seal2</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsealFlipped</span><span class='hs-layout'>,</span> <span class='hs-varid'>unseal2</span><span class='hs-layout'>,</span> <span class='hs-varid'>unseal</span> <span class='hs-layout'>)</span>
<a name="line-51"></a><span class='hs-cpp'>#include "impossible.h"</span>
</pre>\end{code}

\paragraph{Selecting patches}\label{selecting}

Many commands operate on a patch or patches that have already been recorded.
There are a number of options that specify which patches are selected for
these operations: \verb!--patch!, \verb!--match!, \verb!--tag!, and variants
on these, which for \verb!--patch! are \verb!--patches!,
\verb!--from-patch!, and \verb!--to-patch!.  The \verb!--patch! and
\verb!--tag! forms simply take (POSIX extended, aka \verb!egrep!) regular
expressions and match them against tag and patch names.  \verb!--match!,
described below, allows more powerful patterns.

The plural forms of these options select all matching patches.  The singular
forms select the last matching patch.  The range (from and to) forms select
patches after or up to (both inclusive) the last matching patch.

These options use the current order of patches in the repository.  darcs may
reorder patches, so this is not necessarily the order of creation or the
order in which patches were applied.  However, as long as you are just
recording patches in your own repository, they will remain in order.

% NOTE --no-deps is implemented in SelectChanges.lhs, but documented here
% for concistency.
When a patch or a group of patches is selected, all patches they depend on
get silently selected too. For example: \verb!darcs pull --patches bugfix!
means ``pull all the patches with `bugfix' in their name, along with any
patches they require.''  If you really only want patches with `bugfix' in
their name, you should use the \verb!--no-deps! option, which makes darcs
exclude any matched patches from the selection which have dependencies that
are themselves not explicitly matched by the selection.

For \verb!unrecord!, \verb!unpull! and \verb!obliterate!, patches that
depend on the selected patches are silently included, or if
\verb!--no-deps! is used selected patches with dependencies on not selected
patches are excluded from the selection.

\begin{code}
<pre><a name="line-1"></a><a name="InclusiveOrExclusive"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>InclusiveOrExclusive</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Inclusive</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Exclusive</span> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Eq</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="haveNonrangeMatch"></a><span class='hs-comment'>-- | @haveNonrangeMatch flags@ tells whether there is a flag in</span>
<a name="line-4"></a><span class='hs-comment'>-- @flags@ which corresponds to a match that is "non-range". Thus,</span>
<a name="line-5"></a><span class='hs-comment'>-- @--match@, @--patch@ and @--index@ make @haveNonrangeMatch@</span>
<a name="line-6"></a><span class='hs-comment'>-- true, but not @--from-patch@ or @--to-patch@.</span>
<a name="line-7"></a><span class='hs-definition'>haveNonrangeMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-8"></a><span class='hs-definition'>haveNonrangeMatch</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>hasIndexRange</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>nonrangeMatcher</span> <span class='hs-varid'>fs</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Matcher</span> <span class='hs-conid'>Patch</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="havePatchsetMatch"></a><span class='hs-comment'>-- | @havePatchsetMatch flags@ tells whether there is a "patchset</span>
<a name="line-11"></a><span class='hs-comment'>-- match" in the flag list. A patchset match is @--match@ or</span>
<a name="line-12"></a><span class='hs-comment'>-- @--patch@, or @--context@, but not @--from-patch@ nor (!)</span>
<a name="line-13"></a><span class='hs-comment'>-- @--index@.</span>
<a name="line-14"></a><span class='hs-comment'>-- Question: Is it supposed not to be a subset of @haveNonrangeMatch@?</span>
<a name="line-15"></a><span class='hs-definition'>havePatchsetMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-16"></a><span class='hs-definition'>havePatchsetMatch</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>nonrangeMatcher</span> <span class='hs-varid'>fs</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Matcher</span> <span class='hs-conid'>Patch</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-varid'>hasC</span> <span class='hs-varid'>fs</span>
<a name="line-17"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>hasC</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-18"></a>          <span class='hs-varid'>hasC</span> <span class='hs-layout'>(</span><span class='hs-conid'>Context</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-19"></a>          <span class='hs-varid'>hasC</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</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'>hasC</span> <span class='hs-varid'>xs</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="getNonrangeMatch"></a><span class='hs-definition'>getNonrangeMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-22"></a><span class='hs-definition'>getNonrangeMatch</span> <span class='hs-varid'>r</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRecordedMatchSmart</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>getNonrangeMatchS</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-23"></a>
<a name="line-24"></a><a name="getPartialNonrangeMatch"></a><span class='hs-definition'>getPartialNonrangeMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-25"></a>                           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FileName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-26"></a><span class='hs-definition'>getPartialNonrangeMatch</span> <span class='hs-varid'>r</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>files</span> <span class='hs-keyglyph'>=</span>
<a name="line-27"></a>    <span class='hs-varid'>withRecordedMatchOnlySomeSmart</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>r</span> <span class='hs-varid'>files</span> <span class='hs-layout'>(</span><span class='hs-varid'>getNonrangeMatchS</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="getNonrangeMatchS"></a><span class='hs-definition'>getNonrangeMatchS</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchMonad</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-30"></a>                        <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-31"></a><span class='hs-definition'>getNonrangeMatchS</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>repo</span> <span class='hs-keyglyph'>=</span>
<a name="line-32"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>nonrangeMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-33"></a>        <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>nonrangeMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-34"></a>                        <span class='hs-keyword'>then</span> <span class='hs-varid'>getTagS</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span>
<a name="line-35"></a>                        <span class='hs-keyword'>else</span> <span class='hs-varid'>getMatcherS</span> <span class='hs-conid'>Exclusive</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span>
<a name="line-36"></a>        <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"Pattern not specified in getNonrangeMatch."</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="firstMatch"></a><span class='hs-comment'>-- | @firstMatch fs@ tells whether @fs@ implies a "first match", that</span>
<a name="line-39"></a><span class='hs-comment'>-- is if we match against patches from a point in the past on, rather</span>
<a name="line-40"></a><span class='hs-comment'>-- than against all patches since the creation of the repository.</span>
<a name="line-41"></a><span class='hs-definition'>firstMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-42"></a><span class='hs-definition'>firstMatch</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>hasLastn</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-43"></a>                 <span class='hs-varop'>||</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>firstMatcher</span> <span class='hs-varid'>fs</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Matcher</span> <span class='hs-conid'>Patch</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-44"></a>                 <span class='hs-varop'>||</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>hasIndexRange</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-45"></a>
<a name="line-46"></a><a name="getFirstMatch"></a><span class='hs-definition'>getFirstMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-47"></a><span class='hs-definition'>getFirstMatch</span> <span class='hs-varid'>r</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRecordedMatchSmart</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>getFirstMatchS</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="getPartialFirstMatch"></a><span class='hs-definition'>getPartialFirstMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-50"></a>                        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FileName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-51"></a><span class='hs-definition'>getPartialFirstMatch</span> <span class='hs-varid'>r</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>files</span> <span class='hs-keyglyph'>=</span>
<a name="line-52"></a>    <span class='hs-varid'>withRecordedMatchOnlySomeSmart</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>r</span> <span class='hs-varid'>files</span> <span class='hs-layout'>(</span><span class='hs-varid'>getFirstMatchS</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-53"></a>
<a name="line-54"></a><a name="getFirstMatchS"></a><span class='hs-definition'>getFirstMatchS</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchMonad</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-55"></a>                     <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-56"></a><span class='hs-definition'>getFirstMatchS</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>repo</span> <span class='hs-keyglyph'>=</span>
<a name="line-57"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>hasLastn</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-58"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>applyInvRL</span> <span class='hs-varop'>`unsealFlipped`</span> <span class='hs-layout'>(</span><span class='hs-varid'>safetake</span> <span class='hs-varid'>n</span> <span class='hs-varop'>$</span> <span class='hs-varid'>concatRL</span> <span class='hs-varid'>repo</span><span class='hs-layout'>)</span>
<a name="line-59"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>firstMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-60"></a>               <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"Pattern not specified in getFirstMatch."</span>
<a name="line-61"></a>               <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>firstMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-62"></a>                         <span class='hs-keyword'>then</span> <span class='hs-varid'>getTagS</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span>
<a name="line-63"></a>                         <span class='hs-keyword'>else</span> <span class='hs-varid'>getMatcherS</span> <span class='hs-conid'>Inclusive</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span>
<a name="line-64"></a>
<a name="line-65"></a>
<a name="line-66"></a><a name="secondMatch"></a><span class='hs-comment'>-- | @secondMatch fs@ tells whether @fs@ implies a "second match", that</span>
<a name="line-67"></a><span class='hs-comment'>-- is if we match against patches up to a point in the past on, rather</span>
<a name="line-68"></a><span class='hs-comment'>-- than against all patches until now.</span>
<a name="line-69"></a><span class='hs-definition'>secondMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-70"></a><span class='hs-definition'>secondMatch</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>secondMatcher</span> <span class='hs-varid'>fs</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Matcher</span> <span class='hs-conid'>Patch</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>hasIndexRange</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-71"></a>
<a name="line-72"></a><a name="getPartialSecondMatch"></a><span class='hs-definition'>getPartialSecondMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-73"></a>                        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FileName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-74"></a><span class='hs-definition'>getPartialSecondMatch</span> <span class='hs-varid'>r</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>files</span> <span class='hs-keyglyph'>=</span>
<a name="line-75"></a>    <span class='hs-varid'>withRecordedMatchOnlySomeSmart</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>r</span> <span class='hs-varid'>files</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>repo</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-76"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>secondMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-77"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"Two patterns not specified in get_second_match."</span>
<a name="line-78"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>secondMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-79"></a>              <span class='hs-keyword'>then</span> <span class='hs-varid'>getTagS</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span>
<a name="line-80"></a>              <span class='hs-keyword'>else</span> <span class='hs-varid'>getMatcherS</span> <span class='hs-conid'>Exclusive</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="checkMatchSyntax"></a><span class='hs-definition'>checkMatchSyntax</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-83"></a><span class='hs-definition'>checkMatchSyntax</span> <span class='hs-varid'>opts</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-84"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>getMatchPattern</span> <span class='hs-varid'>opts</span> <span class='hs-keyword'>of</span>
<a name="line-85"></a>  <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-86"></a>  <span class='hs-conid'>Just</span> <span class='hs-varid'>p</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>either</span> <span class='hs-varid'>fail</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-varop'>$</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>parseMatch</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>::</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-conid'>Patch</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-87"></a>
<a name="line-88"></a><a name="getMatchPattern"></a><span class='hs-definition'>getMatchPattern</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>PatchMatch</span>
<a name="line-89"></a><span class='hs-definition'>getMatchPattern</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-90"></a><span class='hs-definition'>getMatchPattern</span> <span class='hs-layout'>(</span><span class='hs-conid'>OnePattern</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span>
<a name="line-91"></a><span class='hs-definition'>getMatchPattern</span> <span class='hs-layout'>(</span><span class='hs-conid'>SeveralPattern</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span>
<a name="line-92"></a><span class='hs-definition'>getMatchPattern</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getMatchPattern</span> <span class='hs-varid'>fs</span>
<a name="line-93"></a>
<a name="line-94"></a><a name="tagmatch"></a><span class='hs-definition'>tagmatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span>
<a name="line-95"></a><span class='hs-definition'>tagmatch</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>make_matcher</span> <span class='hs-layout'>(</span><span class='hs-str'>"tag-name "</span><span class='hs-varop'>++</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>tm</span>
<a name="line-96"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>tm</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-97"></a>              <span class='hs-keyword'>let</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>just_name</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyword'>in</span>
<a name="line-98"></a>              <span class='hs-varid'>take</span> <span class='hs-num'>4</span> <span class='hs-varid'>n</span> <span class='hs-varop'>==</span> <span class='hs-str'>"TAG "</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>isJust</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-varid'>drop</span> <span class='hs-num'>4</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="mymatch"></a><span class='hs-definition'>mymatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span>
<a name="line-101"></a><span class='hs-definition'>mymatch</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>make_matcher</span> <span class='hs-layout'>(</span><span class='hs-str'>"patch-name "</span><span class='hs-varop'>++</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>mm</span>
<a name="line-102"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>mm</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>p</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'>just_name</span> <span class='hs-varop'>.</span> <span class='hs-varid'>info</span> <span class='hs-varop'>$</span> <span class='hs-varid'>p</span>
<a name="line-103"></a>
<a name="line-104"></a>
<a name="line-105"></a><a name="strictJust"></a><span class='hs-comment'>-- | strictJust is a strict version of the Just constructor, used to ensure</span>
<a name="line-106"></a><span class='hs-comment'>-- that if we claim we've got a pattern match, that the pattern will</span>
<a name="line-107"></a><span class='hs-comment'>-- actually match (rathern than fail to compile properly).</span>
<a name="line-108"></a><span class='hs-comment'>--</span>
<a name="line-109"></a><span class='hs-comment'>-- /First matcher, Second matcher and Nonrange matcher/</span>
<a name="line-110"></a><span class='hs-comment'>--</span>
<a name="line-111"></a><span class='hs-comment'>-- When we match for patches, we have a PatchSet, of which we want a</span>
<a name="line-112"></a><span class='hs-comment'>-- subset. This subset is formed by the patches in a given interval</span>
<a name="line-113"></a><span class='hs-comment'>-- which match a given criterion. If we represent time going left to</span>
<a name="line-114"></a><span class='hs-comment'>-- right (which means the 'PatchSet' is written right to left), then</span>
<a name="line-115"></a><span class='hs-comment'>-- we have (up to) three 'Matcher's: the 'nonrangeMatcher' is the</span>
<a name="line-116"></a><span class='hs-comment'>-- criterion we use to select among patches in the interval, the</span>
<a name="line-117"></a><span class='hs-comment'>-- 'firstMatcher' is the left bound of the interval, and the</span>
<a name="line-118"></a><span class='hs-comment'>-- 'last_matcher' is the right bound. Each of these matchers can be</span>
<a name="line-119"></a><span class='hs-comment'>-- present or not according to the options.</span>
<a name="line-120"></a><span class='hs-definition'>strictJust</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span>
<a name="line-121"></a><span class='hs-definition'>strictJust</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>x</span>
<a name="line-122"></a>
<a name="line-123"></a><a name="nonrangeMatcher"></a><span class='hs-comment'>-- | @nonrangeMatcher@ is the criterion that is used to match against</span>
<a name="line-124"></a><span class='hs-comment'>-- patches in the interval. It is 'Just m' when the @--patch@, @--match@,</span>
<a name="line-125"></a><span class='hs-comment'>-- @--tag@ options are passed (or their plural variants).</span>
<a name="line-126"></a><span class='hs-definition'>nonrangeMatcher</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-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-127"></a><span class='hs-definition'>nonrangeMatcher</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-128"></a><span class='hs-definition'>nonrangeMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>OnePattern</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>match_pattern</span> <span class='hs-varid'>m</span>
<a name="line-129"></a><span class='hs-definition'>nonrangeMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>OneTag</span> <span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>tagmatch</span> <span class='hs-varid'>t</span>
<a name="line-130"></a><span class='hs-definition'>nonrangeMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>OnePatch</span> <span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mymatch</span> <span class='hs-varid'>p</span>
<a name="line-131"></a><span class='hs-definition'>nonrangeMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>SeveralPattern</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>match_pattern</span> <span class='hs-varid'>m</span>
<a name="line-132"></a><span class='hs-definition'>nonrangeMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>SeveralPatch</span> <span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mymatch</span> <span class='hs-varid'>p</span>
<a name="line-133"></a><span class='hs-definition'>nonrangeMatcher</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nonrangeMatcher</span> <span class='hs-varid'>fs</span>
<a name="line-134"></a>
<a name="line-135"></a><a name="nonrangeMatcherIsTag"></a><span class='hs-comment'>-- | @nonrangeMatcherIsTag@ returns true if the matching option was</span>
<a name="line-136"></a><span class='hs-comment'>-- '--tag'</span>
<a name="line-137"></a><span class='hs-definition'>nonrangeMatcherIsTag</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-138"></a><span class='hs-definition'>nonrangeMatcherIsTag</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-139"></a><span class='hs-definition'>nonrangeMatcherIsTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>OneTag</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-140"></a><span class='hs-definition'>nonrangeMatcherIsTag</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nonrangeMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-141"></a>
<a name="line-142"></a><a name="firstMatcher"></a><span class='hs-comment'>-- | @firstMatcher@ returns the left bound of the matched interval.</span>
<a name="line-143"></a><span class='hs-comment'>-- This left bound is also specified when we use the singular versions</span>
<a name="line-144"></a><span class='hs-comment'>-- of @--patch@, @--match@ and @--tag@. Otherwise, @firstMatcher@</span>
<a name="line-145"></a><span class='hs-comment'>-- returns @Nothing@.</span>
<a name="line-146"></a><span class='hs-definition'>firstMatcher</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-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-147"></a><span class='hs-definition'>firstMatcher</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-148"></a><span class='hs-definition'>firstMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>OnePattern</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>match_pattern</span> <span class='hs-varid'>m</span>
<a name="line-149"></a><span class='hs-definition'>firstMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>AfterPattern</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>match_pattern</span> <span class='hs-varid'>m</span>
<a name="line-150"></a><span class='hs-definition'>firstMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>AfterTag</span> <span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>tagmatch</span> <span class='hs-varid'>t</span>
<a name="line-151"></a><span class='hs-definition'>firstMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>OnePatch</span> <span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mymatch</span> <span class='hs-varid'>p</span>
<a name="line-152"></a><span class='hs-definition'>firstMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>AfterPatch</span> <span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mymatch</span> <span class='hs-varid'>p</span>
<a name="line-153"></a><span class='hs-definition'>firstMatcher</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>firstMatcher</span> <span class='hs-varid'>fs</span>
<a name="line-154"></a>
<a name="line-155"></a><a name="firstMatcherIsTag"></a><span class='hs-definition'>firstMatcherIsTag</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-156"></a><span class='hs-definition'>firstMatcherIsTag</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-157"></a><span class='hs-definition'>firstMatcherIsTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>AfterTag</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-158"></a><span class='hs-definition'>firstMatcherIsTag</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>firstMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-159"></a>
<a name="line-160"></a><a name="secondMatcher"></a><span class='hs-definition'>secondMatcher</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-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-161"></a><span class='hs-definition'>secondMatcher</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-162"></a><span class='hs-definition'>secondMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>OnePattern</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>match_pattern</span> <span class='hs-varid'>m</span>
<a name="line-163"></a><span class='hs-definition'>secondMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>UpToPattern</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>match_pattern</span> <span class='hs-varid'>m</span>
<a name="line-164"></a><span class='hs-definition'>secondMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>OnePatch</span> <span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mymatch</span> <span class='hs-varid'>p</span>
<a name="line-165"></a><span class='hs-definition'>secondMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>UpToPatch</span> <span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mymatch</span> <span class='hs-varid'>p</span>
<a name="line-166"></a><span class='hs-definition'>secondMatcher</span> <span class='hs-layout'>(</span><span class='hs-conid'>UpToTag</span> <span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>tagmatch</span> <span class='hs-varid'>t</span>
<a name="line-167"></a><span class='hs-definition'>secondMatcher</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>secondMatcher</span> <span class='hs-varid'>fs</span>
<a name="line-168"></a>
<a name="line-169"></a><a name="secondMatcherIsTag"></a><span class='hs-definition'>secondMatcherIsTag</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-170"></a><span class='hs-definition'>secondMatcherIsTag</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-171"></a><span class='hs-definition'>secondMatcherIsTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>UpToTag</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-172"></a><span class='hs-definition'>secondMatcherIsTag</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>secondMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-173"></a>
<a name="line-174"></a><a name="matchAPatchread"></a><span class='hs-comment'>-- | @matchAPatchread fs p@ tells whether @p@ matches the matchers in</span>
<a name="line-175"></a><span class='hs-comment'>-- the flags listed in @fs@.</span>
<a name="line-176"></a><span class='hs-definition'>matchAPatchread</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-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</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-177"></a><span class='hs-definition'>matchAPatchread</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>nonrangeMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-178"></a>                       <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>const</span> <span class='hs-conid'>True</span>
<a name="line-179"></a>                       <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>apply_matcher</span> <span class='hs-varid'>m</span>
<a name="line-180"></a>
<a name="line-181"></a><a name="matchAPatch"></a><span class='hs-comment'>-- | @matchAPatch fs p@ tells whether @p@ matches the matchers in</span>
<a name="line-182"></a><span class='hs-comment'>-- the flags @fs@</span>
<a name="line-183"></a><span class='hs-definition'>matchAPatch</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-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Named</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-184"></a><span class='hs-definition'>matchAPatch</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span>
<a name="line-185"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>nonrangeMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-186"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-187"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>apply_matcher</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>patch2patchinfo</span> <span class='hs-varid'>p</span> <span class='hs-varop'>`piap`</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-188"></a>
<a name="line-189"></a><a name="matchPatch"></a><span class='hs-definition'>matchPatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Sealed2</span> <span class='hs-layout'>(</span><span class='hs-conid'>Named</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-190"></a><span class='hs-definition'>matchPatch</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span>
<a name="line-191"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>hasIndexRange</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-192"></a>    <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>a'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>a</span> <span class='hs-varop'>==</span> <span class='hs-varid'>a'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>unseal</span> <span class='hs-varid'>myhead</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>dropn</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>of</span>
<a name="line-193"></a>                             <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>Sealed2</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>seal2</span> <span class='hs-varop'>$</span> <span class='hs-varid'>hopefully</span> <span class='hs-varid'>p</span>
<a name="line-194"></a>                             <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Patch out of range!"</span>
<a name="line-195"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>bug</span> <span class='hs-layout'>(</span><span class='hs-str'>"Invalid index range match given to matchPatch: "</span><span class='hs-varop'>++</span>
<a name="line-196"></a>                                    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchIndexRange</span> <span class='hs-varid'>a</span> <span class='hs-varid'>a'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-197"></a>                <span class='hs-keyword'>where</span> <span class='hs-varid'>myhead</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</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-layout'>)</span>
<a name="line-198"></a>                      <span class='hs-varid'>myhead</span> <span class='hs-layout'>(</span><span class='hs-conid'>NilRL</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>myhead</span> <span class='hs-varid'>x</span>
<a name="line-199"></a>                      <span class='hs-varid'>myhead</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:&lt;:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-conop'>:&lt;:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>seal2</span> <span class='hs-varid'>x</span>
<a name="line-200"></a>                      <span class='hs-varid'>myhead</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-201"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>nonrangeMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-202"></a>                    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>bug</span> <span class='hs-str'>"Couldn't matchPatch"</span>
<a name="line-203"></a>                    <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>findAPatch</span> <span class='hs-varid'>m</span> <span class='hs-varid'>ps</span>
<a name="line-204"></a>
<a name="line-205"></a><a name="getOnePatchset"></a><span class='hs-definition'>getOnePatchset</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>SealedPatchSet</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-206"></a><span class='hs-definition'>getOnePatchset</span> <span class='hs-varid'>repository</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span>
<a name="line-207"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>nonrangeMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-208"></a>        <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_repo</span> <span class='hs-varid'>repository</span>
<a name="line-209"></a>                     <span class='hs-keyword'>if</span> <span class='hs-varid'>nonrangeMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-210"></a>                        <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getMatchingTag</span> <span class='hs-varid'>m</span> <span class='hs-varid'>ps</span>
<a name="line-211"></a>                        <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>matchAPatchset</span> <span class='hs-varid'>m</span> <span class='hs-varid'>ps</span>
<a name="line-212"></a>        <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>seal</span> <span class='hs-varop'>.</span> <span class='hs-varid'>scan_context</span><span class='hs-layout'>)</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>mmapFilePS</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varop'>$</span> <span class='hs-varid'>context_f</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-213"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>context_f</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bug</span> <span class='hs-str'>"Couldn't match_nonrange_patchset"</span>
<a name="line-214"></a>          <span class='hs-varid'>context_f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Context</span> <span class='hs-varid'>f</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span>
<a name="line-215"></a>          <span class='hs-varid'>context_f</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</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'>context_f</span> <span class='hs-varid'>xs</span>
<a name="line-216"></a>
<a name="line-217"></a><a name="hasLastn"></a><span class='hs-comment'>-- | @hasLastn fs@ return the @--last@ argument in @fs@, if any.</span>
<a name="line-218"></a><span class='hs-definition'>hasLastn</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Int</span>
<a name="line-219"></a><span class='hs-definition'>hasLastn</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-220"></a><span class='hs-definition'>hasLastn</span> <span class='hs-layout'>(</span><span class='hs-conid'>LastN</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"--last requires a positive integer argument."</span>
<a name="line-221"></a><span class='hs-definition'>hasLastn</span> <span class='hs-layout'>(</span><span class='hs-conid'>LastN</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>n</span>
<a name="line-222"></a><span class='hs-definition'>hasLastn</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hasLastn</span> <span class='hs-varid'>fs</span>
<a name="line-223"></a>
<a name="line-224"></a><a name="hasIndexRange"></a><span class='hs-definition'>hasIndexRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span><span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-225"></a><span class='hs-definition'>hasIndexRange</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-226"></a><span class='hs-definition'>hasIndexRange</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchIndexRange</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-227"></a><span class='hs-definition'>hasIndexRange</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hasIndexRange</span> <span class='hs-varid'>fs</span>
<a name="line-228"></a>
<a name="line-229"></a><a name="matchFirstPatchset"></a><span class='hs-comment'>-- | @matchFirstPatchset fs ps@ returns the part of @ps@ before its</span>
<a name="line-230"></a><span class='hs-comment'>-- first matcher, ie the one that comes first dependencywise. Hence,</span>
<a name="line-231"></a><span class='hs-comment'>-- patches in @matchFirstPatchset fs ps@ are the ones we don't want.</span>
<a name="line-232"></a><span class='hs-comment'>--</span>
<a name="line-233"></a><span class='hs-comment'>-- Question: are they really? Florent</span>
<a name="line-234"></a><span class='hs-definition'>matchFirstPatchset</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SealedPatchSet</span> <span class='hs-varid'>p</span>
<a name="line-235"></a><span class='hs-definition'>matchFirstPatchset</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>patchset</span> <span class='hs-keyglyph'>=</span>
<a name="line-236"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>hasLastn</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-237"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>dropn</span> <span class='hs-varid'>n</span> <span class='hs-varid'>patchset</span>
<a name="line-238"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-239"></a>        <span class='hs-keyword'>case</span> <span class='hs-varid'>hasIndexRange</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-240"></a>        <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>dropn</span> <span class='hs-varid'>b</span> <span class='hs-varid'>patchset</span>
<a name="line-241"></a>        <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-242"></a>               <span class='hs-keyword'>case</span> <span class='hs-varid'>firstMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-243"></a>               <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>bug</span> <span class='hs-str'>"Couldn't matchFirstPatchset"</span>
<a name="line-244"></a>               <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unseal</span> <span class='hs-layout'>(</span><span class='hs-varid'>dropn</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>firstMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-245"></a>                                            <span class='hs-keyword'>then</span> <span class='hs-varid'>getMatchingTag</span> <span class='hs-varid'>m</span> <span class='hs-varid'>patchset</span>
<a name="line-246"></a>                                            <span class='hs-keyword'>else</span> <span class='hs-varid'>matchAPatchset</span> <span class='hs-varid'>m</span> <span class='hs-varid'>patchset</span>
<a name="line-247"></a>
<a name="line-248"></a><a name="dropn"></a><span class='hs-comment'>-- | @dropn n ps@ drops the @n@ last patches from @ps@.</span>
<a name="line-249"></a><span class='hs-definition'>dropn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SealedPatchSet</span> <span class='hs-varid'>p</span>
<a name="line-250"></a><span class='hs-definition'>dropn</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seal</span> <span class='hs-varid'>ps</span>
<a name="line-251"></a><span class='hs-definition'>dropn</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-conid'>NilRL</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dropn</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ps</span>
<a name="line-252"></a><span class='hs-definition'>dropn</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seal</span> <span class='hs-varop'>$</span> <span class='hs-conid'>NilRL</span><span class='hs-conop'>:&lt;:</span><span class='hs-conid'>NilRL</span>
<a name="line-253"></a><span class='hs-definition'>dropn</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dropn</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ps</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span>
<a name="line-254"></a>
<a name="line-255"></a><a name="matchSecondPatchset"></a><span class='hs-comment'>-- | @matchSecondPatchset fs ps@ returns the part of @ps@ before its</span>
<a name="line-256"></a><span class='hs-comment'>-- second matcher, ie the one that comes last dependencywise.</span>
<a name="line-257"></a><span class='hs-definition'>matchSecondPatchset</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SealedPatchSet</span> <span class='hs-varid'>p</span>
<a name="line-258"></a><span class='hs-definition'>matchSecondPatchset</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span>
<a name="line-259"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>hasIndexRange</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-260"></a>  <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>dropn</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span>
<a name="line-261"></a>  <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-262"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>secondMatcher</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>of</span>
<a name="line-263"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>bug</span> <span class='hs-str'>"Couldn't matchSecondPatchset"</span>
<a name="line-264"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>secondMatcherIsTag</span> <span class='hs-varid'>fs</span>
<a name="line-265"></a>              <span class='hs-keyword'>then</span> <span class='hs-varid'>getMatchingTag</span> <span class='hs-varid'>m</span> <span class='hs-varid'>ps</span>
<a name="line-266"></a>              <span class='hs-keyword'>else</span> <span class='hs-varid'>matchAPatchset</span> <span class='hs-varid'>m</span> <span class='hs-varid'>ps</span>
<a name="line-267"></a>
<a name="line-268"></a><a name="findAPatch"></a><span class='hs-comment'>-- | @findAPatch m ps@ returns the last patch in @ps@ matching @m@, and</span>
<a name="line-269"></a><span class='hs-comment'>-- calls 'error' if there is none.</span>
<a name="line-270"></a><span class='hs-definition'>findAPatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Sealed2</span> <span class='hs-layout'>(</span><span class='hs-conid'>Named</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-271"></a><span class='hs-definition'>findAPatch</span> <span class='hs-varid'>m</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Couldn't find patch matching "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>m</span>
<a name="line-272"></a><span class='hs-definition'>findAPatch</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>NilRL</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findAPatch</span> <span class='hs-varid'>m</span> <span class='hs-varid'>xs</span>
<a name="line-273"></a><span class='hs-definition'>findAPatch</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>apply_matcher</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seal2</span> <span class='hs-varop'>$</span> <span class='hs-varid'>hopefully</span> <span class='hs-varid'>p</span>
<a name="line-274"></a>                               <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findAPatch</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>ps</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-275"></a>
<a name="line-276"></a><a name="matchAPatchset"></a><span class='hs-comment'>-- | @matchAPatchset m ps@ returns a (the largest?) subset of @ps@</span>
<a name="line-277"></a><span class='hs-comment'>-- ending in patch which matches @m@. Calls 'error' if there is none.</span>
<a name="line-278"></a><span class='hs-definition'>matchAPatchset</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SealedPatchSet</span> <span class='hs-varid'>p</span>
<a name="line-279"></a><span class='hs-definition'>matchAPatchset</span> <span class='hs-varid'>m</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Couldn't find patch matching "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>m</span>
<a name="line-280"></a><span class='hs-definition'>matchAPatchset</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>NilRL</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>matchAPatchset</span> <span class='hs-varid'>m</span> <span class='hs-varid'>xs</span>
<a name="line-281"></a><span class='hs-definition'>matchAPatchset</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>apply_matcher</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seal</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</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'>matchAPatchset</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>ps</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-283"></a>
<a name="line-284"></a><a name="getMatchingTag"></a><span class='hs-comment'>-- | @getMatchingTag m ps@, where @m@ is a 'Matcher' which matches tags</span>
<a name="line-285"></a><span class='hs-comment'>-- returns a 'SealedPatchSet' containing all patches in the last tag which</span>
<a name="line-286"></a><span class='hs-comment'>-- matches @m@. Last tag means the most recent tag in repository order,</span>
<a name="line-287"></a><span class='hs-comment'>-- i.e. the last one you'd see if you ran darcs changes -t @m@. Calls</span>
<a name="line-288"></a><span class='hs-comment'>-- 'error' if there is no matching tag.</span>
<a name="line-289"></a><span class='hs-definition'>getMatchingTag</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SealedPatchSet</span> <span class='hs-varid'>p</span>
<a name="line-290"></a><span class='hs-definition'>getMatchingTag</span> <span class='hs-varid'>m</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Couldn't find a tag matching "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>m</span>
<a name="line-291"></a><span class='hs-definition'>getMatchingTag</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>NilRL</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getMatchingTag</span> <span class='hs-varid'>m</span> <span class='hs-varid'>xs</span>
<a name="line-292"></a><span class='hs-definition'>getMatchingTag</span> <span class='hs-varid'>m</span> <span class='hs-varid'>xxx</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-293"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>apply_matcher</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_patches_in_tag</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varid'>xxx</span>
<a name="line-294"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getMatchingTag</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>ps</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-295"></a>
<a name="line-296"></a><a name="matchExists"></a><span class='hs-comment'>-- | @matchExists m ps@ tells whether there is a patch matching</span>
<a name="line-297"></a><span class='hs-comment'>-- @m@ in @ps@</span>
<a name="line-298"></a><span class='hs-definition'>matchExists</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'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-299"></a><span class='hs-definition'>matchExists</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-300"></a><span class='hs-definition'>matchExists</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>NilRL</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>matchExists</span> <span class='hs-varid'>m</span> <span class='hs-varid'>xs</span>
<a name="line-301"></a><span class='hs-definition'>matchExists</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>apply_matcher</span> <span class='hs-varid'>m</span> <span class='hs-varop'>$</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-302"></a>                               <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>matchExists</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>ps</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-303"></a>
<a name="line-304"></a><a name="applyInvToMatcher"></a><span class='hs-definition'>applyInvToMatcher</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-conid'>WriteableDirectory</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>InclusiveOrExclusive</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-305"></a><span class='hs-definition'>applyInvToMatcher</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>impossible</span>
<a name="line-306"></a><span class='hs-definition'>applyInvToMatcher</span> <span class='hs-varid'>ioe</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>NilRL</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>applyInvToMatcher</span> <span class='hs-varid'>ioe</span> <span class='hs-varid'>m</span> <span class='hs-varid'>xs</span>
<a name="line-307"></a><span class='hs-definition'>applyInvToMatcher</span> <span class='hs-varid'>ioe</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-308"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>apply_matcher</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>ioe</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Inclusive</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>applyInvp</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-309"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>applyInvp</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>applyInvToMatcher</span> <span class='hs-varid'>ioe</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>ps</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-310"></a>
<a name="line-311"></a><a name="maybeReadFile"></a><span class='hs-comment'>-- | @maybeReadFile@ recursively gets the contents of all files</span>
<a name="line-312"></a><span class='hs-comment'>-- in a directory, or just the contents of a file if called on a</span>
<a name="line-313"></a><span class='hs-comment'>-- simple file.</span>
<a name="line-314"></a><span class='hs-definition'>maybeReadFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadableDirectory</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>FileName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>FileName</span><span class='hs-layout'>,</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-315"></a><span class='hs-definition'>maybeReadFile</span> <span class='hs-varid'>file</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-316"></a>    <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mDoesDirectoryExist</span> <span class='hs-varid'>file</span>
<a name="line-317"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>d</span>
<a name="line-318"></a>      <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span>
<a name="line-319"></a>        <span class='hs-varid'>children</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mInCurrentDirectory</span> <span class='hs-varid'>file</span> <span class='hs-varid'>mGetDirectoryContents</span>
<a name="line-320"></a>        <span class='hs-varid'>maybe_read_files</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>file</span> <span class='hs-varop'>///</span> <span class='hs-varid'>ch</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ch</span> <span class='hs-keyglyph'>&lt;-</span>  <span class='hs-varid'>children</span><span class='hs-keyglyph'>]</span>
<a name="line-321"></a>      <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-322"></a>         <span class='hs-varid'>e</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mDoesFileExist</span> <span class='hs-varid'>file</span>
<a name="line-323"></a>         <span class='hs-keyword'>if</span> <span class='hs-varid'>e</span>
<a name="line-324"></a>           <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span>
<a name="line-325"></a>             <span class='hs-varid'>contents</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mReadFilePS</span> <span class='hs-varid'>file</span>
<a name="line-326"></a>             <span class='hs-varid'>return</span>  <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>norm_path</span> <span class='hs-varid'>file</span><span class='hs-layout'>,</span> <span class='hs-varid'>contents</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-327"></a>           <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-328"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>maybe_read_files</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span>  <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-329"></a>        <span class='hs-varid'>maybe_read_files</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-330"></a>                      <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>maybeReadFile</span> <span class='hs-varid'>f</span>
<a name="line-331"></a>                      <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>maybe_read_files</span> <span class='hs-varid'>fs</span>
<a name="line-332"></a>                      <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>concat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-keyglyph'>]</span>
<a name="line-333"></a>
<a name="line-334"></a><a name="getMatcherS"></a><span class='hs-definition'>getMatcherS</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchMonad</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-335"></a>                 <span class='hs-conid'>InclusiveOrExclusive</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-336"></a><span class='hs-definition'>getMatcherS</span> <span class='hs-varid'>ioe</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span> <span class='hs-keyglyph'>=</span>
<a name="line-337"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>matchExists</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span>
<a name="line-338"></a>    <span class='hs-keyword'>then</span> <span class='hs-varid'>applyInvToMatcher</span> <span class='hs-varid'>ioe</span> <span class='hs-varid'>m</span> <span class='hs-varid'>repo</span>
<a name="line-339"></a>    <span class='hs-keyword'>else</span> <span class='hs-varid'>fail</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Couldn't match pattern "</span><span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>m</span>
<a name="line-340"></a>
<a name="line-341"></a><a name="getTagS"></a><span class='hs-definition'>getTagS</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchMonad</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-342"></a>             <span class='hs-conid'>Matcher</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-343"></a><span class='hs-definition'>getTagS</span> <span class='hs-varid'>match</span> <span class='hs-varid'>repo</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-344"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>pinfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>patch2patchinfo</span> <span class='hs-varop'>`unseal2`</span> <span class='hs-layout'>(</span><span class='hs-varid'>findAPatch</span> <span class='hs-varid'>match</span> <span class='hs-varid'>repo</span><span class='hs-layout'>)</span>
<a name="line-345"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>get_patches_beyond_tag</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>repo</span> <span class='hs-keyword'>of</span>
<a name="line-346"></a>        <span class='hs-conid'>FlippedSeal</span> <span class='hs-varid'>extras</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>applyInvRL</span> <span class='hs-varid'>extras</span>
<a name="line-347"></a>
<a name="line-348"></a><a name="applyInvp"></a><span class='hs-comment'>-- | @applyInvp@ tries to get the patch that's in a 'PatchInfoAnd</span>
<a name="line-349"></a><span class='hs-comment'>-- patch', and to apply its inverse. If we fail to fetch the patch</span>
<a name="line-350"></a><span class='hs-comment'>-- (presumably in a partial repositiory), then we share our sorrow</span>
<a name="line-351"></a><span class='hs-comment'>-- with the user.</span>
<a name="line-352"></a><span class='hs-definition'>applyInvp</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Patchy</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-conid'>WriteableDirectory</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</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-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-353"></a><span class='hs-definition'>applyInvp</span> <span class='hs-varid'>hp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>apply</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>(</span><span class='hs-varid'>invert</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromHopefully</span> <span class='hs-varid'>hp</span><span class='hs-layout'>)</span>
<a name="line-354"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>fromHopefully</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>conscientiously</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-355"></a>                     <span class='hs-varid'>text</span> <span class='hs-str'>"Sorry, partial repository problem.  Patch not available:"</span>
<a name="line-356"></a>                     <span class='hs-varop'>$$</span> <span class='hs-varid'>e</span>
<a name="line-357"></a>                     <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>""</span>
<a name="line-358"></a>                     <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"If you think what you're trying to do is ok then"</span>
<a name="line-359"></a>                     <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"report this as a bug on the darcs-user list."</span>
<a name="line-360"></a>
<a name="line-361"></a><a name="safetake"></a><span class='hs-comment'>-- | a version of 'take' for 'RL' lists that cater for contexts.</span>
<a name="line-362"></a><span class='hs-definition'>safetake</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RL</span> <span class='hs-varid'>a</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'>FlippedSeal</span> <span class='hs-layout'>(</span><span class='hs-conid'>RL</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-363"></a><span class='hs-definition'>safetake</span> <span class='hs-num'>0</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flipSeal</span> <span class='hs-conid'>NilRL</span>
<a name="line-364"></a><span class='hs-definition'>safetake</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"There aren't that many patches..."</span>
<a name="line-365"></a><span class='hs-definition'>safetake</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-conop'>:&lt;:</span><span class='hs-keyword'>as</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`consRLSealed`</span> <span class='hs-varid'>safetake</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-keyword'>as</span>
<a name="line-366"></a>
<a name="line-367"></a><a name="MatchMonad"></a><span class='hs-comment'>-- | A @MatchMonad p m@ is a monad in which we match patches from @p@</span>
<a name="line-368"></a><a name="MatchMonad"></a><span class='hs-comment'>-- by playing with them in @m@, a 'WriteableDirectory' monad. How we</span>
<a name="line-369"></a><a name="MatchMonad"></a><span class='hs-comment'>-- play with the patches depends on the instance of @MatchMonad@ we're</span>
<a name="line-370"></a><a name="MatchMonad"></a><span class='hs-comment'>-- using. If we use @IO@, then we'll apply the patches directly in</span>
<a name="line-371"></a><a name="MatchMonad"></a><span class='hs-comment'>-- @m@, if we use @SlurpMonad@, then we'll apply the patches to a</span>
<a name="line-372"></a><a name="MatchMonad"></a><span class='hs-comment'>-- slurpy, and write to disk at the end. Note that both @IO@ and</span>
<a name="line-373"></a><a name="MatchMonad"></a><span class='hs-comment'>-- @SlurpMonad@ have an instance of 'WriteableDirectory' that</span>
<a name="line-374"></a><a name="MatchMonad"></a><span class='hs-comment'>-- implicitely writes in the current directory.</span>
<a name="line-375"></a><a name="MatchMonad"></a><span class='hs-keyword'>class</span> <span class='hs-layout'>(</span><span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-conid'>WriteableDirectory</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MatchMonad</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>where</span>
<a name="line-376"></a>    <span class='hs-varid'>withRecordedMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-377"></a>                      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-378"></a>    <span class='hs-comment'>-- ^ @withRecordedMatch@ is responsible for getting the recorded state</span>
<a name="line-379"></a>    <span class='hs-comment'>-- into the monad, and then applying the second argument, and</span>
<a name="line-380"></a>    <span class='hs-comment'>-- finally placing the resulting state into the current directory.</span>
<a name="line-381"></a>    <span class='hs-varid'>withRecordedMatchOnlySomeFiles</span>
<a name="line-382"></a>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FileName</span><span class='hs-keyglyph'>]</span>
<a name="line-383"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-384"></a>    <span class='hs-comment'>-- ^ @withRecordedMatchOnlySomeFiles@ is a variant of</span>
<a name="line-385"></a>    <span class='hs-comment'>-- withRecordedMatch that may only return some of the files</span>
<a name="line-386"></a>    <span class='hs-comment'>-- (e.g. if we want to run diff on just a few files).</span>
<a name="line-387"></a>    <span class='hs-varid'>withRecordedMatchOnlySomeFiles</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRecordedMatch</span> <span class='hs-varid'>r</span> <span class='hs-varid'>j</span>
<a name="line-388"></a>    <span class='hs-varid'>applyInvRL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RL</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-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-389"></a>    <span class='hs-varid'>applyInvRL</span> <span class='hs-conid'>NilRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-390"></a>    <span class='hs-varid'>applyInvRL</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&lt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>applyInvp</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>applyInvRL</span> <span class='hs-varid'>ps</span>
<a name="line-391"></a>
<a name="line-392"></a><a name="withRecordedMatchIO"></a><span class='hs-definition'>withRecordedMatchIO</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-393"></a>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-394"></a><span class='hs-definition'>withRecordedMatchIO</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRecordedMatch</span>
<a name="line-395"></a>
<a name="line-396"></a><a name="withRecordedMatchSmart"></a><span class='hs-comment'>-- | @withRecordedMatchSmart@ hides away the choice of the</span>
<a name="line-397"></a><span class='hs-comment'>-- 'SlurpMonad' to use in order to apply 'withRecordedMatch'.</span>
<a name="line-398"></a><span class='hs-comment'>-- If we have the @--store-in-memory@ flag, then use 'SlurpMonad', else</span>
<a name="line-399"></a><span class='hs-comment'>-- use @IO@. In both case, the result is in the @IO@ monad.</span>
<a name="line-400"></a><span class='hs-comment'>--</span>
<a name="line-401"></a><span class='hs-comment'>-- Suggestion: shouldn't we name @withRecordedMatchSmart@</span>
<a name="line-402"></a><span class='hs-comment'>-- @withRecordedMatch@, and give the monad function another name such</span>
<a name="line-403"></a><span class='hs-comment'>-- as @withRecordedMatchRaw@?</span>
<a name="line-404"></a><span class='hs-definition'>withRecordedMatchSmart</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-405"></a>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>m</span><span class='hs-varop'>.</span> <span class='hs-conid'>MatchMonad</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-406"></a>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-407"></a><span class='hs-definition'>withRecordedMatchSmart</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>r</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span>
<a name="line-408"></a> <span class='hs-keyword'>do</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>willStoreInMemory</span> <span class='hs-varid'>opts</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>withSM</span> <span class='hs-varid'>r</span> <span class='hs-varid'>j</span>
<a name="line-409"></a>                              <span class='hs-keyword'>else</span> <span class='hs-varid'>withRecordedMatchIO</span> <span class='hs-varid'>r</span> <span class='hs-varid'>j</span>
<a name="line-410"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>withSM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-411"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SlurpMonad</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-412"></a>          <span class='hs-varid'>withSM</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRecordedMatch</span>
<a name="line-413"></a>
<a name="line-414"></a><a name="withRecordedMatchOnlySomeSmart"></a><span class='hs-comment'>-- | @withRecordedMatchOnlySomeSmart@ is the smart version of</span>
<a name="line-415"></a><span class='hs-comment'>-- 'withRecordedMatchOnlySome'. It runs 'withRecordedMatchOnlySome'</span>
<a name="line-416"></a><span class='hs-comment'>-- either in the 'SlurpMonad' or in @IO@ according to the</span>
<a name="line-417"></a><span class='hs-comment'>-- @--store-in-memory@ flag.</span>
<a name="line-418"></a><span class='hs-definition'>withRecordedMatchOnlySomeSmart</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-419"></a>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FileName</span><span class='hs-keyglyph'>]</span>
<a name="line-420"></a>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>m</span><span class='hs-varop'>.</span> <span class='hs-conid'>MatchMonad</span> <span class='hs-varid'>m</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-421"></a>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-422"></a><span class='hs-definition'>withRecordedMatchOnlySomeSmart</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>r</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRecordedMatchSmart</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>r</span> <span class='hs-varid'>j</span>
<a name="line-423"></a><span class='hs-definition'>withRecordedMatchOnlySomeSmart</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>r</span> <span class='hs-varid'>files</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span>
<a name="line-424"></a> <span class='hs-keyword'>do</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>willStoreInMemory</span> <span class='hs-varid'>opts</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>withSM</span> <span class='hs-varid'>r</span> <span class='hs-varid'>files</span> <span class='hs-varid'>j</span>
<a name="line-425"></a>                              <span class='hs-keyword'>else</span> <span class='hs-varid'>withIO</span> <span class='hs-varid'>r</span> <span class='hs-varid'>files</span> <span class='hs-varid'>j</span>
<a name="line-426"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>withSM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FileName</span><span class='hs-keyglyph'>]</span>
<a name="line-427"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SlurpMonad</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-428"></a>          <span class='hs-varid'>withSM</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRecordedMatchOnlySomeFiles</span>
<a name="line-429"></a>          <span class='hs-varid'>withIO</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FileName</span><span class='hs-keyglyph'>]</span>
<a name="line-430"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-431"></a>          <span class='hs-varid'>withIO</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRecordedMatchOnlySomeFiles</span>
<a name="line-432"></a>
<a name="line-433"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MatchMonad</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>where</span>
<a name="line-434"></a>    <span class='hs-varid'>withRecordedMatch</span> <span class='hs-varid'>r</span> <span class='hs-varid'>job</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>createPristineDirectoryTree</span> <span class='hs-varid'>r</span> <span class='hs-str'>"."</span>
<a name="line-435"></a>                                 <span class='hs-varid'>read_repo</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>job</span>
<a name="line-436"></a>    <span class='hs-varid'>applyInvRL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>apply_patches</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>.</span> <span class='hs-varid'>invertRL</span> <span class='hs-comment'>-- this gives nicer feedback</span>
<a name="line-437"></a>
<a name="line-438"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MatchMonad</span> <span class='hs-conid'>SlurpMonad</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>where</span>
<a name="line-439"></a>    <span class='hs-varid'>withRecordedMatch</span> <span class='hs-varid'>r</span> <span class='hs-varid'>job</span> <span class='hs-keyglyph'>=</span>
<a name="line-440"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_repo</span> <span class='hs-varid'>r</span>
<a name="line-441"></a>           <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>slurp_recorded</span> <span class='hs-varid'>r</span>
<a name="line-442"></a>           <span class='hs-keyword'>case</span> <span class='hs-varid'>withSlurpy</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-varid'>job</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-443"></a>             <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-varid'>err</span>
<a name="line-444"></a>             <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>s'</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>writeSlurpy</span> <span class='hs-varid'>s'</span> <span class='hs-str'>"."</span>
<a name="line-445"></a>    <span class='hs-varid'>withRecordedMatchOnlySomeFiles</span> <span class='hs-varid'>r</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>job</span> <span class='hs-keyglyph'>=</span>
<a name="line-446"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_repo</span> <span class='hs-varid'>r</span>
<a name="line-447"></a>           <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>slurp_recorded</span> <span class='hs-varid'>r</span>
<a name="line-448"></a>           <span class='hs-keyword'>case</span> <span class='hs-varid'>withSlurpy</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-varid'>job</span> <span class='hs-varid'>ps</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>maybeReadFile</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-449"></a>             <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-varid'>err</span>
<a name="line-450"></a>             <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>fcs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mapM_</span> <span class='hs-varid'>createAFile</span> <span class='hs-varop'>$</span> <span class='hs-varid'>concat</span> <span class='hs-varid'>fcs</span>
<a name="line-451"></a>               <span class='hs-keyword'>where</span> <span class='hs-varid'>createAFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>ensureDirectories</span> <span class='hs-varop'>$</span> <span class='hs-varid'>superName</span> <span class='hs-varid'>p</span>
<a name="line-452"></a>                                            <span class='hs-varid'>mWriteFilePS</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span>
<a name="line-453"></a>                     <span class='hs-varid'>ensureDirectories</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span>
<a name="line-454"></a>                         <span class='hs-keyword'>do</span> <span class='hs-varid'>isPar</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mDoesDirectoryExist</span> <span class='hs-varid'>d</span>
<a name="line-455"></a>                            <span class='hs-varid'>unless</span> <span class='hs-varid'>isPar</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-456"></a>                               <span class='hs-varid'>ensureDirectories</span> <span class='hs-varop'>$</span> <span class='hs-varid'>superName</span> <span class='hs-varid'>d</span>
<a name="line-457"></a>                               <span class='hs-varid'>mCreateDirectory</span> <span class='hs-varid'>d</span>
<a name="line-458"></a>
</pre>\end{code}
</body>
</html>