Sophie

Sophie

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

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/Patch/Apply.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%  Copyright (C) 2002-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 -fno-warn-orphans #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# LANGUAGE CPP #-}</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'>Patch</span><span class='hs-varop'>.</span><span class='hs-conid'>Apply</span> <span class='hs-layout'>(</span> <span class='hs-varid'>applyToFilepaths</span><span class='hs-layout'>,</span> <span class='hs-varid'>applyToSlurpy</span><span class='hs-layout'>,</span>
<a name="line-7"></a>                           <span class='hs-varid'>forceTokReplace</span><span class='hs-layout'>,</span>
<a name="line-8"></a>                           <span class='hs-varid'>markupFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyMarkedupFile</span><span class='hs-layout'>,</span>
<a name="line-9"></a>                           <span class='hs-varid'>patchChanges</span><span class='hs-layout'>,</span>
<a name="line-10"></a>                           <span class='hs-varid'>applyToPop</span><span class='hs-layout'>,</span>
<a name="line-11"></a>                           <span class='hs-varid'>applyToTree</span><span class='hs-layout'>,</span>
<a name="line-12"></a>                           <span class='hs-conid'>LineMark</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'>MarkedUpFile</span><span class='hs-layout'>,</span>
<a name="line-13"></a>                           <span class='hs-varid'>forceReplaceSlurpy</span> <span class='hs-layout'>)</span>
<a name="line-14"></a>    <span class='hs-keyword'>where</span>
<a name="line-15"></a>
<a name="line-16"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span> <span class='hs-varid'>catch</span><span class='hs-layout'>,</span> <span class='hs-varid'>pi</span> <span class='hs-layout'>)</span>
<a name="line-17"></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'>SetScriptsExecutable</span> <span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Char8</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>BC</span> <span class='hs-layout'>(</span><span class='hs-varid'>split</span><span class='hs-layout'>,</span> <span class='hs-varid'>break</span><span class='hs-layout'>,</span> <span class='hs-varid'>pack</span><span class='hs-layout'>,</span> <span class='hs-varid'>singleton</span><span class='hs-layout'>)</span>
<a name="line-20"></a>
<a name="line-21"></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> <span class='hs-varid'>null</span><span class='hs-layout'>,</span> <span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-varid'>concat</span><span class='hs-layout'>,</span> <span class='hs-varid'>isPrefixOf</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ByteStringUtils</span> <span class='hs-layout'>(</span> <span class='hs-varid'>linesPS</span><span class='hs-layout'>,</span> <span class='hs-varid'>unlinesPS</span><span class='hs-layout'>,</span> <span class='hs-varid'>break_after_nth_newline</span><span class='hs-layout'>,</span> <span class='hs-varid'>break_before_nth_newline</span><span class='hs-layout'>,</span> <span class='hs-layout'>)</span>
<a name="line-23"></a>
<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'>FileName</span> <span class='hs-layout'>(</span> <span class='hs-varid'>fn2ps</span><span class='hs-layout'>,</span> <span class='hs-varid'>fn2fp</span><span class='hs-layout'>,</span> <span class='hs-varid'>fp2fn</span><span class='hs-layout'>,</span>
<a name="line-25"></a>                              <span class='hs-varid'>movedirfilename</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'>PopulationData</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Population</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'>PopTree</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'>Info</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'>DirMark</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-layout'>(</span> <span class='hs-varid'>intersperse</span> <span class='hs-layout'>)</span>
<a name="line-28"></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'>catMaybes</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'>Patchy</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Apply</span><span class='hs-layout'>,</span> <span class='hs-varid'>apply</span><span class='hs-layout'>,</span> <span class='hs-varid'>applyAndTryToFixFL</span><span class='hs-layout'>,</span> <span class='hs-varid'>applyAndTryToFix</span><span class='hs-layout'>,</span>
<a name="line-30"></a>                            <span class='hs-varid'>mapMaybeSnd</span> <span class='hs-layout'>)</span>
<a name="line-31"></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'>Commute</span> <span class='hs-conid'>()</span>
<a name="line-32"></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'>Core</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Patch</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'>Named</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span><span class='hs-varop'>.</span><span class='hs-conid'>Prim</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Prim</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'>Effect</span><span class='hs-layout'>(</span><span class='hs-varid'>effect</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-34"></a>                          <span class='hs-conid'>DirPatchType</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'>FilePatchType</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-35"></a>                          <span class='hs-varid'>try_tok_internal</span> <span class='hs-layout'>)</span>
<a name="line-36"></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-conid'>PatchInfo</span> <span class='hs-layout'>)</span>
<a name="line-37"></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>
<a name="line-38"></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'>FileContents</span><span class='hs-layout'>,</span> <span class='hs-conid'>Slurpy</span><span class='hs-layout'>,</span> <span class='hs-varid'>withSlurpy</span><span class='hs-layout'>,</span> <span class='hs-varid'>slurp_modfile</span> <span class='hs-layout'>)</span>
<a name="line-39"></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'>RegChars</span> <span class='hs-layout'>(</span> <span class='hs-varid'>regChars</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'>Repository</span><span class='hs-varop'>.</span><span class='hs-conid'>Prefs</span> <span class='hs-layout'>(</span> <span class='hs-varid'>changePrefval</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'>Global</span> <span class='hs-layout'>(</span> <span class='hs-varid'>darcsdir</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'>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-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>FilePathMonad</span> <span class='hs-layout'>(</span> <span class='hs-varid'>withFilePaths</span> <span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-cpp'>#include "impossible.h"</span>
<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'>Witnesses</span><span class='hs-varop'>.</span><span class='hs-conid'>Ordered</span> <span class='hs-layout'>(</span> <span class='hs-conid'>FL</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-conop'>:&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-46"></a>                             <span class='hs-varid'>mapFL</span><span class='hs-layout'>,</span> <span class='hs-varid'>mapFL_FL</span><span class='hs-layout'>,</span> <span class='hs-varid'>spanFL</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldlFL</span> <span class='hs-layout'>)</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Storage</span><span class='hs-varop'>.</span><span class='hs-conid'>Hashed</span><span class='hs-varop'>.</span><span class='hs-conid'>Tree</span><span class='hs-layout'>(</span> <span class='hs-conid'>Tree</span> <span class='hs-layout'>)</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Storage</span><span class='hs-varop'>.</span><span class='hs-conid'>Hashed</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-layout'>(</span> <span class='hs-varid'>virtualTreeIO</span> <span class='hs-layout'>)</span>
</pre>\end{code}



\section{Introduction}

A patch describes a change to the tree.  It could be either a primitive
patch (such as a file add/remove, a directory rename, or a hunk replacement
within a file), or a composite patch describing many such changes.  Every
patch type must satisfy the conditions described in this appendix.  The
theory of patches is independent of the data which the patches manipulate,
which is what makes it both powerful and useful, as it provides a framework
upon which one can build a revision control system in a sane manner.

Although in a sense, the defining property of any patch is that it can be
applied to a certain tree, and thus make a certain change, this change does
not wholly define the patch.  A patch is defined by a
\emph{representation}, together with a set of rules for how it behaves
(which it has in common with its patch type).  The \emph{representation} of
a patch defines what change that particular patch makes, and must be
defined in the context of a specific tree.  The theory of patches is a
theory of the many ways one can change the representation of a patch to
place it in the context of a different tree.  The patch itself is not
changed, since it describes a single change, which must be the same
regardless of its representation\footnote{For those comfortable with
quantum mechanics, think of a patch as a quantum mechanical operator, and
the representation as the basis set.  The analogy breaks down pretty
quickly, however, since an operator could be described in any complete
basis set, while a patch modifying the file {\tt foo} can only be described
in the rather small set of contexts which have a file {\tt foo} to be
modified.}.

So how does one define a tree, or the context of a patch? The simplest way
to define a tree is as the result of a series of patches applied to the
empty tree\footnote{This is very similar to the second-quantized picture,
in which any state is seen as the result of a number of creation operators
acting on the vacuum, and provides a similar set of simplifications---in
particular, the exclusion principle is very elegantly enforced by the
properties of the anti-hermitian fermion creation operators.}.  Thus, the
context of a patch consists of the set of patches that precede it.

\section{Applying patches}


\begin{code}
<pre><a name="line-1"></a><a name="applyToFilepaths"></a><span class='hs-definition'>applyToFilepaths</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Apply</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</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-keyglyph'>[</span><span class='hs-conid'>FilePath</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FilePath</span><span class='hs-keyglyph'>]</span>
<a name="line-2"></a><span class='hs-definition'>applyToFilepaths</span> <span class='hs-varid'>pa</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withFilePaths</span> <span class='hs-varid'>fs</span> <span class='hs-layout'>(</span><span class='hs-varid'>apply</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>pa</span><span class='hs-layout'>)</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="applyToSlurpy"></a><span class='hs-definition'>applyToSlurpy</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Apply</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</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'>Slurpy</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Slurpy</span>
<a name="line-5"></a><span class='hs-definition'>applyToSlurpy</span> <span class='hs-varid'>p</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <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'>apply</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-6"></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-7"></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-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>s'</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Apply</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Apply</span> <span class='hs-layout'>(</span><span class='hs-conid'>Named</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-10"></a>    <span class='hs-varid'>apply</span> <span class='hs-varid'>opts</span> <span class='hs-layout'>(</span><span class='hs-conid'>NamedP</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>apply</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>p</span>
<a name="line-11"></a>    <span class='hs-varid'>applyAndTryToFix</span> <span class='hs-layout'>(</span><span class='hs-conid'>NamedP</span> <span class='hs-varid'>n</span> <span class='hs-varid'>d</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapMaybeSnd</span> <span class='hs-layout'>(</span><span class='hs-conid'>NamedP</span> <span class='hs-varid'>n</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>applyAndTryToFix</span> <span class='hs-varid'>p</span>
<a name="line-12"></a>
<a name="line-13"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Apply</span> <span class='hs-conid'>Patch</span> <span class='hs-keyword'>where</span>
<a name="line-14"></a>    <span class='hs-varid'>apply</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>applyFL</span> <span class='hs-varid'>opts</span> <span class='hs-varop'>$</span> <span class='hs-varid'>effect</span> <span class='hs-varid'>p</span>
<a name="line-15"></a>    <span class='hs-varid'>applyAndTryToFixFL</span> <span class='hs-layout'>(</span><span class='hs-conid'>PP</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapMaybeSnd</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapFL_FL</span> <span class='hs-conid'>PP</span><span class='hs-layout'>)</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>applyAndTryToFixFL</span> <span class='hs-varid'>x</span>
<a name="line-16"></a>    <span class='hs-varid'>applyAndTryToFixFL</span> <span class='hs-layout'>(</span><span class='hs-conid'>ComP</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapMaybeSnd</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>xs'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ComP</span> <span class='hs-varid'>xs'</span> <span class='hs-conop'>:&gt;:</span> <span class='hs-conid'>NilFL</span><span class='hs-layout'>)</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>applyAndTryToFix</span> <span class='hs-varid'>xs</span>
<a name="line-17"></a>    <span class='hs-varid'>applyAndTryToFixFL</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>apply</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>x</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-18"></a>    <span class='hs-varid'>applyAndTryToFix</span> <span class='hs-layout'>(</span><span class='hs-conid'>ComP</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapMaybeSnd</span> <span class='hs-conid'>ComP</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>applyAndTryToFix</span> <span class='hs-varid'>xs</span>
<a name="line-19"></a>    <span class='hs-varid'>applyAndTryToFix</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>mapMaybeSnd</span> <span class='hs-conid'>ComP</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>applyAndTryToFixFL</span> <span class='hs-varid'>x</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="forceReplaceSlurpy"></a><span class='hs-definition'>forceReplaceSlurpy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Prim</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'>Slurpy</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Slurpy</span>
<a name="line-22"></a><span class='hs-definition'>forceReplaceSlurpy</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>TokReplace</span> <span class='hs-varid'>tcs</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span>
<a name="line-23"></a>    <span class='hs-varid'>slurp_modfile</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>forceTokReplace</span> <span class='hs-varid'>tcs</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-24"></a><span class='hs-definition'>forceReplaceSlurpy</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bug</span> <span class='hs-str'>"Can only forceReplaceSlurpy on a replace."</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Apply</span> <span class='hs-conid'>Prim</span> <span class='hs-keyword'>where</span>
<a name="line-27"></a>    <span class='hs-varid'>apply</span> <span class='hs-varid'>opts</span> <span class='hs-layout'>(</span><span class='hs-conid'>Split</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>applyFL</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>ps</span>
<a name="line-28"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Identity</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-29"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-conid'>RmFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mRemoveFile</span> <span class='hs-varid'>f</span>
<a name="line-30"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-conid'>AddFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mCreateFile</span> <span class='hs-varid'>f</span>
<a name="line-31"></a>    <span class='hs-varid'>apply</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Hunk</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>applyFL</span> <span class='hs-varid'>opts</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-conop'>:&gt;:</span> <span class='hs-conid'>NilFL</span><span class='hs-layout'>)</span>
<a name="line-32"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>TokReplace</span> <span class='hs-varid'>t</span> <span class='hs-varid'>o</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mModifyFilePSs</span> <span class='hs-varid'>f</span> <span class='hs-varid'>doreplace</span>
<a name="line-33"></a>        <span class='hs-keyword'>where</span> <span class='hs-varid'>doreplace</span> <span class='hs-varid'>ls</span> <span class='hs-keyglyph'>=</span>
<a name="line-34"></a>                  <span class='hs-keyword'>case</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>try_tok_internal</span> <span class='hs-varid'>t</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>ls</span> <span class='hs-keyword'>of</span>
<a name="line-35"></a>                  <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-varop'>$</span> <span class='hs-str'>"replace patch to "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f</span>
<a name="line-36"></a>                             <span class='hs-varop'>++</span> <span class='hs-str'>" couldn't apply."</span>
<a name="line-37"></a>                  <span class='hs-conid'>Just</span> <span class='hs-varid'>ls'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>concat</span> <span class='hs-varid'>ls'</span>
<a name="line-38"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Binary</span> <span class='hs-varid'>o</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mModifyFilePS</span> <span class='hs-varid'>f</span> <span class='hs-varid'>doapply</span>
<a name="line-39"></a>        <span class='hs-keyword'>where</span> <span class='hs-varid'>doapply</span> <span class='hs-varid'>oldf</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>o</span> <span class='hs-varop'>==</span> <span class='hs-varid'>oldf</span>
<a name="line-40"></a>                             <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>n</span>
<a name="line-41"></a>                             <span class='hs-keyword'>else</span> <span class='hs-varid'>fail</span> <span class='hs-varop'>$</span> <span class='hs-str'>"binary patch to "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f</span>
<a name="line-42"></a>                                  <span class='hs-varop'>++</span> <span class='hs-str'>" couldn't apply."</span>
<a name="line-43"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-varid'>d</span> <span class='hs-conid'>AddDir</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mCreateDirectory</span> <span class='hs-varid'>d</span>
<a name="line-44"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-varid'>d</span> <span class='hs-conid'>RmDir</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mRemoveDirectory</span> <span class='hs-varid'>d</span>
<a name="line-45"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Move</span> <span class='hs-varid'>f</span> <span class='hs-varid'>f'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mRename</span> <span class='hs-varid'>f</span> <span class='hs-varid'>f'</span>
<a name="line-46"></a>    <span class='hs-varid'>apply</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>ChangePref</span> <span class='hs-varid'>p</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-47"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mDoesDirectoryExist</span> <span class='hs-layout'>(</span><span class='hs-varid'>fp2fn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>darcsdir</span><span class='hs-varop'>++</span><span class='hs-str'>"/prefs"</span><span class='hs-layout'>)</span>
<a name="line-48"></a>           <span class='hs-varid'>when</span> <span class='hs-varid'>b</span> <span class='hs-varop'>$</span> <span class='hs-varid'>changePrefval</span> <span class='hs-varid'>p</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t</span>
<a name="line-49"></a>    <span class='hs-varid'>applyAndTryToFixFL</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-conid'>RmFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-50"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mReadFilePS</span> <span class='hs-varid'>f</span>
<a name="line-51"></a>           <span class='hs-keyword'>if</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>mRemoveFile</span> <span class='hs-varid'>f</span>
<a name="line-52"></a>                               <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-53"></a>                       <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>mWriteFilePS</span> <span class='hs-varid'>f</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-54"></a>                               <span class='hs-varid'>mRemoveFile</span> <span class='hs-varid'>f</span>
<a name="line-55"></a>                               <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-str'>"WARNING: Fixing removal of non-empty file "</span><span class='hs-varop'>++</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span>
<a name="line-56"></a>                                              <span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Binary</span> <span class='hs-varid'>x</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span><span class='hs-layout'>)</span> <span class='hs-conop'>:&gt;:</span> <span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-conid'>RmFile</span> <span class='hs-conop'>:&gt;:</span> <span class='hs-conid'>NilFL</span> <span class='hs-layout'>)</span>
<a name="line-57"></a>    <span class='hs-varid'>applyAndTryToFixFL</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>apply</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>p</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="applyFL"></a><span class='hs-definition'>applyFL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WriteableDirectory</span> <span class='hs-varid'>m</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'>FL</span> <span class='hs-conid'>Prim</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-60"></a><span class='hs-definition'>applyFL</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>NilFL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-61"></a><span class='hs-definition'>applyFL</span> <span class='hs-varid'>opts</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-varid'>h</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Hunk</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-conop'>:&gt;:</span><span class='hs-varid'>the_ps</span><span class='hs-layout'>)</span>
<a name="line-62"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>spanFL</span> <span class='hs-varid'>f_hunk</span> <span class='hs-varid'>the_ps</span> <span class='hs-keyword'>of</span>
<a name="line-63"></a>       <span class='hs-layout'>(</span><span class='hs-varid'>xs</span> <span class='hs-conop'>:&gt;</span> <span class='hs-varid'>ps'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-64"></a>           <span class='hs-keyword'>do</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>foo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>h</span> <span class='hs-conop'>:&gt;:</span> <span class='hs-varid'>mapFL_FL</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>h'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>h'</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span>
<a name="line-65"></a>              <span class='hs-varid'>mModifyFilePS</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-varid'>hunkmod</span> <span class='hs-varid'>foo</span>
<a name="line-66"></a>              <span class='hs-keyword'>case</span> <span class='hs-varid'>h</span> <span class='hs-keyword'>of</span>
<a name="line-67"></a>                <span class='hs-layout'>(</span><span class='hs-conid'>Hunk</span> <span class='hs-num'>1</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</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-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"#!"</span> <span class='hs-varop'>`</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>isPrefixOf</span><span class='hs-varop'>`</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&amp;&amp;</span>
<a name="line-68"></a>                                   <span class='hs-conid'>SetScriptsExecutable</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span>
<a name="line-69"></a>                                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mSetFileExecutable</span> <span class='hs-varid'>f</span> <span class='hs-conid'>True</span>
<a name="line-70"></a>                <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-71"></a>              <span class='hs-varid'>applyFL</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>ps'</span>
<a name="line-72"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>f_hunk</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Hunk</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>f</span> <span class='hs-varop'>==</span> <span class='hs-varid'>f'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-73"></a>          <span class='hs-varid'>f_hunk</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-74"></a>          <span class='hs-varid'>hunkmod</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WriteableDirectory</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>FL</span> <span class='hs-conid'>FilePatchType</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>
<a name="line-75"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-76"></a>          <span class='hs-varid'>hunkmod</span> <span class='hs-conid'>NilFL</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ps</span>
<a name="line-77"></a>          <span class='hs-varid'>hunkmod</span> <span class='hs-layout'>(</span><span class='hs-conid'>Hunk</span> <span class='hs-varid'>line</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span><span class='hs-conop'>:&gt;:</span><span class='hs-varid'>hs</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span>
<a name="line-78"></a>           <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>applyHunkLines</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>line</span><span class='hs-layout'>,</span><span class='hs-varid'>old</span><span class='hs-layout'>,</span><span class='hs-varid'>new</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>of</span>
<a name="line-79"></a>                 <span class='hs-conid'>Just</span> <span class='hs-varid'>ps'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>hunkmod</span> <span class='hs-varid'>hs</span> <span class='hs-varid'>ps'</span>
<a name="line-80"></a>                 <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Error applying hunk to file "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f</span>
<a name="line-81"></a>          <span class='hs-varid'>hunkmod</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>impossible</span>
<a name="line-82"></a><span class='hs-definition'>applyFL</span> <span class='hs-varid'>opts</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&gt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>apply</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>p</span>
<a name="line-83"></a>                           <span class='hs-varid'>applyFL</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>ps</span>
</pre>\end{code}

\subsection{Hunk patches}

Hunks are an example of a complex filepatch.  A hunk is a set of lines of a
text file to be replaced by a different set of lines.  Either of these sets
may be empty, which would mean a deletion or insertion of lines.
\begin{code}
<pre><a name="line-1"></a><a name="applyHunks"></a><span class='hs-definition'>applyHunks</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-2"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span>
<a name="line-3"></a><span class='hs-definition'>applyHunks</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ps</span><span class='hs-keyglyph'>]</span>
<a name="line-4"></a><span class='hs-definition'>applyHunks</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>hs</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span>
<a name="line-5"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>break_before_nth_newline</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span> <span class='hs-comment'>-</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>of</span>
<a name="line-6"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>prfix</span><span class='hs-layout'>,</span> <span class='hs-varid'>after_prefix</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>rest</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>applyHunks</span> <span class='hs-varid'>hs</span> <span class='hs-varid'>after_prefix</span>
<a name="line-7"></a>                                  <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>intersperse</span> <span class='hs-varid'>nl</span> <span class='hs-layout'>(</span><span class='hs-varid'>prfix</span><span class='hs-conop'>:</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-varid'>rest</span>
<a name="line-8"></a>                                       <span class='hs-keyword'>where</span> <span class='hs-varid'>nl</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>'\n'</span>
<a name="line-9"></a><span class='hs-definition'>applyHunks</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>hs</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span>
<a name="line-10"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>break_before_nth_newline</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span> <span class='hs-comment'>-</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>of</span>
<a name="line-11"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>prfix</span><span class='hs-layout'>,</span> <span class='hs-varid'>after_prefix</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-12"></a>          <span class='hs-keyword'>case</span> <span class='hs-varid'>break_before_nth_newline</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-varid'>after_prefix</span> <span class='hs-keyword'>of</span>
<a name="line-13"></a>          <span class='hs-layout'>(</span><span class='hs-varid'>oo</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>oo</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>unlinesPS</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span><span class='hs-conop'>:</span><span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"applyHunks error"</span>
<a name="line-14"></a>          <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>suffix</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-15"></a>              <span class='hs-keyword'>do</span> <span class='hs-varid'>rest</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>applyHunks</span> <span class='hs-varid'>hs</span> <span class='hs-varid'>suffix</span>
<a name="line-16"></a>                 <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>intersperse</span> <span class='hs-varid'>nl</span> <span class='hs-layout'>(</span><span class='hs-varid'>prfix</span><span class='hs-conop'>:</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-varid'>rest</span>
<a name="line-17"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>nl</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>'\n'</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="applyHunkLines"></a><span class='hs-definition'>applyHunkLines</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-20"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FileContents</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>FileContents</span>
<a name="line-21"></a><span class='hs-definition'>applyHunkLines</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>c</span>
<a name="line-22"></a><span class='hs-definition'>applyHunkLines</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unlinesPS</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>++</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-definition'>applyHunkLines</span> <span class='hs-varid'>hs</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>hs'</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span>
<a name="line-24"></a> <span class='hs-keyword'>do</span> <span class='hs-varid'>pss</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>of</span>
<a name="line-25"></a>           <span class='hs-num'>1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>break_after_nth_newline</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>of</span>
<a name="line-26"></a>                <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>ps</span> <span class='hs-varop'>==</span> <span class='hs-varid'>unlinesPS</span> <span class='hs-varid'>o</span>
<a name="line-27"></a>                           <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>intersperse</span> <span class='hs-varid'>nl</span> <span class='hs-varid'>n</span>
<a name="line-28"></a>                           <span class='hs-keyword'>else</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"applyHunkLines: Unexpected hunks"</span>
<a name="line-29"></a>                <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>shouldbeo</span><span class='hs-layout'>,</span> <span class='hs-varid'>suffix</span><span class='hs-layout'>)</span>
<a name="line-30"></a>                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>shouldbeo</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>unlinesPS</span> <span class='hs-layout'>(</span><span class='hs-varid'>o</span><span class='hs-varop'>++</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-31"></a>                        <span class='hs-varid'>fail</span> <span class='hs-varop'>$</span> <span class='hs-str'>"applyHunkLines: Bad patch!"</span>
<a name="line-32"></a>                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>null</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-33"></a>                        <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>applyHunkLines</span> <span class='hs-varid'>hs'</span> <span class='hs-varid'>suffix</span>
<a name="line-34"></a>                           <span class='hs-varid'>return</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span>
<a name="line-35"></a>                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-36"></a>                        <span class='hs-keyword'>do</span> <span class='hs-varid'>rest</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>applyHunks</span> <span class='hs-varid'>hs'</span> <span class='hs-varid'>suffix</span>
<a name="line-37"></a>                           <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>intersperse</span> <span class='hs-varid'>nl</span> <span class='hs-varid'>n</span> <span class='hs-varop'>++</span> <span class='hs-varid'>nl</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span>
<a name="line-38"></a>           <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>bug</span> <span class='hs-str'>"Prim.applyHunkLines: After -ve lines?"</span>
<a name="line-39"></a>             <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>applyHunks</span> <span class='hs-varid'>hs</span> <span class='hs-varid'>ps</span>
<a name="line-40"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>result</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>concat</span> <span class='hs-varid'>pss</span>
<a name="line-41"></a>    <span class='hs-varid'>return</span> <span class='hs-varid'>result</span>
<a name="line-42"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>nl</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>'\n'</span>
</pre>\end{code}

\subsection{Token replace patches}\label{token_replace}

Although most filepatches will be hunks, darcs is clever enough to support
other types of changes as well.  A ``token replace'' patch replaces all
instances of a given token with some other version.  A token, here, is
defined by a regular expression, which must be of the simple [a--z\ldots]\ type,
indicating which characters are allowed in a token, with all other
characters acting as delimiters.  For example, a C identifier would be a
token with the flag \verb![A-Za-z_0-9]!.

\begin{code}
<pre><a name="line-1"></a><a name="forceTokReplace"></a><span class='hs-definition'>forceTokReplace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-2"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FileContents</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>FileContents</span>
<a name="line-3"></a><span class='hs-definition'>forceTokReplace</span> <span class='hs-varid'>t</span> <span class='hs-varid'>os</span> <span class='hs-varid'>ns</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unlinesPS</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>forceReplace</span> <span class='hs-varop'>$</span> <span class='hs-varid'>linesPS</span> <span class='hs-varid'>c</span>
<a name="line-4"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>os</span>
<a name="line-5"></a>          <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>ns</span>
<a name="line-6"></a>          <span class='hs-varid'>tokchar</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>regChars</span> <span class='hs-varid'>t</span>
<a name="line-7"></a>          <span class='hs-varid'>toks_and_intratoks</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-8"></a>          <span class='hs-varid'>toks_and_intratoks</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span>
<a name="line-9"></a>              <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>before</span><span class='hs-layout'>,</span><span class='hs-varid'>s'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>break</span> <span class='hs-varid'>tokchar</span> <span class='hs-varid'>ps</span>
<a name="line-10"></a>                  <span class='hs-layout'>(</span><span class='hs-varid'>tok</span><span class='hs-layout'>,</span> <span class='hs-varid'>after</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>break</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tokchar</span><span class='hs-layout'>)</span> <span class='hs-varid'>s'</span>
<a name="line-11"></a>                  <span class='hs-keyword'>in</span> <span class='hs-varid'>before</span> <span class='hs-conop'>:</span> <span class='hs-varid'>tok</span> <span class='hs-conop'>:</span> <span class='hs-varid'>toks_and_intratoks</span> <span class='hs-varid'>after</span>
<a name="line-12"></a>          <span class='hs-varid'>forceReplace</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>concat</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>o_t_n</span> <span class='hs-varop'>$</span> <span class='hs-varid'>toks_and_intratoks</span> <span class='hs-varid'>ps</span>
<a name="line-13"></a>          <span class='hs-varid'>o_t_n</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>s</span> <span class='hs-varop'>==</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span>
<a name="line-14"></a>                  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span>
</pre>\end{code}

What makes the token replace patch special is the fact that a token replace
can be merged with almost any ordinary hunk, giving exactly what you would
want.  For example, you might want to change the patch type {\tt
TokReplace} to {\tt TokenReplace} (if you decided that saving two
characters of space was stupid).  If you did this using hunks, it would
modify every line where {\tt TokReplace} occurred, and quite likely provoke
a conflict with another patch modifying those lines.  On the other hand, if
you did this using a token replace patch, the only change that it could
conflict with would be if someone else had used the token ``{\tt
TokenReplace}'' in their patch rather than TokReplace---and that actually
would be a real conflict!

%\section{Outputting interesting and useful information}

%Just being able to manipulate patches and trees is not enough.  We also
%want to be able to view the patches and files.  This requires another set
%of functions, closely related to the patch application functions, which
%will give us the necessary information to browse the changes we have made.
%It is \emph{not} the Patch module's responsibility to add any sort of
%markup or formatting, but simply to provide the information necessary for an
%external module to do the formatting.

\begin{code}
<pre><a name="line-1"></a><a name="LineMark"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>LineMark</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AddedLine</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>RemovedLine</span> <span class='hs-conid'>PatchInfo</span>
<a name="line-2"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-conid'>AddedRemovedLine</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>None</span>
<a name="line-3"></a>                <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-4"></a><a name="MarkedUpFile"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>MarkedUpFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</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-conid'>LineMark</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-5"></a><a name="emptyMarkedupFile"></a><span class='hs-definition'>emptyMarkedupFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MarkedUpFile</span>
<a name="line-6"></a><span class='hs-definition'>emptyMarkedupFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-conid'>None</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="markupFile"></a><span class='hs-definition'>markupFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Effect</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</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>
<a name="line-9"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>MarkedUpFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>MarkedUpFile</span><span class='hs-layout'>)</span>
<a name="line-10"></a><span class='hs-definition'>markupFile</span> <span class='hs-varid'>x</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mps</span> <span class='hs-layout'>(</span><span class='hs-varid'>effect</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-11"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>mps</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FL</span> <span class='hs-conid'>Prim</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>MarkedUpFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>MarkedUpFile</span><span class='hs-layout'>)</span>
<a name="line-12"></a>          <span class='hs-varid'>mps</span> <span class='hs-conid'>NilFL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-13"></a>          <span class='hs-varid'>mps</span> <span class='hs-layout'>(</span><span class='hs-varid'>pp</span><span class='hs-conop'>:&gt;:</span><span class='hs-varid'>pps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mps</span> <span class='hs-varid'>pps</span> <span class='hs-varop'>.</span> <span class='hs-varid'>markup_prim</span> <span class='hs-varid'>x</span> <span class='hs-varid'>pp</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="markup_prim"></a><span class='hs-definition'>markup_prim</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prim</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>
<a name="line-16"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>MarkedUpFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>MarkedUpFile</span><span class='hs-layout'>)</span>
<a name="line-17"></a><span class='hs-definition'>markup_prim</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Split</span> <span class='hs-conid'>NilFL</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-18"></a><span class='hs-definition'>markup_prim</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-conid'>Split</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&gt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>markup_prim</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-conid'>Split</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-19"></a>                                       <span class='hs-varid'>markup_prim</span> <span class='hs-varid'>n</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-20"></a><span class='hs-definition'>markup_prim</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>AddFile</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-definition'>markup_prim</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>RmFile</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-definition'>markup_prim</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Hunk</span> <span class='hs-varid'>line</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-23"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f'</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-24"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-varid'>line</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-25"></a><span class='hs-definition'>markup_prim</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f'</span> <span class='hs-layout'>(</span><span class='hs-conid'>TokReplace</span> <span class='hs-varid'>t</span> <span class='hs-varid'>o</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-26"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f'</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-27"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>markup_tok</span> <span class='hs-varid'>name</span> <span class='hs-varid'>t</span> <span class='hs-varid'>o</span> <span class='hs-varid'>n</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-28"></a><span class='hs-definition'>markup_prim</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-29"></a><span class='hs-definition'>markup_prim</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Move</span> <span class='hs-varid'>d</span> <span class='hs-varid'>d'</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varop'>$</span> <span class='hs-varid'>movedirfilename</span> <span class='hs-varid'>d</span> <span class='hs-varid'>d'</span> <span class='hs-layout'>(</span><span class='hs-varid'>fp2fn</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-30"></a><span class='hs-definition'>markup_prim</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>ChangePref</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-definition'>markup_prim</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Identity</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-32"></a><span class='hs-definition'>markup_prim</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Binary</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-33"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f'</span> <span class='hs-varop'>==</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Binary file"</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-34"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="markup_hunk"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span>
<a name="line-37"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MarkedUpFile</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MarkedUpFile</span>
<a name="line-38"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-varid'>l</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>RemovedLine</span> <span class='hs-varid'>pi</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-39"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>RemovedLine</span> <span class='hs-varid'>pi</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-varid'>l</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-varid'>mk</span>
<a name="line-40"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-varid'>l</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedRemovedLine</span> <span class='hs-varid'>po</span> <span class='hs-varid'>pn</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-41"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedRemovedLine</span> <span class='hs-varid'>po</span> <span class='hs-varid'>pn</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-varid'>l</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-varid'>mk</span>
<a name="line-42"></a>
<a name="line-43"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-varid'>name</span> <span class='hs-num'>1</span> <span class='hs-varid'>old</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-varid'>ns</span><span class='hs-layout'>)</span> <span class='hs-varid'>mk</span> <span class='hs-keyglyph'>=</span>
<a name="line-44"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>name</span> <span class='hs-num'>1</span> <span class='hs-varid'>old</span> <span class='hs-varid'>ns</span> <span class='hs-varid'>mk</span>
<a name="line-45"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-num'>1</span> <span class='hs-layout'>(</span><span class='hs-varid'>o</span><span class='hs-conop'>:</span><span class='hs-varid'>os</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>None</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-46"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>o</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sf</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>RemovedLine</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-num'>1</span> <span class='hs-varid'>os</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>mk</span>
<a name="line-47"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Error in patch application"</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-48"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-num'>1</span> <span class='hs-layout'>(</span><span class='hs-varid'>o</span><span class='hs-conop'>:</span><span class='hs-varid'>os</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>nold</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-49"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>o</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sf</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedRemovedLine</span> <span class='hs-varid'>nold</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-num'>1</span> <span class='hs-varid'>os</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>mk</span>
<a name="line-50"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Error in patch application"</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-51"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-keyword'>_</span> <span class='hs-num'>1</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>mk</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk</span>
<a name="line-52"></a>
<a name="line-53"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-varid'>l</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>pi</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-54"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>pi</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-varid'>mk</span>
<a name="line-55"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>pi</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-varid'>mk</span>
<a name="line-56"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-varid'>l</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>None</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>mk</span><span class='hs-layout'>)</span>
<a name="line-57"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>None</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-varid'>mk</span>
<a name="line-58"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>None</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>markup_hunk</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>old</span> <span class='hs-varid'>new</span> <span class='hs-varid'>mk</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-61"></a>
<a name="line-62"></a><span class='hs-definition'>markup_hunk</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>mk</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Error: "</span><span class='hs-layout'>,</span><span class='hs-conid'>None</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>mk</span>
<a name="line-63"></a>
<a name="line-64"></a><a name="markup_tok"></a><span class='hs-definition'>markup_tok</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-65"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MarkedUpFile</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MarkedUpFile</span>
<a name="line-66"></a><span class='hs-definition'>markup_tok</span> <span class='hs-varid'>name</span> <span class='hs-varid'>t</span> <span class='hs-varid'>ostr</span> <span class='hs-varid'>nstr</span> <span class='hs-varid'>mk</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-varid'>mt</span> <span class='hs-varid'>mk</span>
<a name="line-67"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>ostr</span>
<a name="line-68"></a>          <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>nstr</span>
<a name="line-69"></a>          <span class='hs-varid'>mt</span> <span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>pi</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-70"></a>              <span class='hs-keyword'>case</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>concat</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>try_tok_internal</span> <span class='hs-varid'>t</span> <span class='hs-varid'>o</span> <span class='hs-varid'>n</span> <span class='hs-varid'>sf</span> <span class='hs-keyword'>of</span>
<a name="line-71"></a>              <span class='hs-conid'>Just</span> <span class='hs-varid'>sf'</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>sf'</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>pi</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-72"></a>                       <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedRemovedLine</span> <span class='hs-varid'>pi</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-73"></a>                                       <span class='hs-layout'>(</span><span class='hs-varid'>sf'</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-74"></a>              <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-75"></a>                  <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>sf</span><span class='hs-layout'>,</span> <span class='hs-conid'>AddedLine</span> <span class='hs-varid'>pi</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-76"></a>                   <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"There seems to be an inconsistency..."</span><span class='hs-layout'>,</span> <span class='hs-conid'>None</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-77"></a>                   <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Please run darcs check."</span><span class='hs-layout'>,</span> <span class='hs-conid'>None</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-78"></a>          <span class='hs-varid'>mt</span> <span class='hs-varid'>mark</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mark</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

%files or directories, changed by a patch
%we get it solely from the patch here
%instead of performing patch apply on a population
%we !could! achieve the same by applying a patch to a cleaned population
%and getting modified files and dirs
%but this should be significantly slower when the population grows large
%This could be useful for just presenting a summary of what a patch does
%(especially useful for larger repos)

\begin{code}
<pre><a name="line-1"></a><a name="patchChanges"></a><span class='hs-definition'>patchChanges</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Prim</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-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-conid'>DirMark</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-2"></a><span class='hs-definition'>patchChanges</span> <span class='hs-layout'>(</span><span class='hs-conid'>Move</span> <span class='hs-varid'>f1</span> <span class='hs-varid'>f2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f1</span><span class='hs-layout'>,</span><span class='hs-conid'>MovedFile</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f2</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-3"></a>                             <span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f2</span><span class='hs-layout'>,</span><span class='hs-conid'>MovedFile</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f1</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-4"></a><span class='hs-definition'>patchChanges</span> <span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-varid'>d</span> <span class='hs-conid'>AddDir</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-conid'>AddedDir</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-5"></a><span class='hs-definition'>patchChanges</span> <span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-varid'>d</span> <span class='hs-conid'>RmDir</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-conid'>RemovedDir</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-6"></a><span class='hs-definition'>patchChanges</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-conid'>AddFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-conid'>AddedFile</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-7"></a><span class='hs-definition'>patchChanges</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-conid'>RmFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-conid'>RemovedFile</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-8"></a><span class='hs-definition'>patchChanges</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-conid'>ModifiedFile</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-9"></a><span class='hs-definition'>patchChanges</span> <span class='hs-layout'>(</span><span class='hs-conid'>Split</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concat</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mapFL</span> <span class='hs-varid'>patchChanges</span> <span class='hs-varid'>ps</span>
<a name="line-10"></a><span class='hs-definition'>patchChanges</span> <span class='hs-layout'>(</span><span class='hs-conid'>ChangePref</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-11"></a><span class='hs-definition'>patchChanges</span> <span class='hs-conid'>Identity</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
</pre>\end{code}

%apply a patch to a population at a given time

\begin{code}
<pre><a name="line-1"></a><a name="applyToPop"></a><span class='hs-definition'>applyToPop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FL</span> <span class='hs-conid'>Prim</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'>Population</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Population</span>
<a name="line-2"></a><span class='hs-definition'>applyToPop</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>NilFL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-3"></a><span class='hs-definition'>applyToPop</span> <span class='hs-varid'>pinf</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:&gt;:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>applyToPop</span> <span class='hs-varid'>pinf</span> <span class='hs-varid'>ps</span> <span class='hs-varop'>.</span> <span class='hs-varid'>applyToPop'</span> <span class='hs-varid'>pinf</span> <span class='hs-varid'>p</span> 
<a name="line-4"></a>
<a name="line-5"></a><a name="applyToPop'"></a><span class='hs-definition'>applyToPop'</span>
<a name="line-6"></a>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prim</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'>Population</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Population</span>
<a name="line-7"></a><span class='hs-definition'>applyToPop'</span> <span class='hs-varid'>pi</span> <span class='hs-varid'>patch</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pop</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>tree</span><span class='hs-layout'>)</span>
<a name="line-8"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pop</span> <span class='hs-varid'>pi</span> <span class='hs-layout'>(</span><span class='hs-varid'>applyToPopTree</span> <span class='hs-varid'>patch</span> <span class='hs-varid'>tree</span><span class='hs-layout'>)</span>
<a name="line-9"></a>   <span class='hs-comment'>-- ``pi'' is global below!</span>
<a name="line-10"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>applyToPopTree</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Prim</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'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span>
<a name="line-11"></a>       <span class='hs-varid'>applyToPopTree</span> <span class='hs-layout'>(</span><span class='hs-conid'>Split</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span>
<a name="line-12"></a>        <span class='hs-varid'>foldlFL</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>t</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>applyToPopTree</span> <span class='hs-varid'>p</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span> <span class='hs-varid'>ps</span>
<a name="line-13"></a>       <span class='hs-varid'>applyToPopTree</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-conid'>AddFile</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span>
<a name="line-14"></a>           <span class='hs-keyword'>let</span> <span class='hs-varid'>xxx</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>split</span> <span class='hs-chr'>'/'</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2ps</span>  <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyword'>in</span>
<a name="line-15"></a>               <span class='hs-varid'>popChange</span> <span class='hs-varid'>xxx</span> <span class='hs-varid'>p</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fst</span> <span class='hs-varop'>$</span> <span class='hs-varid'>breakP</span> <span class='hs-varid'>xxx</span> <span class='hs-varid'>tr</span>
<a name="line-16"></a>       <span class='hs-varid'>applyToPopTree</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>popChange</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>split</span> <span class='hs-chr'>'/'</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2ps</span>  <span class='hs-varid'>f</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span> <span class='hs-varid'>tr</span>
<a name="line-17"></a>       <span class='hs-varid'>applyToPopTree</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-varid'>f</span> <span class='hs-conid'>AddDir</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span>
<a name="line-18"></a>           <span class='hs-keyword'>let</span> <span class='hs-varid'>xxx</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>split</span> <span class='hs-chr'>'/'</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2ps</span>  <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyword'>in</span>
<a name="line-19"></a>               <span class='hs-varid'>popChange</span> <span class='hs-varid'>xxx</span> <span class='hs-varid'>p</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fst</span> <span class='hs-varop'>$</span> <span class='hs-varid'>breakP</span> <span class='hs-varid'>xxx</span> <span class='hs-varid'>tr</span>
<a name="line-20"></a>       <span class='hs-varid'>applyToPopTree</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-varid'>d</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>popChange</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>split</span> <span class='hs-chr'>'/'</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2ps</span>  <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span> <span class='hs-varid'>tr</span>
<a name="line-21"></a>       <span class='hs-comment'>-- precondition: ``to'' does not exist yet!</span>
<a name="line-22"></a>       <span class='hs-varid'>applyToPopTree</span> <span class='hs-layout'>(</span><span class='hs-conid'>Move</span> <span class='hs-varid'>from</span> <span class='hs-varid'>to</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span>
<a name="line-23"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>breakP</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>split</span> <span class='hs-chr'>'/'</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2ps</span> <span class='hs-varid'>from</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-24"></a>               <span class='hs-varid'>fst</span> <span class='hs-varop'>$</span> <span class='hs-varid'>breakP</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>split</span> <span class='hs-chr'>'/'</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fn2ps</span> <span class='hs-varid'>to</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span> <span class='hs-keyword'>of</span>
<a name="line-25"></a>           <span class='hs-layout'>(</span><span class='hs-varid'>tr'</span><span class='hs-layout'>,</span><span class='hs-conid'>Just</span> <span class='hs-varid'>ins</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-26"></a>               <span class='hs-keyword'>let</span> <span class='hs-varid'>to'</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>split</span> <span class='hs-chr'>'/'</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2ps</span> <span class='hs-varid'>to</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-27"></a>                   <span class='hs-varid'>ins'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>ins</span> <span class='hs-keyword'>of</span>
<a name="line-28"></a>                          <span class='hs-conid'>PopDir</span> <span class='hs-varid'>i</span> <span class='hs-varid'>trs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopDir</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-layout'>{</span><span class='hs-varid'>nameI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>last</span> <span class='hs-varid'>to'</span><span class='hs-layout'>,</span>
<a name="line-29"></a>                                                     <span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-30"></a>                                                     <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MovedDir</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>from</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-31"></a>                                                 <span class='hs-varid'>trs</span>
<a name="line-32"></a>                          <span class='hs-conid'>PopFile</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-layout'>{</span><span class='hs-varid'>nameI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>last</span> <span class='hs-varid'>to'</span><span class='hs-layout'>,</span>
<a name="line-33"></a>                                                   <span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-34"></a>                                                   <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MovedFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn2fp</span> <span class='hs-varid'>from</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-35"></a>                             <span class='hs-keyword'>in</span> <span class='hs-varid'>insertP</span> <span class='hs-varid'>to'</span> <span class='hs-varid'>tr'</span> <span class='hs-varid'>ins'</span>
<a name="line-36"></a>           <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tr</span> <span class='hs-comment'>-- ignore the move if ``from'' couldn't be found</span>
<a name="line-37"></a>       <span class='hs-varid'>applyToPopTree</span> <span class='hs-layout'>(</span><span class='hs-conid'>ChangePref</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tr</span>
<a name="line-38"></a>       <span class='hs-varid'>applyToPopTree</span> <span class='hs-conid'>Identity</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tr</span>
<a name="line-39"></a>
<a name="line-40"></a>       <span class='hs-comment'>-- insert snd arg into fst arg</span>
<a name="line-41"></a>       <span class='hs-varid'>insertP</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span>
<a name="line-42"></a>       <span class='hs-varid'>insertP</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>parent</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>org</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span>
<a name="line-43"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>parent</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>tr</span><span class='hs-conop'>:</span><span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-44"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>org</span>
<a name="line-45"></a>       <span class='hs-varid'>insertP</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-varid'>org</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span>
<a name="line-46"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs'</span>
<a name="line-47"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>org</span>
<a name="line-48"></a>          <span class='hs-keyword'>where</span> <span class='hs-varid'>trs'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>o</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>insertP</span> <span class='hs-varid'>rest</span> <span class='hs-varid'>o</span> <span class='hs-varid'>tr</span><span class='hs-layout'>)</span> <span class='hs-varid'>trs</span>
<a name="line-49"></a>       <span class='hs-varid'>insertP</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>org</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>org</span>
<a name="line-50"></a>
<a name="line-51"></a>       <span class='hs-comment'>-- change a population according to a patch</span>
<a name="line-52"></a>       <span class='hs-varid'>popChange</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prim</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'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span>
<a name="line-53"></a>       <span class='hs-varid'>popChange</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>parent</span><span class='hs-layout'>,</span><span class='hs-varid'>path</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-varid'>d</span> <span class='hs-conid'>AddDir</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-54"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>parent</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>new</span><span class='hs-conop'>:</span><span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-55"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tr</span>
<a name="line-56"></a>              <span class='hs-keyword'>where</span> <span class='hs-varid'>new</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopDir</span> <span class='hs-layout'>(</span><span class='hs-conid'>Info</span> <span class='hs-layout'>{</span><span class='hs-varid'>nameI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>path</span><span class='hs-layout'>,</span>
<a name="line-57"></a>                                        <span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-58"></a>                                        <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AddedDir</span><span class='hs-layout'>,</span>
<a name="line-59"></a>                                        <span class='hs-varid'>createdByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-60"></a>                                        <span class='hs-varid'>creationNameI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fn2ps</span> <span class='hs-varid'>d</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span>
<a name="line-61"></a>       <span class='hs-comment'>-- only mark a directory (and contents) as ``deleted'' do not delete it actually</span>
<a name="line-62"></a>       <span class='hs-varid'>popChange</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>path</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>DP</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>RmDir</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-63"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>path</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopDir</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>{</span><span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-64"></a>                                         <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RemovedDir</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>trs'</span>
<a name="line-65"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tr</span>
<a name="line-66"></a>          <span class='hs-keyword'>where</span> <span class='hs-varid'>trs'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>markDel</span> <span class='hs-varid'>trs</span> <span class='hs-comment'>-- recursively ``delete'' the contents</span>
<a name="line-67"></a>
<a name="line-68"></a>       <span class='hs-varid'>popChange</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>parent</span><span class='hs-layout'>,</span><span class='hs-varid'>path</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-varid'>d</span> <span class='hs-conid'>AddFile</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-69"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>parent</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>new</span><span class='hs-conop'>:</span><span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-70"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tr</span>
<a name="line-71"></a>              <span class='hs-keyword'>where</span> <span class='hs-varid'>new</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopFile</span> <span class='hs-layout'>(</span><span class='hs-conid'>Info</span> <span class='hs-layout'>{</span><span class='hs-varid'>nameI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>path</span><span class='hs-layout'>,</span>
<a name="line-72"></a>                                         <span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-73"></a>                                         <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AddedFile</span><span class='hs-layout'>,</span>
<a name="line-74"></a>                                         <span class='hs-varid'>createdByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-75"></a>                                         <span class='hs-varid'>creationNameI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fn2ps</span> <span class='hs-varid'>d</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-76"></a>       <span class='hs-varid'>popChange</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>path</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>RmFile</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-77"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>path</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>{</span><span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-78"></a>                                         <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RemovedFile</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-79"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tr</span>
<a name="line-80"></a>       <span class='hs-varid'>popChange</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>path</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>FP</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-81"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>path</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-82"></a>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>{</span><span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-83"></a>                         <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>modifiedHowI</span> <span class='hs-varid'>f</span> <span class='hs-varop'>==</span> <span class='hs-conid'>AddedFile</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>modifiedByI</span> <span class='hs-varid'>f</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pi</span>
<a name="line-84"></a>                                        <span class='hs-keyword'>then</span> <span class='hs-conid'>AddedFile</span>
<a name="line-85"></a>                                        <span class='hs-keyword'>else</span> <span class='hs-conid'>ModifiedFile</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-86"></a>       <span class='hs-varid'>popChange</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span> <span class='hs-varid'>tr</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-87"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>popChange</span> <span class='hs-varid'>rest</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-88"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tr</span>
<a name="line-89"></a>       <span class='hs-varid'>popChange</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tr</span>
<a name="line-90"></a>       <span class='hs-varid'>markDel</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopDir</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>{</span><span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-91"></a>                                           <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RemovedDir</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>trs'</span>
<a name="line-92"></a>                <span class='hs-keyword'>where</span> <span class='hs-varid'>trs'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>markDel</span> <span class='hs-varid'>trs</span>
<a name="line-93"></a>       <span class='hs-varid'>markDel</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PopFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>{</span><span class='hs-varid'>modifiedByI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span><span class='hs-layout'>,</span>
<a name="line-94"></a>                                         <span class='hs-varid'>modifiedHowI</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RemovedFile</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-95"></a>
<a name="line-96"></a><a name="breakP"></a><span class='hs-comment'>-- break a poptree fst: org tree with subtree removed,</span>
<a name="line-97"></a><span class='hs-comment'>--                 snd: removed subtree</span>
<a name="line-98"></a><span class='hs-definition'>breakP</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopTree</span><span class='hs-layout'>,</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>PopTree</span><span class='hs-layout'>)</span>
<a name="line-99"></a><span class='hs-definition'>breakP</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>parent</span><span class='hs-layout'>,</span><span class='hs-varid'>path</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>tr</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trees</span><span class='hs-layout'>)</span>
<a name="line-100"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>parent</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>findRem</span> <span class='hs-varid'>path</span> <span class='hs-varid'>trees</span> <span class='hs-keyword'>of</span>
<a name="line-101"></a>                         <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>trees'</span><span class='hs-layout'>,</span><span class='hs-varid'>tree'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trees'</span><span class='hs-layout'>,</span><span class='hs-conid'>Just</span> <span class='hs-varid'>tree'</span><span class='hs-layout'>)</span>
<a name="line-102"></a>                         <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tr</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-103"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>tr</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-104"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>findRem</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-105"></a>       <span class='hs-varid'>findRem</span> <span class='hs-varid'>the_path</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span><span class='hs-conop'>:</span><span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-106"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>the_path</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pname</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>trs</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-107"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>(</span><span class='hs-varid'>trs'</span><span class='hs-layout'>,</span><span class='hs-varid'>d'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>findRem</span> <span class='hs-varid'>the_path</span> <span class='hs-varid'>trs</span>
<a name="line-108"></a>                         <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span><span class='hs-conop'>:</span><span class='hs-varid'>trs'</span><span class='hs-layout'>,</span><span class='hs-varid'>d'</span><span class='hs-layout'>)</span>
<a name="line-109"></a><span class='hs-definition'>breakP</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-varid'>tr</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-110"></a> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>catMaybes</span> <span class='hs-varid'>inss</span> <span class='hs-keyword'>of</span>
<a name="line-111"></a>                    <span class='hs-keyglyph'>[</span><span class='hs-varid'>ins</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>f</span> <span class='hs-varid'>trs'</span><span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>ins</span><span class='hs-layout'>)</span>
<a name="line-112"></a>                    <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tr</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-113"></a>                    <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-str'>"breakP: more than one break"</span>
<a name="line-114"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>tr</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-115"></a>   <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>trs'</span><span class='hs-layout'>,</span><span class='hs-varid'>inss</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>breakP</span> <span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-varid'>trs</span><span class='hs-layout'>)</span>
<a name="line-116"></a><span class='hs-definition'>breakP</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>tr</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-117"></a>
<a name="line-118"></a><a name="pname"></a><span class='hs-definition'>pname</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-119"></a><span class='hs-definition'>pname</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nameI</span> <span class='hs-varid'>i</span>
<a name="line-120"></a><span class='hs-definition'>pname</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nameI</span> <span class='hs-varid'>i</span>
<a name="line-121"></a>
<a name="line-122"></a><a name="applyToTree"></a><span class='hs-comment'>-- | Apply a patch to a 'Tree', yielding a new 'Tree'.</span>
<a name="line-123"></a><span class='hs-definition'>applyToTree</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Apply</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</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'>Tree</span> <span class='hs-conid'>IO</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tree</span> <span class='hs-conid'>IO</span><span class='hs-layout'>)</span>
<a name="line-124"></a><span class='hs-definition'>applyToTree</span> <span class='hs-varid'>patch</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>virtualTreeIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>apply</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>patch</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span>
<a name="line-125"></a>
</pre>\end{code}

</body>
</html>