--  Copyright (C) 2002-2003 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.

{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Darcs.Patch.V1.Commute
    (
      merge,
      merger, unravel,
      publicUnravel,
    )
       where

import Prelude ()
import Darcs.Prelude

import Control.Monad ( MonadPlus, mplus, msum, mzero, guard )
import Control.Applicative ( Alternative(..) )

import Darcs.Patch.Commute ( selfCommuter )
import Darcs.Patch.CommuteFn ( commuterIdFL, commuterFLId )
import Darcs.Util.Path ( FileName )
import Darcs.Util.Printer ( errorDoc )
import Darcs.Patch.Invert ( invertRL )
import Darcs.Patch.Merge ( Merge(..), naturalMerge )
import Darcs.Patch.Commute ( Commute(..) )
import Darcs.Patch.Invert ( Invert(..) )
import Darcs.Patch.Inspect ( PatchInspect(..) )
import Darcs.Patch.V1.Core ( RepoPatchV1(..),
                             isMerger,
                             mergerUndo )
import Darcs.Patch.Conflict
    ( Conflict(..), listConflictedFiles
    , IsConflictedPrim(..), ConflictState(..), CommuteNoConflicts(..)
    , mangleUnravelled
    )
import Darcs.Patch.Effect ( Effect(..) )
import Darcs.Patch.FileHunk ( IsHunk(..) )
import Darcs.Patch.Prim ( FromPrim(..), PrimPatch,
                          is_filepatch, sortCoalesceFL,
                        )
import Darcs.Patch.Permutations ( headPermutationsRL, simpleHeadPermutationsFL )
import Darcs.Util.Printer ( text, vcat, ($$) )
import Darcs.Patch.V1.Show ( showPatch_ )
import Data.List ( nub, nubBy )
import Data.List.Ordered ( nubSort )
import Darcs.Patch.Witnesses.Sealed
    ( Sealed(..) , mapSeal, unseal, FlippedSeal(..), mapFlipped
    , unsafeUnseal, unsafeUnsealFlipped )
import Darcs.Patch.Witnesses.Eq ( EqCheck(..), Eq2(..) )
import Darcs.Patch.Witnesses.Unsafe
    ( unsafeCoerceP, unsafeCoercePStart
    , unsafeCoercePEnd )
import Darcs.Patch.Witnesses.Ordered
    ( mapFL_FL, mapFL,
    FL(..), RL(..),
    (:/\:)(..), (:\/:)(..), (:>)(..),
    lengthFL, mapRL,
    reverseFL, reverseRL, concatFL
    )

data Perhaps a = Unknown | Failed | Succeeded a

instance Functor Perhaps where
    fmap :: (a -> b) -> Perhaps a -> Perhaps b
fmap _ Unknown = Perhaps b
forall a. Perhaps a
Unknown
    fmap _ Failed = Perhaps b
forall a. Perhaps a
Failed
    fmap f :: a -> b
f (Succeeded x :: a
x) = b -> Perhaps b
forall a. a -> Perhaps a
Succeeded (a -> b
f a
x)

instance Applicative Perhaps where
    pure :: a -> Perhaps a
pure = a -> Perhaps a
forall a. a -> Perhaps a
Succeeded
    _ <*> :: Perhaps (a -> b) -> Perhaps a -> Perhaps b
<*> Failed = Perhaps b
forall a. Perhaps a
Failed
    _ <*> Unknown = Perhaps b
forall a. Perhaps a
Unknown
    Failed <*> _ = Perhaps b
forall a. Perhaps a
Failed
    Unknown <*> _ = Perhaps b
forall a. Perhaps a
Unknown
    Succeeded f :: a -> b
f <*> Succeeded x :: a
x = b -> Perhaps b
forall a. a -> Perhaps a
Succeeded (a -> b
f a
x)

instance  Monad Perhaps where
    (Succeeded x :: a
x) >>= :: Perhaps a -> (a -> Perhaps b) -> Perhaps b
>>= k :: a -> Perhaps b
k =  a -> Perhaps b
k a
x
    Failed   >>= _      =  Perhaps b
forall a. Perhaps a
Failed
    Unknown  >>= _      =  Perhaps b
forall a. Perhaps a
Unknown
    return :: a -> Perhaps a
return              =  a -> Perhaps a
forall a. a -> Perhaps a
Succeeded
#if MIN_VERSION_base(4,13,0)
instance MonadFail Perhaps where
#endif
    fail :: String -> Perhaps a
fail _              =  Perhaps a
forall a. Perhaps a
Unknown

instance Alternative Perhaps where
    empty :: Perhaps a
empty = Perhaps a
forall a. Perhaps a
Unknown
    Unknown <|> :: Perhaps a -> Perhaps a -> Perhaps a
<|> ys :: Perhaps a
ys    = Perhaps a
ys
    Failed  <|> _     = Perhaps a
forall a. Perhaps a
Failed
    (Succeeded x :: a
x) <|> _ = a -> Perhaps a
forall a. a -> Perhaps a
Succeeded a
x

instance  MonadPlus Perhaps where
    mzero :: Perhaps a
mzero = Perhaps a
forall a. Perhaps a
Unknown
    mplus :: Perhaps a -> Perhaps a -> Perhaps a
mplus = Perhaps a -> Perhaps a -> Perhaps a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)

toMaybe :: Perhaps a -> Maybe a
toMaybe :: Perhaps a -> Maybe a
toMaybe (Succeeded x :: a
x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
toMaybe _ = Maybe a
forall a. Maybe a
Nothing

toPerhaps :: Maybe a -> Perhaps a
toPerhaps :: Maybe a -> Perhaps a
toPerhaps (Just x :: a
x) = a -> Perhaps a
forall a. a -> Perhaps a
Succeeded a
x
toPerhaps Nothing = Perhaps a
forall a. Perhaps a
Failed

-- | 'cleverCommute' attempts to commute two patches @p1@ and @p2@, in their
-- original order, with the given commute function. If the commute function
-- doesn't know how to handle the patches (i.e. it returns Unknown as a
-- result), then we try again with @invert p2@ and @invert p1@ (inverting the
-- results, if succesful).
--
-- TODO: when can the first attempt fail, but the second not? What's so clever
-- in this function?
cleverCommute :: Invert prim => CommuteFunction prim -> CommuteFunction prim
cleverCommute :: CommuteFunction prim -> CommuteFunction prim
cleverCommute c :: CommuteFunction prim
c (p1 :: RepoPatchV1 prim wX wZ
p1 :> p2 :: RepoPatchV1 prim wZ wY
p2) = case (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
CommuteFunction prim
c (RepoPatchV1 prim wX wZ
p1 RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
p2) of
    Succeeded x :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x -> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. a -> Perhaps a
Succeeded (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x
    Failed -> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a
Failed
    Unknown -> case (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wY wX
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wY wX)
CommuteFunction prim
c (RepoPatchV1 prim wZ wY -> RepoPatchV1 prim wY wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wZ wY
p2 RepoPatchV1 prim wY wZ
-> RepoPatchV1 prim wZ wX
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wY wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wX wZ -> RepoPatchV1 prim wZ wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wX wZ
p1) of
                 Succeeded (ip1' :: RepoPatchV1 prim wY wZ
ip1' :> ip2' :: RepoPatchV1 prim wZ wX
ip2') -> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. a -> Perhaps a
Succeeded (RepoPatchV1 prim wZ wX -> RepoPatchV1 prim wX wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wZ wX
ip2' RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wY wZ -> RepoPatchV1 prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wY wZ
ip1')
                 Failed -> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a
Failed
                 Unknown -> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a
Unknown

-- | If we have two Filepatches which modify different files, we can return a
-- result early, since the patches trivially commute.
speedyCommute :: PrimPatch prim => CommuteFunction prim
speedyCommute :: CommuteFunction prim
speedyCommute (p1 :: RepoPatchV1 prim wX wZ
p1 :> p2 :: RepoPatchV1 prim wZ wY
p2)
    | Just m1 :: FileName
m1 <- RepoPatchV1 prim wX wZ -> Maybe FileName
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> Maybe FileName
isFilepatchMerger RepoPatchV1 prim wX wZ
p1
    , Just m2 :: FileName
m2 <- RepoPatchV1 prim wZ wY -> Maybe FileName
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> Maybe FileName
isFilepatchMerger RepoPatchV1 prim wZ wY
p2
    , FileName
m1 FileName -> FileName -> Bool
forall a. Eq a => a -> a -> Bool
/= FileName
m2 = (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. a -> Perhaps a
Succeeded (RepoPatchV1 prim wZ wY -> RepoPatchV1 prim wX Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RepoPatchV1 prim wZ wY
p2 RepoPatchV1 prim wX Any
-> RepoPatchV1 prim Any wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wX wZ -> RepoPatchV1 prim Any wY
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RepoPatchV1 prim wX wZ
p1)
    | Bool
otherwise = Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a
Unknown

everythingElseCommute :: forall prim . PrimPatch prim => CommuteFunction prim
everythingElseCommute :: CommuteFunction prim
everythingElseCommute (PP p1 :: prim wX wZ
p1 :> PP p2 :: prim wZ wY
p2) = Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Maybe a -> Perhaps a
toPerhaps (Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
 -> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY))
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a b. (a -> b) -> a -> b
$ do
    p2' :: prim wX wZ
p2' :> p1' :: prim wZ wY
p1' <- (:>) prim prim wX wY -> Maybe ((:>) prim prim wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (prim wX wZ
p1 prim wX wZ -> prim wZ wY -> (:>) prim prim wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> prim wZ wY
p2)
    (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (prim wX wZ -> RepoPatchV1 prim wX wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV1 prim wX wY
PP prim wX wZ
p2' RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> prim wZ wY -> RepoPatchV1 prim wZ wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV1 prim wX wY
PP prim wZ wY
p1')
everythingElseCommute ps :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
ps =
    [Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)]
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum [ CommuteFunction prim
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (prim :: * -> * -> *).
Invert prim =>
CommuteFunction prim -> CommuteFunction prim
cleverCommute CommuteFunction prim
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
commuteRecursiveMerger      (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
ps
         , CommuteFunction prim
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (prim :: * -> * -> *).
Invert prim =>
CommuteFunction prim -> CommuteFunction prim
cleverCommute CommuteFunction prim
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
otherCommuteRecursiveMerger (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
ps
         ]

{-
Note that it must be true that

commutex (A^-1 A, P) = Just (P, A'^-1 A')

and

if commutex (A, B) == Just (B', A')
then commutex (B^-1, A^-1) == Just (A'^-1, B'^-1)
-}

unsafeMerger :: PrimPatch prim => String -> RepoPatchV1 prim wX wY -> RepoPatchV1 prim wX wZ -> RepoPatchV1 prim wA wB
unsafeMerger :: String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger x :: String
x p1 :: RepoPatchV1 prim wX wY
p1 p2 :: RepoPatchV1 prim wX wZ
p2 = RepoPatchV1 prim wY wB -> RepoPatchV1 prim wA wB
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart (RepoPatchV1 prim wY wB -> RepoPatchV1 prim wA wB)
-> RepoPatchV1 prim wY wB -> RepoPatchV1 prim wA wB
forall a b. (a -> b) -> a -> b
$ Sealed (RepoPatchV1 prim wY) -> RepoPatchV1 prim wY wB
forall (a :: * -> *) wX. Sealed a -> a wX
unsafeUnseal (Sealed (RepoPatchV1 prim wY) -> RepoPatchV1 prim wY wB)
-> Sealed (RepoPatchV1 prim wY) -> RepoPatchV1 prim wY wB
forall a b. (a -> b) -> a -> b
$ String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> Sealed (RepoPatchV1 prim wY)
forall (prim :: * -> * -> *) wX wY wZ.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> Sealed (RepoPatchV1 prim wY)
merger String
x RepoPatchV1 prim wX wY
p1 RepoPatchV1 prim wX wZ
p2

-- | Attempt to commute two patches, the first of which is a Merger patch.
mergerCommute :: PrimPatch prim
              => (RepoPatchV1 prim :> RepoPatchV1 prim) wX wY -> Perhaps ((RepoPatchV1 prim :> RepoPatchV1 prim) wX wY)
mergerCommute :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
mergerCommute (pA :: RepoPatchV1 prim wX wZ
pA :> Merger _ _ p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2)
    | RepoPatchV1 prim wX wZ -> RepoPatchV1 prim wC wB -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare RepoPatchV1 prim wX wZ
pA RepoPatchV1 prim wC wB
p1 = (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. a -> Perhaps a
Succeeded (RepoPatchV1 prim wC wD -> RepoPatchV1 prim wX wD
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart RepoPatchV1 prim wC wD
p2 RepoPatchV1 prim wX wD
-> RepoPatchV1 prim wD wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> String
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wD wY
forall (prim :: * -> * -> *) wX wY wZ wA wB.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger "0.0" RepoPatchV1 prim wC wD
p2 RepoPatchV1 prim wC wB
p1)
    | RepoPatchV1 prim wX wZ -> RepoPatchV1 prim Any Any -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare RepoPatchV1 prim wX wZ
pA (RepoPatchV1 prim Any Any -> RepoPatchV1 prim Any Any
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (String
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim Any Any
forall (prim :: * -> * -> *) wX wY wZ wA wB.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger "0.0" RepoPatchV1 prim wC wD
p2 RepoPatchV1 prim wC wB
p1)) = Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a
Failed
mergerCommute (Merger _ _ b' :: RepoPatchV1 prim wC wB
b' c'' :: RepoPatchV1 prim wC wD
c'' :> Merger _ _ (Merger _ _ c :: RepoPatchV1 prim wC wB
c b :: RepoPatchV1 prim wC wD
b) (Merger _ _ c' :: RepoPatchV1 prim wC wB
c' a :: RepoPatchV1 prim wC wD
a))
    | RepoPatchV1 prim wC wB -> RepoPatchV1 prim wC wD -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare RepoPatchV1 prim wC wB
b' RepoPatchV1 prim wC wD
b Bool -> Bool -> Bool
&& RepoPatchV1 prim wC wB -> RepoPatchV1 prim wC wB -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare RepoPatchV1 prim wC wB
c RepoPatchV1 prim wC wB
c' Bool -> Bool -> Bool
&& RepoPatchV1 prim wC wB -> RepoPatchV1 prim wC wD -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare RepoPatchV1 prim wC wB
c RepoPatchV1 prim wC wD
c'' =
        (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. a -> Perhaps a
Succeeded ( String
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wX Any
forall (prim :: * -> * -> *) wX wY wZ wA wB.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger "0.0" RepoPatchV1 prim wC wD
b (RepoPatchV1 prim wC wD -> RepoPatchV1 prim wC wD
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart RepoPatchV1 prim wC wD
a) RepoPatchV1 prim wX Any
-> RepoPatchV1 prim Any wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:>
                    String
-> RepoPatchV1 prim Any Any
-> RepoPatchV1 prim Any Any
-> RepoPatchV1 prim Any wY
forall (prim :: * -> * -> *) wX wY wZ wA wB.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger "0.0" (String
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim Any Any
forall (prim :: * -> * -> *) wX wY wZ wA wB.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger "0.0" RepoPatchV1 prim wC wD
b (RepoPatchV1 prim wC wD -> RepoPatchV1 prim wC wD
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart RepoPatchV1 prim wC wD
a)) (String
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim Any Any
forall (prim :: * -> * -> *) wX wY wZ wA wB.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger "0.0" RepoPatchV1 prim wC wD
b RepoPatchV1 prim wC wB
c)
                  )
mergerCommute _ = Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a
Unknown

instance PrimPatch prim => Merge (RepoPatchV1 prim) where
    merge :: (:\/:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> (:/\:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
merge (y :: RepoPatchV1 prim wZ wX
y :\/: z :: RepoPatchV1 prim wZ wY
z) =
        case (:\/:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Sealed (RepoPatchV1 prim wY)
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:\/:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Sealed (RepoPatchV1 prim wY)
actualMerge (RepoPatchV1 prim wZ wX
yRepoPatchV1 prim wZ wX
-> RepoPatchV1 prim wZ wY
-> (:\/:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/:RepoPatchV1 prim wZ wY
z) of
        -- actualMerge returns one "arm" of a merge result (@y'@, which applies
        -- "after" @z@), but we need to return both arms. We therefore commute
        -- @z@ and @y'@, to obtain a @z'@, which applies "after" @y'' == y@.
        Sealed y' :: RepoPatchV1 prim wY wX
y' -> case (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wX
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wX)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wZ wY
z RepoPatchV1 prim wZ wY
-> RepoPatchV1 prim wY wX
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wY wX
y') of
                         Nothing -> Doc -> (:/\:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall a. Doc -> a
errorDoc (Doc -> (:/\:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Doc -> (:/\:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall a b. (a -> b) -> a -> b
$ String -> Doc
text "merge_patches bug"
                                    Doc -> Doc -> Doc
$$ RepoPatchV1 prim wZ wX -> Doc
forall (prim :: * -> * -> *) wX wY.
ShowPatchBasic prim =>
prim wX wY -> Doc
showPatch_ RepoPatchV1 prim wZ wX
y
                                   Doc -> Doc -> Doc
$$ RepoPatchV1 prim wZ wY -> Doc
forall (prim :: * -> * -> *) wX wY.
ShowPatchBasic prim =>
prim wX wY -> Doc
showPatch_ RepoPatchV1 prim wZ wY
z
                                   Doc -> Doc -> Doc
$$ RepoPatchV1 prim wY wX -> Doc
forall (prim :: * -> * -> *) wX wY.
ShowPatchBasic prim =>
prim wX wY -> Doc
showPatch_ RepoPatchV1 prim wY wX
y'
                         Just (_ :> z' :: RepoPatchV1 prim wZ wX
z') -> RepoPatchV1 prim wZ wX -> RepoPatchV1 prim wX wX
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart RepoPatchV1 prim wZ wX
z' RepoPatchV1 prim wX wX
-> RepoPatchV1 prim wY wX
-> (:/\:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: RepoPatchV1 prim wY wX
y'

instance PrimPatch prim => Commute (RepoPatchV1 prim) where
    commute :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
commute x :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x = Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a -> Maybe a
toMaybe (Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
 -> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY))
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a b. (a -> b) -> a -> b
$ [Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)]
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum
                  [(:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (prim :: * -> * -> *).
PrimPatch prim =>
CommuteFunction prim
speedyCommute (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x,
                   (CommuteFunction prim
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (prim :: * -> * -> *).
Invert prim =>
CommuteFunction prim -> CommuteFunction prim
cleverCommute CommuteFunction prim
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
mergerCommute) (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x,
                   (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (prim :: * -> * -> *).
PrimPatch prim =>
CommuteFunction prim
everythingElseCommute (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x
                  ]

instance PrimPatch prim => PatchInspect (RepoPatchV1 prim) where
    -- Recurse on everything, these are potentially spoofed patches
    listTouchedFiles :: RepoPatchV1 prim wX wY -> [String]
listTouchedFiles (Merger _ _ p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2) = [String] -> [String]
forall a. Ord a => [a] -> [a]
nubSort ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wC wB -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles RepoPatchV1 prim wC wB
p1
                                            [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ RepoPatchV1 prim wC wD -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles RepoPatchV1 prim wC wD
p2
    listTouchedFiles c :: RepoPatchV1 prim wX wY
c@(Regrem{}) = RepoPatchV1 prim wY wX -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles (RepoPatchV1 prim wY wX -> [String])
-> RepoPatchV1 prim wY wX -> [String]
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> RepoPatchV1 prim wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wX wY
c
    listTouchedFiles (PP p :: prim wX wY
p) = prim wX wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles prim wX wY
p

    hunkMatches :: (ByteString -> Bool) -> RepoPatchV1 prim wX wY -> Bool
hunkMatches f :: ByteString -> Bool
f (Merger _ _ p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2) = (ByteString -> Bool) -> RepoPatchV1 prim wC wB -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f RepoPatchV1 prim wC wB
p1 Bool -> Bool -> Bool
|| (ByteString -> Bool) -> RepoPatchV1 prim wC wD -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f RepoPatchV1 prim wC wD
p2
    hunkMatches f :: ByteString -> Bool
f c :: RepoPatchV1 prim wX wY
c@(Regrem{}) = (ByteString -> Bool) -> RepoPatchV1 prim wY wX -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f (RepoPatchV1 prim wY wX -> Bool) -> RepoPatchV1 prim wY wX -> Bool
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> RepoPatchV1 prim wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wX wY
c
    hunkMatches f :: ByteString -> Bool
f (PP p :: prim wX wY
p) = (ByteString -> Bool) -> prim wX wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f prim wX wY
p

commuteNoMerger :: PrimPatch prim => MaybeCommute prim
commuteNoMerger :: MaybeCommute prim
commuteNoMerger x :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x =
    Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a -> Maybe a
toMaybe (Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
 -> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY))
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a b. (a -> b) -> a -> b
$ [Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)]
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum [ (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (prim :: * -> * -> *).
PrimPatch prim =>
CommuteFunction prim
speedyCommute (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x
                   , (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (prim :: * -> * -> *).
PrimPatch prim =>
CommuteFunction prim
everythingElseCommute (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
x
                   ]

isFilepatchMerger :: PrimPatch prim => RepoPatchV1 prim wX wY -> Maybe FileName
isFilepatchMerger :: RepoPatchV1 prim wX wY -> Maybe FileName
isFilepatchMerger (PP p :: prim wX wY
p) = prim wX wY -> Maybe FileName
forall (prim :: * -> * -> *) wX wY.
PrimClassify prim =>
prim wX wY -> Maybe FileName
is_filepatch prim wX wY
p
isFilepatchMerger (Merger _ _ p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2) = do
     FileName
f1 <- RepoPatchV1 prim wC wB -> Maybe FileName
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> Maybe FileName
isFilepatchMerger RepoPatchV1 prim wC wB
p1
     FileName
f2 <- RepoPatchV1 prim wC wD -> Maybe FileName
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> Maybe FileName
isFilepatchMerger RepoPatchV1 prim wC wD
p2
     if FileName
f1 FileName -> FileName -> Bool
forall a. Eq a => a -> a -> Bool
== FileName
f2 then FileName -> Maybe FileName
forall (m :: * -> *) a. Monad m => a -> m a
return FileName
f1 else Maybe FileName
forall a. Maybe a
Nothing
isFilepatchMerger (Regrem und :: FL (RepoPatchV1 prim) wY wX
und unw :: RL (RepoPatchV1 prim) wY wB
unw p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wA
p2)
    = RepoPatchV1 prim wY wX -> Maybe FileName
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> Maybe FileName
isFilepatchMerger (FL (RepoPatchV1 prim) wY wX
-> RL (RepoPatchV1 prim) wY wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wA
-> RepoPatchV1 prim wY wX
forall (prim :: * -> * -> *) wX wY wB wC wD.
FL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wX wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wX wY
Merger FL (RepoPatchV1 prim) wY wX
und RL (RepoPatchV1 prim) wY wB
unw RepoPatchV1 prim wC wB
p1 RepoPatchV1 prim wC wA
p2)

commuteRecursiveMerger :: PrimPatch prim
    => (RepoPatchV1 prim :> RepoPatchV1 prim) wX wY -> Perhaps ((RepoPatchV1 prim :> RepoPatchV1 prim) wX wY)
commuteRecursiveMerger :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
commuteRecursiveMerger (pA :: RepoPatchV1 prim wX wZ
pA :> p :: RepoPatchV1 prim wZ wY
p@(Merger _ _ p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2)) = Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Maybe a -> Perhaps a
toPerhaps (Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
 -> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY))
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a b. (a -> b) -> a -> b
$
  do (_ :> pA' :: RepoPatchV1 prim wZ wY
pA') <- CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wX wY
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn p1 (FL p2)
commuterIdFL CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (RepoPatchV1 prim wX wZ
pA RepoPatchV1 prim wX wZ
-> FL (RepoPatchV1 prim) wZ wY
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV1 prim) wZ wY
undo)
     (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wZ wZ
_ <- CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wZ wZ
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wZ wZ)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn p1 (FL p2)
commuterIdFL CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (RepoPatchV1 prim wZ wY
pA' RepoPatchV1 prim wZ wY
-> FL (RepoPatchV1 prim) wY wZ
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV1 prim) wZ wY -> FL (RepoPatchV1 prim) wY wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL (RepoPatchV1 prim) wZ wY
undo)
     (_ :> pAmid :: RepoPatchV1 prim wZ wC
pAmid) <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wC
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wC)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wX wZ
pA RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wC
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wC
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wB wC -> RepoPatchV1 prim wZ wC
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart (RepoPatchV1 prim wC wB -> RepoPatchV1 prim wB wC
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wC wB
p1))
     (p1' :: RepoPatchV1 prim wZ wZ
p1' :> pAx :: RepoPatchV1 prim wZ wB
pAx) <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wB
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wB)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wZ wC
pAmid RepoPatchV1 prim wZ wC
-> RepoPatchV1 prim wC wB
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wB
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wC wB
p1)
     Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (RepoPatchV1 prim wZ wB
pAx RepoPatchV1 prim wZ wB -> RepoPatchV1 prim wX wZ -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wX wZ
pA)
     (p2' :: RepoPatchV1 prim wZ wZ
p2' :> _) <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wD
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wD)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wZ wC
pAmid RepoPatchV1 prim wZ wC
-> RepoPatchV1 prim wC wD
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wD
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wC wD
p2)
     (p2o :: RepoPatchV1 prim wC wZ
p2o :> _) <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wZ wC -> RepoPatchV1 prim wC wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wZ wC
pAmid RepoPatchV1 prim wC wZ
-> RepoPatchV1 prim wZ wZ
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wZ
p2')
     Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (RepoPatchV1 prim wC wZ
p2o RepoPatchV1 prim wC wZ -> RepoPatchV1 prim wC wD -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wC wD
p2)
     let p' :: RepoPatchV1 prim wB wC
p' = if RepoPatchV1 prim wZ wZ -> RepoPatchV1 prim wC wB -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare RepoPatchV1 prim wZ wZ
p1' RepoPatchV1 prim wC wB
p1 Bool -> Bool -> Bool
&& RepoPatchV1 prim wZ wZ -> RepoPatchV1 prim wC wD -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare RepoPatchV1 prim wZ wZ
p2' RepoPatchV1 prim wC wD
p2
              then RepoPatchV1 prim wZ wY -> RepoPatchV1 prim wB wC
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RepoPatchV1 prim wZ wY
p
              else String
-> RepoPatchV1 prim wZ wZ
-> RepoPatchV1 prim wZ wZ
-> RepoPatchV1 prim wB wC
forall (prim :: * -> * -> *) wX wY wZ wA wB.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger "0.0" RepoPatchV1 prim wZ wZ
p1' RepoPatchV1 prim wZ wZ
p2'
         undo' :: FL (RepoPatchV1 prim) wX wY
undo' = RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
mergerUndo RepoPatchV1 prim wX wY
forall wB wC. RepoPatchV1 prim wB wC
p'
     (pAo :: RepoPatchV1 prim Any wZ
pAo :> _) <- CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
-> (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) Any wY
-> Maybe ((:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) Any wY)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn (FL p1) p2
commuterFLId CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (FL (RepoPatchV1 prim) Any wZ
forall wX wY. FL (RepoPatchV1 prim) wX wY
undo' FL (RepoPatchV1 prim) Any wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) Any wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
pA')
     Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (RepoPatchV1 prim Any wZ
pAo RepoPatchV1 prim Any wZ -> RepoPatchV1 prim wX wZ -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wX wZ
pA)
     (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (RepoPatchV1 prim wX wZ
forall wB wC. RepoPatchV1 prim wB wC
p' RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
pA')
    where undo :: FL (RepoPatchV1 prim) wZ wY
undo = RepoPatchV1 prim wZ wY -> FL (RepoPatchV1 prim) wZ wY
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
mergerUndo RepoPatchV1 prim wZ wY
p
commuteRecursiveMerger _ = Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a
Unknown

otherCommuteRecursiveMerger :: PrimPatch prim
    => (RepoPatchV1 prim :> RepoPatchV1 prim) wX wY -> Perhaps ((RepoPatchV1 prim :> RepoPatchV1 prim) wX wY)
otherCommuteRecursiveMerger :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
otherCommuteRecursiveMerger (p_old :: RepoPatchV1 prim wX wZ
p_old@(Merger _ _ p1' :: RepoPatchV1 prim wC wB
p1' p2' :: RepoPatchV1 prim wC wD
p2') :> pA' :: RepoPatchV1 prim wZ wY
pA') = Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Maybe a -> Perhaps a
toPerhaps (Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
 -> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY))
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
-> Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a b. (a -> b) -> a -> b
$
  do (pA :: RepoPatchV1 prim wX wZ
pA :> _) <- CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
-> (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wX wY)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn (FL p1) p2
commuterFLId CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (RepoPatchV1 prim wX wZ -> FL (RepoPatchV1 prim) wX wZ
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
mergerUndo RepoPatchV1 prim wX wZ
p_old FL (RepoPatchV1 prim) wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
pA')
     (pAmid :: RepoPatchV1 prim wC wZ
pAmid :> p1 :: RepoPatchV1 prim wZ wZ
p1) <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wC wB -> RepoPatchV1 prim wC wX
forall (a :: * -> * -> *) wX wY1 wY2. a wX wY1 -> a wX wY2
unsafeCoercePEnd RepoPatchV1 prim wC wB
p1' RepoPatchV1 prim wC wX
-> RepoPatchV1 prim wX wZ
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wX wZ
pA)
     (_ :> pAmido :: RepoPatchV1 prim wZ wZ
pAmido) <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wZ
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wX wZ
pA RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wZ
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wZ -> RepoPatchV1 prim wZ wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wZ wZ
p1)
     Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (RepoPatchV1 prim wZ wZ
pAmido RepoPatchV1 prim wZ wZ -> RepoPatchV1 prim wC wZ -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wC wZ
pAmid)
     (p2 :: RepoPatchV1 prim wZ wZ
p2 :> _) <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wD
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wD)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wC wZ -> RepoPatchV1 prim wZ wC
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wC wZ
pAmid RepoPatchV1 prim wZ wC
-> RepoPatchV1 prim wC wD
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wD
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wC wD
p2')
     (p2o' :: RepoPatchV1 prim wC wZ
p2o' :> _) <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wC wZ
pAmid RepoPatchV1 prim wC wZ
-> RepoPatchV1 prim wZ wZ
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wC wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wZ
p2)
     Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (RepoPatchV1 prim wC wZ
p2o' RepoPatchV1 prim wC wZ -> RepoPatchV1 prim wC wD -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wC wD
p2')
     let p :: RepoPatchV1 prim wB wC
p = if RepoPatchV1 prim wZ wZ
p1 RepoPatchV1 prim wZ wZ -> RepoPatchV1 prim wC wB -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wC wB
p1' Bool -> Bool -> Bool
&& RepoPatchV1 prim wZ wZ
p2 RepoPatchV1 prim wZ wZ -> RepoPatchV1 prim wC wD -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wC wD
p2'
             then RepoPatchV1 prim wX wZ -> RepoPatchV1 prim wB wC
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RepoPatchV1 prim wX wZ
p_old
             else String
-> RepoPatchV1 prim wZ wZ
-> RepoPatchV1 prim wZ wZ
-> RepoPatchV1 prim wB wC
forall (prim :: * -> * -> *) wX wY wZ wA wB.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wA wB
unsafeMerger "0.0" RepoPatchV1 prim wZ wZ
p1 RepoPatchV1 prim wZ wZ
p2
         undo :: FL (RepoPatchV1 prim) wX wY
undo = RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
mergerUndo RepoPatchV1 prim wX wY
forall wB wC. RepoPatchV1 prim wB wC
p
     Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wZ
pA RepoPatchV1 prim wX wZ -> RepoPatchV1 prim wZ wZ -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wZ wZ
p1) -- special case here...
     (_ :> pAo' :: RepoPatchV1 prim wZ Any
pAo') <- CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wX Any
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX Any)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn p1 (FL p2)
commuterIdFL CommuteFn (RepoPatchV1 prim) (RepoPatchV1 prim)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (RepoPatchV1 prim wX wZ
pA RepoPatchV1 prim wX wZ
-> FL (RepoPatchV1 prim) wZ Any
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wX Any
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV1 prim) wZ Any
forall wX wY. FL (RepoPatchV1 prim) wX wY
undo)
     Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (RepoPatchV1 prim wZ Any
pAo' RepoPatchV1 prim wZ Any -> RepoPatchV1 prim wZ wY -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wZ wY
pA')
     (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (RepoPatchV1 prim wX wZ
pA RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
forall wB wC. RepoPatchV1 prim wB wC
p)
otherCommuteRecursiveMerger _ = Perhaps ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall a. Perhaps a
Unknown

type CommuteFunction prim = forall wX wY . (RepoPatchV1 prim :> RepoPatchV1 prim) wX wY -> Perhaps ((RepoPatchV1 prim :> RepoPatchV1 prim) wX wY)
type MaybeCommute prim = forall wX wY . (RepoPatchV1 prim :> RepoPatchV1 prim) wX wY -> Maybe ((RepoPatchV1 prim :> RepoPatchV1 prim) wX wY)

commuteFLId :: MaybeCommute prim -> (RepoPatchV1 prim :> FL (RepoPatchV1 prim)) wX wY -> Maybe ((FL (RepoPatchV1 prim) :> RepoPatchV1 prim) wX wY)
commuteFLId :: MaybeCommute prim
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wX wY
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY)
commuteFLId _        (p :: RepoPatchV1 prim wX wZ
p :> NilFL) = (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wZ
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wZ)
forall (m :: * -> *) a. Monad m => a -> m a
return (FL (RepoPatchV1 prim) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL (RepoPatchV1 prim) wX wX
-> RepoPatchV1 prim wX wZ
-> (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wX wZ
p)
commuteFLId commuter :: MaybeCommute prim
commuter (p :: RepoPatchV1 prim wX wZ
p :> (q :: RepoPatchV1 prim wZ wY
q :>: qs :: FL (RepoPatchV1 prim) wY wY
qs)) = do
   q' :: RepoPatchV1 prim wX wZ
q' :> p' :: RepoPatchV1 prim wZ wY
p' <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
MaybeCommute prim
commuter (RepoPatchV1 prim wX wZ
p RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
q)
   qs' :: FL (RepoPatchV1 prim) wZ wZ
qs' :> p'' :: RepoPatchV1 prim wZ wY
p'' <- MaybeCommute prim
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wZ wY
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wZ wY)
forall (prim :: * -> * -> *) wX wY.
MaybeCommute prim
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wX wY
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY)
commuteFLId MaybeCommute prim
commuter (RepoPatchV1 prim wZ wY
p' RepoPatchV1 prim wZ wY
-> FL (RepoPatchV1 prim) wY wY
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV1 prim) wY wY
qs)
   (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return ((RepoPatchV1 prim wX wZ
q' RepoPatchV1 prim wX wZ
-> FL (RepoPatchV1 prim) wZ wZ -> FL (RepoPatchV1 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV1 prim) wZ wZ
qs') FL (RepoPatchV1 prim) wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
p'')

{-
A note about mergers and type witnesses
---------------------------------------

The merger code predates the introduction of type witnesses, and because
of its complexity has proved the hardest part of the codebase to retrofit.
Attempting to do this has exposed various places where the code behaves
oddly (e.g. 'putBefore' below); these are likely to be bugs but fixing
them would be potentially disruptive and dangerous as it might change
the existing merge behaviour and thus break existing repositories.

As a result the addition of witnesses to this code has required the
liberal use of unsafe operators. In effect, witnesses bring no safety
in this area; the sole purpose of adding them here was to allow this
code to run as part of a codebase that uses witnesses everywhere else.

A key problem point is the type of the 'Merger' and 'Regrem' constructors
of Patch, where the witnesses seem odd. It is likely that some or many
of the unsafe operations could be removed by finding a better type for
these constructors.
-}


-- |actualMerge attempts to perform a merge; if successful, it returns the
-- "right" branch of the merge
--
-- TODO: why does this code throw away the other branch, only for merge to
-- rebuild it?
actualMerge :: PrimPatch prim
    => (RepoPatchV1 prim :\/: RepoPatchV1 prim) wX wY -> Sealed (RepoPatchV1 prim wY)
actualMerge :: (:\/:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Sealed (RepoPatchV1 prim wY)
actualMerge (p1 :: RepoPatchV1 prim wZ wX
p1 :\/: p2 :: RepoPatchV1 prim wZ wY
p2) = case (:\/:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:/\:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (p :: * -> * -> *) wX wY.
(Invert p, Commute p) =>
(:\/:) p p wX wY -> Maybe ((:/\:) p p wX wY)
naturalMerge (RepoPatchV1 prim wZ wX
p1RepoPatchV1 prim wZ wX
-> RepoPatchV1 prim wZ wY
-> (:\/:) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/:RepoPatchV1 prim wZ wY
p2) of
                             Just (_ :/\: p1' :: RepoPatchV1 prim wY wZ
p1') -> RepoPatchV1 prim wY wZ -> Sealed (RepoPatchV1 prim wY)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed RepoPatchV1 prim wY wZ
p1'
                             Nothing -> String
-> RepoPatchV1 prim wZ wY
-> RepoPatchV1 prim wZ wX
-> Sealed (RepoPatchV1 prim wY)
forall (prim :: * -> * -> *) wX wY wZ.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> Sealed (RepoPatchV1 prim wY)
merger "0.0" RepoPatchV1 prim wZ wY
p2 RepoPatchV1 prim wZ wX
p1

-- Recreates a patch history in reverse.
unwind :: RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
unwind :: RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
unwind (Merger _ unwindings :: RL (RepoPatchV1 prim) wX wB
unwindings _ _) = RL (RepoPatchV1 prim) wX wB -> Sealed (RL (RepoPatchV1 prim) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed RL (RepoPatchV1 prim) wX wB
unwindings
unwind p :: RepoPatchV1 prim wX wY
p = RL (RepoPatchV1 prim) wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RL (RepoPatchV1 prim) wX wX
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL RL (RepoPatchV1 prim) wX wX
-> RepoPatchV1 prim wX wY -> RL (RepoPatchV1 prim) wX wY
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV1 prim wX wY
p)

-- Recreates a patch history in reverse. The patch being unwound is always at
-- the start of the list of patches.
trueUnwind :: PrimPatch prim
    => RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
trueUnwind :: RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
trueUnwind p :: RepoPatchV1 prim wX wY
p@(Merger _ _ p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2) =
    case (RepoPatchV1 prim wC wB -> Sealed (RL (RepoPatchV1 prim) wC)
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
unwind RepoPatchV1 prim wC wB
p1, RepoPatchV1 prim wC wD -> Sealed (RL (RepoPatchV1 prim) wC)
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
unwind RepoPatchV1 prim wC wD
p2) of
    (Sealed (p1s :: RL (RepoPatchV1 prim) wC wY
p1s:<:_),Sealed (p2s :: RL (RepoPatchV1 prim) wC wY
p2s:<:_)) ->
         RL (RepoPatchV1 prim) wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (FlippedSeal (RL (RepoPatchV1 prim)) wY
-> RL (RepoPatchV1 prim) wX wY
forall (a :: * -> * -> *) wY wX. FlippedSeal a wY -> a wX wY
unsafeUnsealFlipped (RepoPatchV1 prim wX wY
-> RL (RepoPatchV1 prim) wC wY
-> RL (RepoPatchV1 prim) wC wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
forall (prim :: * -> * -> *) wA wB wX wZ wY.
PrimPatch prim =>
RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wZ
-> RL (RepoPatchV1 prim) wY wZ
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
reconcileUnwindings RepoPatchV1 prim wX wY
p RL (RepoPatchV1 prim) wC wY
p1s (RL (RepoPatchV1 prim) wC wY -> RL (RepoPatchV1 prim) wC wY
forall (a :: * -> * -> *) wX wY1 wY2. a wX wY1 -> a wX wY2
unsafeCoercePEnd RL (RepoPatchV1 prim) wC wY
p2s)) RL (RepoPatchV1 prim) wX wY
-> RepoPatchV1 prim wY wX -> RL (RepoPatchV1 prim) wX wX
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV1 prim wC wB -> RepoPatchV1 prim wY wX
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RepoPatchV1 prim wC wB
p1 RL (RepoPatchV1 prim) wX wX
-> RepoPatchV1 prim wX wY -> RL (RepoPatchV1 prim) wX wY
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV1 prim wX wY
p)
    _ -> Sealed (RL (RepoPatchV1 prim) wX)
forall a. a
impossible
trueUnwind _ = Sealed (RL (RepoPatchV1 prim) wX)
forall a. a
impossible

reconcileUnwindings :: PrimPatch prim
    => RepoPatchV1 prim wA wB -> RL (RepoPatchV1 prim) wX wZ -> RL (RepoPatchV1 prim) wY wZ -> FlippedSeal (RL (RepoPatchV1 prim)) wZ
reconcileUnwindings :: RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wZ
-> RL (RepoPatchV1 prim) wY wZ
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
reconcileUnwindings _ NilRL p2s :: RL (RepoPatchV1 prim) wY wZ
p2s = RL (RepoPatchV1 prim) wY wZ
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall (a :: * -> * -> *) wX wY. a wX wY -> FlippedSeal a wY
FlippedSeal RL (RepoPatchV1 prim) wY wZ
p2s
reconcileUnwindings _ p1s :: RL (RepoPatchV1 prim) wX wZ
p1s NilRL = RL (RepoPatchV1 prim) wX wZ
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall (a :: * -> * -> *) wX wY. a wX wY -> FlippedSeal a wY
FlippedSeal RL (RepoPatchV1 prim) wX wZ
p1s
reconcileUnwindings p :: RepoPatchV1 prim wA wB
p (p1s :: RL (RepoPatchV1 prim) wX wY
p1s:<:p1 :: RepoPatchV1 prim wY wZ
p1) p2s :: RL (RepoPatchV1 prim) wY wZ
p2s@(tp2s :: RL (RepoPatchV1 prim) wY wY
tp2s:<:p2 :: RepoPatchV1 prim wY wZ
p2) =
    case [(RL (RepoPatchV1 prim) wX wZ
p1s', RL (RepoPatchV1 prim) wY wZ
p2s')|
          p1s' :: RL (RepoPatchV1 prim) wX wZ
p1s'@(_:<:hp1s' :: RepoPatchV1 prim wY wZ
hp1s') <- RL (RepoPatchV1 prim) wX wZ -> [RL (RepoPatchV1 prim) wX wZ]
forall (p :: * -> * -> *) wX wY.
Commute p =>
RL p wX wY -> [RL p wX wY]
headPermutationsRL (RL (RepoPatchV1 prim) wX wY
p1sRL (RepoPatchV1 prim) wX wY
-> RepoPatchV1 prim wY wZ -> RL (RepoPatchV1 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<:RepoPatchV1 prim wY wZ
p1),
          p2s' :: RL (RepoPatchV1 prim) wY wZ
p2s'@(_:<:hp2s' :: RepoPatchV1 prim wY wZ
hp2s') <- RL (RepoPatchV1 prim) wY wZ -> [RL (RepoPatchV1 prim) wY wZ]
forall (p :: * -> * -> *) wX wY.
Commute p =>
RL p wX wY -> [RL p wX wY]
headPermutationsRL RL (RepoPatchV1 prim) wY wZ
p2s,
          RepoPatchV1 prim wY wZ
hp1s' RepoPatchV1 prim wY wZ -> RepoPatchV1 prim wY wZ -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wY wZ
hp2s'] of
    ((p1s' :: RL (RepoPatchV1 prim) wX wY
p1s':<:p1' :: RepoPatchV1 prim wY wZ
p1', p2s':<:_):_) ->
        (forall wX.
 RL (RepoPatchV1 prim) wX wY -> RL (RepoPatchV1 prim) wX wZ)
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall (a :: * -> * -> *) wY (b :: * -> * -> *) wZ.
(forall wX. a wX wY -> b wX wZ)
-> FlippedSeal a wY -> FlippedSeal b wZ
mapFlipped (RL (RepoPatchV1 prim) wX wY
-> RepoPatchV1 prim wY wZ -> RL (RepoPatchV1 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<:RepoPatchV1 prim wY wZ
p1') (FlippedSeal (RL (RepoPatchV1 prim)) wY
 -> FlippedSeal (RL (RepoPatchV1 prim)) wZ)
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wY wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
forall (prim :: * -> * -> *) wA wB wX wZ wY.
PrimPatch prim =>
RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wZ
-> RL (RepoPatchV1 prim) wY wZ
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
reconcileUnwindings RepoPatchV1 prim wA wB
p RL (RepoPatchV1 prim) wX wY
p1s' (RL (RepoPatchV1 prim) wY wY -> RL (RepoPatchV1 prim) wY wY
forall (a :: * -> * -> *) wX wY1 wY2. a wX wY1 -> a wX wY2
unsafeCoercePEnd RL (RepoPatchV1 prim) wY wY
p2s')
    [] -> case FL (RepoPatchV1 prim) wY wY -> RL (RepoPatchV1 prim) wY wY
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL (FL (RepoPatchV1 prim) wY wY -> RL (RepoPatchV1 prim) wY wY)
-> Maybe (FL (RepoPatchV1 prim) wY wY)
-> Maybe (RL (RepoPatchV1 prim) wY wY)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` RepoPatchV1 prim wY wZ
-> FL (RepoPatchV1 prim) wY wZ
-> Maybe (FL (RepoPatchV1 prim) wY wY)
forall (prim :: * -> * -> *) wY wZ wX wW.
PrimPatch prim =>
RepoPatchV1 prim wY wZ
-> FL (RepoPatchV1 prim) wX wZ
-> Maybe (FL (RepoPatchV1 prim) wY wW)
putBefore RepoPatchV1 prim wY wZ
p1 (RL (RepoPatchV1 prim) wY wZ -> FL (RepoPatchV1 prim) wY wZ
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL (RepoPatchV1 prim) wY wZ
p2s) of
          Just p2s' :: RL (RepoPatchV1 prim) wY wY
p2s' -> (forall wX.
 RL (RepoPatchV1 prim) wX wY -> RL (RepoPatchV1 prim) wX wZ)
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall (a :: * -> * -> *) wY (b :: * -> * -> *) wZ.
(forall wX. a wX wY -> b wX wZ)
-> FlippedSeal a wY -> FlippedSeal b wZ
mapFlipped (RL (RepoPatchV1 prim) wX wY
-> RepoPatchV1 prim wY wZ -> RL (RepoPatchV1 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<:RepoPatchV1 prim wY wZ
p1) (FlippedSeal (RL (RepoPatchV1 prim)) wY
 -> FlippedSeal (RL (RepoPatchV1 prim)) wZ)
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wY wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
forall (prim :: * -> * -> *) wA wB wX wZ wY.
PrimPatch prim =>
RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wZ
-> RL (RepoPatchV1 prim) wY wZ
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
reconcileUnwindings RepoPatchV1 prim wA wB
p RL (RepoPatchV1 prim) wX wY
p1s RL (RepoPatchV1 prim) wY wY
p2s'
          Nothing ->
              case (FL (RepoPatchV1 prim) wY wY -> RL (RepoPatchV1 prim) wY wY)
-> Maybe (FL (RepoPatchV1 prim) wY wY)
-> Maybe (RL (RepoPatchV1 prim) wY wY)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap FL (RepoPatchV1 prim) wY wY -> RL (RepoPatchV1 prim) wY wY
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL (Maybe (FL (RepoPatchV1 prim) wY wY)
 -> Maybe (RL (RepoPatchV1 prim) wY wY))
-> Maybe (FL (RepoPatchV1 prim) wY wY)
-> Maybe (RL (RepoPatchV1 prim) wY wY)
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wY wZ
-> FL (RepoPatchV1 prim) wX wZ
-> Maybe (FL (RepoPatchV1 prim) wY wY)
forall (prim :: * -> * -> *) wY wZ wX wW.
PrimPatch prim =>
RepoPatchV1 prim wY wZ
-> FL (RepoPatchV1 prim) wX wZ
-> Maybe (FL (RepoPatchV1 prim) wY wW)
putBefore RepoPatchV1 prim wY wZ
p2 (FL (RepoPatchV1 prim) wX wZ
 -> Maybe (FL (RepoPatchV1 prim) wY wY))
-> FL (RepoPatchV1 prim) wX wZ
-> Maybe (FL (RepoPatchV1 prim) wY wY)
forall a b. (a -> b) -> a -> b
$
                   RL (RepoPatchV1 prim) wX wZ -> FL (RepoPatchV1 prim) wX wZ
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL (RepoPatchV1 prim) wX wY
p1sRL (RepoPatchV1 prim) wX wY
-> RepoPatchV1 prim wY wZ -> RL (RepoPatchV1 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<:RepoPatchV1 prim wY wZ
p1) of
              Just p1s' :: RL (RepoPatchV1 prim) wY wY
p1s' -> (forall wX.
 RL (RepoPatchV1 prim) wX wY -> RL (RepoPatchV1 prim) wX wZ)
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall (a :: * -> * -> *) wY (b :: * -> * -> *) wZ.
(forall wX. a wX wY -> b wX wZ)
-> FlippedSeal a wY -> FlippedSeal b wZ
mapFlipped (RL (RepoPatchV1 prim) wX wY
-> RepoPatchV1 prim wY wZ -> RL (RepoPatchV1 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<:RepoPatchV1 prim wY wZ
p2) (FlippedSeal (RL (RepoPatchV1 prim)) wY
 -> FlippedSeal (RL (RepoPatchV1 prim)) wZ)
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall a b. (a -> b) -> a -> b
$
                           RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wY wY
-> RL (RepoPatchV1 prim) wY wY
-> FlippedSeal (RL (RepoPatchV1 prim)) wY
forall (prim :: * -> * -> *) wA wB wX wZ wY.
PrimPatch prim =>
RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wZ
-> RL (RepoPatchV1 prim) wY wZ
-> FlippedSeal (RL (RepoPatchV1 prim)) wZ
reconcileUnwindings RepoPatchV1 prim wA wB
p RL (RepoPatchV1 prim) wY wY
p1s' RL (RepoPatchV1 prim) wY wY
tp2s
              Nothing ->
                Doc -> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall a. Doc -> a
errorDoc (Doc -> FlippedSeal (RL (RepoPatchV1 prim)) wZ)
-> Doc -> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall a b. (a -> b) -> a -> b
$ String -> Doc
text "in function reconcileUnwindings"
                        Doc -> Doc -> Doc
$$ String -> Doc
text "Original patch:"
                        Doc -> Doc -> Doc
$$ RepoPatchV1 prim wA wB -> Doc
forall (prim :: * -> * -> *) wX wY.
ShowPatchBasic prim =>
prim wX wY -> Doc
showPatch_ RepoPatchV1 prim wA wB
p
    _ -> String -> FlippedSeal (RL (RepoPatchV1 prim)) wZ
forall a. String -> a
bug "in reconcileUnwindings"

-- This code seems wrong, shouldn't the commute be invert p1 :> p2 ? And why isn't p1' re-inverted?
-- it seems to have been this way forever:
-- Fri May 23 10:27:04 BST 2003  droundy@abridgegame.org
--    * fix bug in unwind and add docs on unwind algorithm.
putBefore :: PrimPatch prim
    => RepoPatchV1 prim wY wZ -> FL (RepoPatchV1 prim) wX wZ -> Maybe (FL (RepoPatchV1 prim) wY wW)
putBefore :: RepoPatchV1 prim wY wZ
-> FL (RepoPatchV1 prim) wX wZ
-> Maybe (FL (RepoPatchV1 prim) wY wW)
putBefore p1 :: RepoPatchV1 prim wY wZ
p1 (p2 :: RepoPatchV1 prim wX wY
p2:>:p2s :: FL (RepoPatchV1 prim) wY wZ
p2s) =
    do p1' :: RepoPatchV1 prim Any wZ
p1' :> p2' :: RepoPatchV1 prim wZ wY
p2' <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) Any wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) Any wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wX wY -> RepoPatchV1 prim Any wZ
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RepoPatchV1 prim wX wY
p2 RepoPatchV1 prim Any wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) Any wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wY wZ -> RepoPatchV1 prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wY wZ
p1)
       (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wZ
_ <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wZ
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RepoPatchV1 prim wZ wY
p2' RepoPatchV1 prim wZ wY
-> RepoPatchV1 prim wY wZ
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wY wZ
p1)
       (RepoPatchV1 prim wZ wY -> RepoPatchV1 prim wY Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RepoPatchV1 prim wZ wY
p2' RepoPatchV1 prim wY Any
-> FL (RepoPatchV1 prim) Any wW -> FL (RepoPatchV1 prim) wY wW
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (FL (RepoPatchV1 prim) Any wW -> FL (RepoPatchV1 prim) wY wW)
-> Maybe (FL (RepoPatchV1 prim) Any wW)
-> Maybe (FL (RepoPatchV1 prim) wY wW)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` RepoPatchV1 prim Any wZ
-> FL (RepoPatchV1 prim) Any wZ
-> Maybe (FL (RepoPatchV1 prim) Any wW)
forall (prim :: * -> * -> *) wY wZ wX wW.
PrimPatch prim =>
RepoPatchV1 prim wY wZ
-> FL (RepoPatchV1 prim) wX wZ
-> Maybe (FL (RepoPatchV1 prim) wY wW)
putBefore RepoPatchV1 prim Any wZ
p1' (FL (RepoPatchV1 prim) wY wZ -> FL (RepoPatchV1 prim) Any wZ
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP FL (RepoPatchV1 prim) wY wZ
p2s)
putBefore _ NilFL = FL (RepoPatchV1 prim) wY wW -> Maybe (FL (RepoPatchV1 prim) wY wW)
forall a. a -> Maybe a
Just (FL (RepoPatchV1 prim) Any Any -> FL (RepoPatchV1 prim) wY wW
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP FL (RepoPatchV1 prim) Any Any
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)

instance PrimPatch prim => CommuteNoConflicts (RepoPatchV1 prim) where
  commuteNoConflicts :: (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
commuteNoConflicts (x :: RepoPatchV1 prim wX wZ
x :> y :: RepoPatchV1 prim wZ wY
y) = do y' :: RepoPatchV1 prim wX wZ
y' :> x' :: RepoPatchV1 prim wZ wY
x' <- (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
commuteNoMerger (RepoPatchV1 prim wX wZ
x RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
y)
                                   (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (RepoPatchV1 prim wX wZ
y' RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wZ wY
-> (:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV1 prim wZ wY
x')

instance PrimPatch prim => Conflict (RepoPatchV1 prim) where
  resolveConflicts :: RepoPatchV1 prim wX wY
-> [[Sealed (FL (PrimOf (RepoPatchV1 prim)) wY)]]
resolveConflicts patch :: RepoPatchV1 prim wX wY
patch = FL (RepoPatchV1 prim) wY wY
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wY)]]
forall wY wW wX.
FL (RepoPatchV1 prim) wY wW
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
rcs FL (RepoPatchV1 prim) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL (RL (RepoPatchV1 prim) wX wX
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL RL (RepoPatchV1 prim) wX wX
-> RepoPatchV1 prim wX wY -> RL (RepoPatchV1 prim) wX wY
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV1 prim wX wY
patch)
    where rcs :: FL (RepoPatchV1 prim) wY wW -> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
          rcs :: FL (RepoPatchV1 prim) wY wW
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
rcs _ NilRL = []
          rcs passedby :: FL (RepoPatchV1 prim) wY wW
passedby (ps :: RL (RepoPatchV1 prim) wX wY
ps:<:p :: RepoPatchV1 prim wY wY
p@(Merger{})) =
              case MaybeCommute prim
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wY wW
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wY wW)
forall (prim :: * -> * -> *) wX wY.
MaybeCommute prim
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wX wY
-> Maybe ((:>) (FL (RepoPatchV1 prim)) (RepoPatchV1 prim) wX wY)
commuteFLId MaybeCommute prim
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY
-> Maybe ((:>) (RepoPatchV1 prim) (RepoPatchV1 prim) wX wY)
commuteNoMerger (RepoPatchV1 prim wY wY
p RepoPatchV1 prim wY wY
-> FL (RepoPatchV1 prim) wY wW
-> (:>) (RepoPatchV1 prim) (FL (RepoPatchV1 prim)) wY wW
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV1 prim) wY wW
passedby) of
              Just (_ :> p' :: RepoPatchV1 prim wZ wW
p'@(Merger _ _ p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2)) ->
                  (FL prim wW Any -> Sealed (FL prim wW))
-> [FL prim wW Any] -> [Sealed (FL prim wW)]
forall a b. (a -> b) -> [a] -> [b]
map FL prim wW Any -> Sealed (FL prim wW)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed ((FL prim wW Any -> FL prim wW Any -> Bool)
-> [FL prim wW Any] -> [FL prim wW Any]
forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy FL prim wW Any -> FL prim wW Any -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare ([FL prim wW Any] -> [FL prim wW Any])
-> [FL prim wW Any] -> [FL prim wW Any]
forall a b. (a -> b) -> a -> b
$
                        FL (RepoPatchV1 prim) wW Any
-> FL (PrimOf (FL (RepoPatchV1 prim))) wW Any
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (FL (RepoPatchV1 prim) wB Any -> FL (RepoPatchV1 prim) wW Any
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart (FL (RepoPatchV1 prim) wB Any -> FL (RepoPatchV1 prim) wW Any)
-> FL (RepoPatchV1 prim) wB Any -> FL (RepoPatchV1 prim) wW Any
forall a b. (a -> b) -> a -> b
$ Sealed (FL (RepoPatchV1 prim) wB) -> FL (RepoPatchV1 prim) wB Any
forall (a :: * -> *) wX. Sealed a -> a wX
unsafeUnseal (RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wD -> Sealed (FL (RepoPatchV1 prim) wB)
forall (prim :: * -> * -> *) wX wY wZ.
PrimPatch prim =>
RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ -> Sealed (FL (RepoPatchV1 prim) wY)
glump09 RepoPatchV1 prim wC wB
p1 RepoPatchV1 prim wC wD
p2)) FL prim wW Any -> [FL prim wW Any] -> [FL prim wW Any]
forall a. a -> [a] -> [a]
:
                          (Sealed (FL prim wZ) -> FL prim wW Any)
-> [Sealed (FL prim wZ)] -> [FL prim wW Any]
forall a b. (a -> b) -> [a] -> [b]
map (FL prim wZ Any -> FL prim wW Any
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart (FL prim wZ Any -> FL prim wW Any)
-> (Sealed (FL prim wZ) -> FL prim wZ Any)
-> Sealed (FL prim wZ)
-> FL prim wW Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sealed (FL prim wZ) -> FL prim wZ Any
forall (a :: * -> *) wX. Sealed a -> a wX
unsafeUnseal) (RepoPatchV1 prim wZ wW -> [Sealed (FL prim wZ)]
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> [Sealed (FL prim wX)]
unravel RepoPatchV1 prim wZ wW
p'))
                  [Sealed (FL prim wW)]
-> [[Sealed (FL prim wW)]] -> [[Sealed (FL prim wW)]]
forall a. a -> [a] -> [a]
: FL (RepoPatchV1 prim) wY wW
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
forall wY wW wX.
FL (RepoPatchV1 prim) wY wW
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
rcs (RepoPatchV1 prim wY wY
p RepoPatchV1 prim wY wY
-> FL (RepoPatchV1 prim) wY wW -> FL (RepoPatchV1 prim) wY wW
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV1 prim) wY wW
passedby) RL (RepoPatchV1 prim) wX wY
ps
              Nothing -> FL (RepoPatchV1 prim) wY wW
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
forall wY wW wX.
FL (RepoPatchV1 prim) wY wW
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
rcs (RepoPatchV1 prim wY wY
p RepoPatchV1 prim wY wY
-> FL (RepoPatchV1 prim) wY wW -> FL (RepoPatchV1 prim) wY wW
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV1 prim) wY wW
passedby) RL (RepoPatchV1 prim) wX wY
ps
              _ -> [[Sealed (FL prim wW)]]
forall a. a
impossible
          rcs passedby :: FL (RepoPatchV1 prim) wY wW
passedby (ps :: RL (RepoPatchV1 prim) wX wY
ps:<:p :: RepoPatchV1 prim wY wY
p) = FL (RepoPatchV1 prim) wY wW
-> [[Sealed (FL prim wW)]] -> [[Sealed (FL prim wW)]]
forall a b. a -> b -> b
seq FL (RepoPatchV1 prim) wY wW
passedby ([[Sealed (FL prim wW)]] -> [[Sealed (FL prim wW)]])
-> [[Sealed (FL prim wW)]] -> [[Sealed (FL prim wW)]]
forall a b. (a -> b) -> a -> b
$
                                  FL (RepoPatchV1 prim) wY wW
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
forall wY wW wX.
FL (RepoPatchV1 prim) wY wW
-> RL (RepoPatchV1 prim) wX wY -> [[Sealed (FL prim wW)]]
rcs (RepoPatchV1 prim wY wY
p RepoPatchV1 prim wY wY
-> FL (RepoPatchV1 prim) wY wW -> FL (RepoPatchV1 prim) wY wW
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV1 prim) wY wW
passedby) RL (RepoPatchV1 prim) wX wY
ps

  conflictedEffect :: RepoPatchV1 prim wX wY
-> [IsConflictedPrim (PrimOf (RepoPatchV1 prim))]
conflictedEffect x :: RepoPatchV1 prim wX wY
x =
    case RepoPatchV1 prim wX wY -> [String]
forall (p :: * -> * -> *) wX wY. Conflict p => p wX wY -> [String]
listConflictedFiles RepoPatchV1 prim wX wY
x of
      [] -> (forall wW wZ. prim wW wZ -> IsConflictedPrim prim)
-> FL prim wX wY -> [IsConflictedPrim prim]
forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (ConflictState -> prim wW wZ -> IsConflictedPrim prim
forall (prim :: * -> * -> *) wX wY.
ConflictState -> prim wX wY -> IsConflictedPrim prim
IsC ConflictState
Okay) (FL prim wX wY -> [IsConflictedPrim (PrimOf (RepoPatchV1 prim))])
-> FL prim wX wY -> [IsConflictedPrim (PrimOf (RepoPatchV1 prim))]
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> FL (PrimOf (RepoPatchV1 prim)) wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect RepoPatchV1 prim wX wY
x
      _ -> (forall wW wZ. prim wW wZ -> IsConflictedPrim prim)
-> FL prim wX wY -> [IsConflictedPrim prim]
forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (ConflictState -> prim wW wZ -> IsConflictedPrim prim
forall (prim :: * -> * -> *) wX wY.
ConflictState -> prim wX wY -> IsConflictedPrim prim
IsC ConflictState
Conflicted) (FL prim wX wY -> [IsConflictedPrim (PrimOf (RepoPatchV1 prim))])
-> FL prim wX wY -> [IsConflictedPrim (PrimOf (RepoPatchV1 prim))]
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> FL (PrimOf (RepoPatchV1 prim)) wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect RepoPatchV1 prim wX wY
x


-- This type seems wrong - the most natural type for the result would seem to be
-- [Sealed (FL prim wX)], given the type of unwind.
-- However downstream code in darcs convert assumes the wY type, and I was unable
-- to figure out whether this could/should reasonably be changed -- Ganesh 13/4/10
publicUnravel :: PrimPatch prim => RepoPatchV1 prim wX wY -> [Sealed (FL prim wY)]
publicUnravel :: RepoPatchV1 prim wX wY -> [Sealed (FL prim wY)]
publicUnravel = (Sealed (FL prim wX) -> Sealed (FL prim wY))
-> [Sealed (FL prim wX)] -> [Sealed (FL prim wY)]
forall a b. (a -> b) -> [a] -> [b]
map ((forall wX. FL prim wX wX -> FL prim wY wX)
-> Sealed (FL prim wX) -> Sealed (FL prim wY)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal forall wX. FL prim wX wX -> FL prim wY wX
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart) ([Sealed (FL prim wX)] -> [Sealed (FL prim wY)])
-> (RepoPatchV1 prim wX wY -> [Sealed (FL prim wX)])
-> RepoPatchV1 prim wX wY
-> [Sealed (FL prim wY)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RepoPatchV1 prim wX wY -> [Sealed (FL prim wX)]
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> [Sealed (FL prim wX)]
unravel

unravel :: PrimPatch prim => RepoPatchV1 prim wX wY -> [Sealed (FL prim wX)]
unravel :: RepoPatchV1 prim wX wY -> [Sealed (FL prim wX)]
unravel p :: RepoPatchV1 prim wX wY
p = [Sealed (FL prim wX)] -> [Sealed (FL prim wX)]
forall a. Eq a => [a] -> [a]
nub ([Sealed (FL prim wX)] -> [Sealed (FL prim wX)])
-> [Sealed (FL prim wX)] -> [Sealed (FL prim wX)]
forall a b. (a -> b) -> a -> b
$ (Sealed (FL (RepoPatchV1 prim) wX) -> Sealed (FL prim wX))
-> [Sealed (FL (RepoPatchV1 prim) wX)] -> [Sealed (FL prim wX)]
forall a b. (a -> b) -> [a] -> [b]
map ((forall wX. FL (RepoPatchV1 prim) wX wX -> FL prim wX wX)
-> Sealed (FL (RepoPatchV1 prim) wX) -> Sealed (FL prim wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (FL prim wX wX -> FL prim wX wX
forall (prim :: * -> * -> *) wX wY.
PrimCanonize prim =>
FL prim wX wY -> FL prim wX wY
sortCoalesceFL (FL prim wX wX -> FL prim wX wX)
-> (FL (RepoPatchV1 prim) wX wX -> FL prim wX wX)
-> FL (RepoPatchV1 prim) wX wX
-> FL prim wX wX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL (FL prim) wX wX -> FL prim wX wX
forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL (FL (FL prim) wX wX -> FL prim wX wX)
-> (FL (RepoPatchV1 prim) wX wX -> FL (FL prim) wX wX)
-> FL (RepoPatchV1 prim) wX wX
-> FL prim wX wX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall wW wY. RepoPatchV1 prim wW wY -> FL prim wW wY)
-> FL (RepoPatchV1 prim) wX wX -> FL (FL prim) wX wX
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. RepoPatchV1 prim wW wY -> FL prim wW wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect)) ([Sealed (FL (RepoPatchV1 prim) wX)] -> [Sealed (FL prim wX)])
-> [Sealed (FL (RepoPatchV1 prim) wX)] -> [Sealed (FL prim wX)]
forall a b. (a -> b) -> a -> b
$
            [Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
getSupers ([Sealed (FL (RepoPatchV1 prim) wX)]
 -> [Sealed (FL (RepoPatchV1 prim) wX)])
-> [Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
forall a b. (a -> b) -> a -> b
$ (Sealed (RL (RepoPatchV1 prim) wX)
 -> Sealed (FL (RepoPatchV1 prim) wX))
-> [Sealed (RL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
forall a b. (a -> b) -> [a] -> [b]
map ((forall wX.
 RL (RepoPatchV1 prim) wX wX -> FL (RepoPatchV1 prim) wX wX)
-> Sealed (RL (RepoPatchV1 prim) wX)
-> Sealed (FL (RepoPatchV1 prim) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal forall wX.
RL (RepoPatchV1 prim) wX wX -> FL (RepoPatchV1 prim) wX wX
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL) ([Sealed (RL (RepoPatchV1 prim) wX)]
 -> [Sealed (FL (RepoPatchV1 prim) wX)])
-> [Sealed (RL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
forall a b. (a -> b) -> a -> b
$ (forall wX.
 RL (RepoPatchV1 prim) wX wX -> [Sealed (RL (RepoPatchV1 prim) wX)])
-> Sealed (RL (RepoPatchV1 prim) wX)
-> [Sealed (RL (RepoPatchV1 prim) wX)]
forall (a :: * -> *) b. (forall wX. a wX -> b) -> Sealed a -> b
unseal (RepoPatchV1 prim wX wY
-> RL (RepoPatchV1 prim) wX wX
-> [Sealed (RL (RepoPatchV1 prim) wX)]
forall (prim :: * -> * -> *) wA wB wX wY.
PrimPatch prim =>
RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wY
-> [Sealed (RL (RepoPatchV1 prim) wX)]
newUr RepoPatchV1 prim wX wY
p) (Sealed (RL (RepoPatchV1 prim) wX)
 -> [Sealed (RL (RepoPatchV1 prim) wX)])
-> Sealed (RL (RepoPatchV1 prim) wX)
-> [Sealed (RL (RepoPatchV1 prim) wX)]
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
unwind RepoPatchV1 prim wX wY
p

getSupers :: PrimPatch prim
    => [Sealed (FL (RepoPatchV1 prim) wX)] -> [Sealed (FL (RepoPatchV1 prim) wX)]
getSupers :: [Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
getSupers (x :: Sealed (FL (RepoPatchV1 prim) wX)
x:xs :: [Sealed (FL (RepoPatchV1 prim) wX)]
xs) =
    case (Sealed (FL (RepoPatchV1 prim) wX) -> Bool)
-> [Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not(Bool -> Bool)
-> (Sealed (FL (RepoPatchV1 prim) wX) -> Bool)
-> Sealed (FL (RepoPatchV1 prim) wX)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Sealed (FL (RepoPatchV1 prim) wX)
x Sealed (FL (RepoPatchV1 prim) wX)
-> Sealed (FL (RepoPatchV1 prim) wX) -> Bool
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Sealed (FL (RepoPatchV1 prim) wX)
-> Sealed (FL (RepoPatchV1 prim) wX) -> Bool
`isSuperpatchOf`)) [Sealed (FL (RepoPatchV1 prim) wX)]
xs of
    xs' :: [Sealed (FL (RepoPatchV1 prim) wX)]
xs' -> if (Sealed (FL (RepoPatchV1 prim) wX) -> Bool)
-> [Sealed (FL (RepoPatchV1 prim) wX)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Sealed (FL (RepoPatchV1 prim) wX)
-> Sealed (FL (RepoPatchV1 prim) wX) -> Bool
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Sealed (FL (RepoPatchV1 prim) wX)
-> Sealed (FL (RepoPatchV1 prim) wX) -> Bool
`isSuperpatchOf` Sealed (FL (RepoPatchV1 prim) wX)
x) [Sealed (FL (RepoPatchV1 prim) wX)]
xs'
           then [Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
getSupers [Sealed (FL (RepoPatchV1 prim) wX)]
xs'
           else Sealed (FL (RepoPatchV1 prim) wX)
x Sealed (FL (RepoPatchV1 prim) wX)
-> [Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
forall a. a -> [a] -> [a]
: [Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV1 prim) wX)]
-> [Sealed (FL (RepoPatchV1 prim) wX)]
getSupers [Sealed (FL (RepoPatchV1 prim) wX)]
xs'
getSupers [] = []

isSuperpatchOf :: PrimPatch prim
    => Sealed (FL (RepoPatchV1 prim) wX) -> Sealed (FL (RepoPatchV1 prim) wX) -> Bool
Sealed x :: FL (RepoPatchV1 prim) wX wX
x isSuperpatchOf :: Sealed (FL (RepoPatchV1 prim) wX)
-> Sealed (FL (RepoPatchV1 prim) wX) -> Bool
`isSuperpatchOf` Sealed y :: FL (RepoPatchV1 prim) wX wX
y | FL (RepoPatchV1 prim) wX wX -> Int
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Int
lengthFL FL (RepoPatchV1 prim) wX wX
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> FL (RepoPatchV1 prim) wX wX -> Int
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Int
lengthFL FL (RepoPatchV1 prim) wX wX
x = Bool
False -- should be just an optimisation
Sealed x :: FL (RepoPatchV1 prim) wX wX
x `isSuperpatchOf` Sealed y :: FL (RepoPatchV1 prim) wX wX
y = FL (RepoPatchV1 prim) wX wX
x FL (RepoPatchV1 prim) wX wX -> FL (RepoPatchV1 prim) wX wX -> Bool
forall (prim :: * -> * -> *) wX wY wZ.
PrimPatch prim =>
FL (RepoPatchV1 prim) wX wY -> FL (RepoPatchV1 prim) wX wZ -> Bool
`iso` FL (RepoPatchV1 prim) wX wX
y
    where iso :: PrimPatch prim => FL (RepoPatchV1 prim) wX wY -> FL (RepoPatchV1 prim) wX wZ -> Bool
          _ iso :: FL (RepoPatchV1 prim) wX wY -> FL (RepoPatchV1 prim) wX wZ -> Bool
`iso` NilFL = Bool
True
          NilFL `iso` _ = Bool
False
          a :: FL (RepoPatchV1 prim) wX wY
a `iso` (b :: RepoPatchV1 prim wX wY
b:>:bs :: FL (RepoPatchV1 prim) wY wZ
bs) =
              [Bool] -> Bool
forall a. [a] -> a
head ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ ([FL (RepoPatchV1 prim) wY wY
as FL (RepoPatchV1 prim) wY wY -> FL (RepoPatchV1 prim) wY wZ -> Bool
forall (prim :: * -> * -> *) wX wY wZ.
PrimPatch prim =>
FL (RepoPatchV1 prim) wX wY -> FL (RepoPatchV1 prim) wX wZ -> Bool
`iso` FL (RepoPatchV1 prim) wY wZ
FL (RepoPatchV1 prim) wY wZ
bs | (ah :: RepoPatchV1 prim wX wY
ah :>: as :: FL (RepoPatchV1 prim) wY wY
as) <- FL (RepoPatchV1 prim) wX wY -> [FL (RepoPatchV1 prim) wX wY]
forall (p :: * -> * -> *) wX wY.
Commute p =>
FL p wX wY -> [FL p wX wY]
simpleHeadPermutationsFL FL (RepoPatchV1 prim) wX wY
a, EqCheck wY wY
IsEq <- [RepoPatchV1 prim wX wY
ah RepoPatchV1 prim wX wY -> RepoPatchV1 prim wX wY -> EqCheck wY wY
forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= RepoPatchV1 prim wX wY
b]] :: [Bool]) [Bool] -> [Bool] -> [Bool]
forall a. [a] -> [a] -> [a]
++ [Bool
False]

-- | merger takes two patches, (which have been determined to conflict) and
-- constructs a Merger patch to represent the conflict. @p1@ is considered to
-- be conflicting with @p2@ (@p1@ is the "first" patch in the repo ordering),
-- the resulting Merger is therefore a representation of @p2@.
merger :: PrimPatch prim
    => String -> RepoPatchV1 prim wX wY -> RepoPatchV1 prim wX wZ -> Sealed (RepoPatchV1 prim wY)
merger :: String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> Sealed (RepoPatchV1 prim wY)
merger "0.0" p1 :: RepoPatchV1 prim wX wY
p1 p2 :: RepoPatchV1 prim wX wZ
p2 = RepoPatchV1 prim wY Any -> Sealed (RepoPatchV1 prim wY)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RepoPatchV1 prim wY Any -> Sealed (RepoPatchV1 prim wY))
-> RepoPatchV1 prim wY Any -> Sealed (RepoPatchV1 prim wY)
forall a b. (a -> b) -> a -> b
$ FL (RepoPatchV1 prim) wY Any
-> RL (RepoPatchV1 prim) wY wY
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wY Any
forall (prim :: * -> * -> *) wX wY wB wC wD.
FL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wX wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wX wY
Merger FL (RepoPatchV1 prim) wY Any
forall wB wC. FL (RepoPatchV1 prim) wB wC
undoit RL (RepoPatchV1 prim) wY wY
forall wX. RL (RepoPatchV1 prim) wY wX
unwindings RepoPatchV1 prim wX wY
p1 RepoPatchV1 prim wX wZ
p2
    where fake_p :: RepoPatchV1 prim wY wY
fake_p = FL (RepoPatchV1 prim) wY wY
-> RL (RepoPatchV1 prim) wY wY
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wY wY
forall (prim :: * -> * -> *) wX wY wB wC wD.
FL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wX wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wX wY
Merger FL (RepoPatchV1 prim) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL RL (RepoPatchV1 prim) wY wY
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL RepoPatchV1 prim wX wY
p1 RepoPatchV1 prim wX wZ
p2
          unwindings :: RL (RepoPatchV1 prim) wY wX
unwindings = Sealed (RL (RepoPatchV1 prim) wY) -> RL (RepoPatchV1 prim) wY wX
forall (a :: * -> *) wX. Sealed a -> a wX
unsafeUnseal (RepoPatchV1 prim wY wY -> Sealed (RL (RepoPatchV1 prim) wY)
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
trueUnwind RepoPatchV1 prim wY wY
fake_p)
          p :: RepoPatchV1 prim wY wY
p = FL (RepoPatchV1 prim) wY wY
-> RL (RepoPatchV1 prim) wY wY
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> RepoPatchV1 prim wY wY
forall (prim :: * -> * -> *) wX wY wB wC wD.
FL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wX wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wX wY
Merger FL (RepoPatchV1 prim) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL RL (RepoPatchV1 prim) wY wY
forall wX. RL (RepoPatchV1 prim) wY wX
unwindings RepoPatchV1 prim wX wY
p1 RepoPatchV1 prim wX wZ
p2
          undoit :: FL (RepoPatchV1 prim) wB wC
undoit =
              case (RepoPatchV1 prim wX wY -> Bool
forall (prim :: * -> * -> *) wA wB. RepoPatchV1 prim wA wB -> Bool
isMerger RepoPatchV1 prim wX wY
p1, RepoPatchV1 prim wX wZ -> Bool
forall (prim :: * -> * -> *) wA wB. RepoPatchV1 prim wA wB -> Bool
isMerger RepoPatchV1 prim wX wZ
p2) of
              (True ,True ) -> case RepoPatchV1 prim wY wY -> Sealed (RL (RepoPatchV1 prim) wY)
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
unwind RepoPatchV1 prim wY wY
p of
                                 Sealed (t :: RL (RepoPatchV1 prim) wY wY
t:<:_) -> FL (RepoPatchV1 prim) wY wY -> FL (RepoPatchV1 prim) wB wC
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP (FL (RepoPatchV1 prim) wY wY -> FL (RepoPatchV1 prim) wB wC)
-> FL (RepoPatchV1 prim) wY wY -> FL (RepoPatchV1 prim) wB wC
forall a b. (a -> b) -> a -> b
$ RL (RepoPatchV1 prim) wY wY -> FL (RepoPatchV1 prim) wY wY
forall (p :: * -> * -> *) wX wY.
Invert p =>
RL p wX wY -> FL p wY wX
invertRL RL (RepoPatchV1 prim) wY wY
t
                                 _ -> FL (RepoPatchV1 prim) wB wC
forall a. a
impossible
              (False,False) -> FL (RepoPatchV1 prim) wY wX -> FL (RepoPatchV1 prim) wB wC
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP (FL (RepoPatchV1 prim) wY wX -> FL (RepoPatchV1 prim) wB wC)
-> FL (RepoPatchV1 prim) wY wX -> FL (RepoPatchV1 prim) wB wC
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> RepoPatchV1 prim wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wX wY
p1 RepoPatchV1 prim wY wX
-> FL (RepoPatchV1 prim) wX wX -> FL (RepoPatchV1 prim) wY wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV1 prim) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
              (True ,False) -> FL (RepoPatchV1 prim) Any Any -> FL (RepoPatchV1 prim) wB wC
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP FL (RepoPatchV1 prim) Any Any
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
              (False,True ) -> FL (RepoPatchV1 prim) wY wZ -> FL (RepoPatchV1 prim) wB wC
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP (FL (RepoPatchV1 prim) wY wZ -> FL (RepoPatchV1 prim) wB wC)
-> FL (RepoPatchV1 prim) wY wZ -> FL (RepoPatchV1 prim) wB wC
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> RepoPatchV1 prim wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wX wY
p1 RepoPatchV1 prim wY wX
-> FL (RepoPatchV1 prim) wX wZ -> FL (RepoPatchV1 prim) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: RepoPatchV1 prim wX wZ -> FL (RepoPatchV1 prim) wX wZ
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
mergerUndo RepoPatchV1 prim wX wZ
p2
merger g :: String
g _ _ =
    String -> Sealed (RepoPatchV1 prim wY)
forall a. HasCallStack => String -> a
error (String -> Sealed (RepoPatchV1 prim wY))
-> String -> Sealed (RepoPatchV1 prim wY)
forall a b. (a -> b) -> a -> b
$ "Cannot handle mergers other than version 0.0\n"String -> String -> String
forall a. [a] -> [a] -> [a]
++String
g
    String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\nPlease use darcs optimize --modernize with an older darcs."

glump09 :: PrimPatch prim => RepoPatchV1 prim wX wY -> RepoPatchV1 prim wX wZ -> Sealed (FL (RepoPatchV1 prim) wY)
glump09 :: RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ -> Sealed (FL (RepoPatchV1 prim) wY)
glump09 p1 :: RepoPatchV1 prim wX wY
p1 p2 :: RepoPatchV1 prim wX wZ
p2 = (forall wX. FL prim wY wX -> FL (RepoPatchV1 prim) wY wX)
-> Sealed (FL prim wY) -> Sealed (FL (RepoPatchV1 prim) wY)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal ((forall wW wY. prim wW wY -> RepoPatchV1 prim wW wY)
-> FL prim wY wX -> FL (RepoPatchV1 prim) wY wX
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. prim wW wY -> RepoPatchV1 prim wW wY
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim) (Sealed (FL prim wY) -> Sealed (FL (RepoPatchV1 prim) wY))
-> Sealed (FL prim wY) -> Sealed (FL (RepoPatchV1 prim) wY)
forall a b. (a -> b) -> a -> b
$ [Sealed (FL prim wY)] -> Sealed (FL prim wY)
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL prim wX)] -> Sealed (FL prim wX)
mangleUnravelled ([Sealed (FL prim wY)] -> Sealed (FL prim wY))
-> [Sealed (FL prim wY)] -> Sealed (FL prim wY)
forall a b. (a -> b) -> a -> b
$ (forall wX. RepoPatchV1 prim wY wX -> [Sealed (FL prim wY)])
-> Sealed (RepoPatchV1 prim wY) -> [Sealed (FL prim wY)]
forall (a :: * -> *) b. (forall wX. a wX -> b) -> Sealed a -> b
unseal forall wX. RepoPatchV1 prim wY wX -> [Sealed (FL prim wY)]
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV1 prim wX wY -> [Sealed (FL prim wX)]
unravel (Sealed (RepoPatchV1 prim wY) -> [Sealed (FL prim wY)])
-> Sealed (RepoPatchV1 prim wY) -> [Sealed (FL prim wY)]
forall a b. (a -> b) -> a -> b
$ String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> Sealed (RepoPatchV1 prim wY)
forall (prim :: * -> * -> *) wX wY wZ.
PrimPatch prim =>
String
-> RepoPatchV1 prim wX wY
-> RepoPatchV1 prim wX wZ
-> Sealed (RepoPatchV1 prim wY)
merger "0.0" RepoPatchV1 prim wX wY
p1 RepoPatchV1 prim wX wZ
p2

instance PrimPatch prim => Effect (RepoPatchV1 prim) where
    effect :: RepoPatchV1 prim wX wY -> FL (PrimOf (RepoPatchV1 prim)) wX wY
effect p :: RepoPatchV1 prim wX wY
p@(Merger{}) = FL prim wX wY -> FL (PrimOf (RepoPatchV1 prim)) wX wY
forall (prim :: * -> * -> *) wX wY.
PrimCanonize prim =>
FL prim wX wY -> FL prim wX wY
sortCoalesceFL (FL prim wX wY -> FL (PrimOf (RepoPatchV1 prim)) wX wY)
-> FL prim wX wY -> FL (PrimOf (RepoPatchV1 prim)) wX wY
forall a b. (a -> b) -> a -> b
$ FL (RepoPatchV1 prim) wX wY -> FL prim wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (FL (RepoPatchV1 prim) wX wY -> FL prim wX wY)
-> FL (RepoPatchV1 prim) wX wY -> FL prim wX wY
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> FL (RepoPatchV1 prim) wX wY
mergerUndo RepoPatchV1 prim wX wY
p
    effect p :: RepoPatchV1 prim wX wY
p@(Regrem{}) = FL prim wY wX -> FL (PrimOf (RepoPatchV1 prim)) wX wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (FL prim wY wX -> FL (PrimOf (RepoPatchV1 prim)) wX wY)
-> FL prim wY wX -> FL (PrimOf (RepoPatchV1 prim)) wX wY
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wY wX -> FL prim wY wX
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (RepoPatchV1 prim wY wX -> FL prim wY wX)
-> RepoPatchV1 prim wY wX -> FL prim wY wX
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wX wY -> RepoPatchV1 prim wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV1 prim wX wY
p
    effect (PP p :: prim wX wY
p) = prim wX wY
p prim wX wY -> FL prim wY wY -> FL prim wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL

instance IsHunk prim => IsHunk (RepoPatchV1 prim) where
    isHunk :: RepoPatchV1 prim wX wY -> Maybe (FileHunk wX wY)
isHunk p :: RepoPatchV1 prim wX wY
p = do PP p' :: prim wX wY
p' <- RepoPatchV1 prim wX wY -> Maybe (RepoPatchV1 prim wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return RepoPatchV1 prim wX wY
p
                  prim wX wY -> Maybe (FileHunk wX wY)
forall (p :: * -> * -> *) wX wY.
IsHunk p =>
p wX wY -> Maybe (FileHunk wX wY)
isHunk prim wX wY
p'

newUr :: PrimPatch prim
    => RepoPatchV1 prim wA wB -> RL (RepoPatchV1 prim) wX wY -> [Sealed (RL (RepoPatchV1 prim) wX)]
newUr :: RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wY
-> [Sealed (RL (RepoPatchV1 prim) wX)]
newUr p :: RepoPatchV1 prim wA wB
p (ps :: RL (RepoPatchV1 prim) wX wY
ps :<: Merger _ _ p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2) =
   case (RL (RepoPatchV1 prim) wX wY -> Bool)
-> [RL (RepoPatchV1 prim) wX wY] -> [RL (RepoPatchV1 prim) wX wY]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(_:<:pp :: RepoPatchV1 prim wY wY
pp) -> RepoPatchV1 prim wY wY
pp RepoPatchV1 prim wY wY -> RepoPatchV1 prim wC wB -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
`unsafeCompare` RepoPatchV1 prim wC wB
p1) ([RL (RepoPatchV1 prim) wX wY] -> [RL (RepoPatchV1 prim) wX wY])
-> [RL (RepoPatchV1 prim) wX wY] -> [RL (RepoPatchV1 prim) wX wY]
forall a b. (a -> b) -> a -> b
$ RL (RepoPatchV1 prim) wX wY -> [RL (RepoPatchV1 prim) wX wY]
forall (p :: * -> * -> *) wX wY.
Commute p =>
RL p wX wY -> [RL p wX wY]
headPermutationsRL RL (RepoPatchV1 prim) wX wY
ps of
   ((ps' :: RL (RepoPatchV1 prim) wX wY
ps':<:_):_) -> RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wB
-> [Sealed (RL (RepoPatchV1 prim) wX)]
forall (prim :: * -> * -> *) wA wB wX wY.
PrimPatch prim =>
RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wY
-> [Sealed (RL (RepoPatchV1 prim) wX)]
newUr RepoPatchV1 prim wA wB
p (RL (RepoPatchV1 prim) wX wY
ps'RL (RepoPatchV1 prim) wX wY
-> RepoPatchV1 prim wY wB -> RL (RepoPatchV1 prim) wX wB
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<:RepoPatchV1 prim wC wB -> RepoPatchV1 prim wY wB
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart RepoPatchV1 prim wC wB
p1) [Sealed (RL (RepoPatchV1 prim) wX)]
-> [Sealed (RL (RepoPatchV1 prim) wX)]
-> [Sealed (RL (RepoPatchV1 prim) wX)]
forall a. [a] -> [a] -> [a]
++ RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wD
-> [Sealed (RL (RepoPatchV1 prim) wX)]
forall (prim :: * -> * -> *) wA wB wX wY.
PrimPatch prim =>
RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wY
-> [Sealed (RL (RepoPatchV1 prim) wX)]
newUr RepoPatchV1 prim wA wB
p (RL (RepoPatchV1 prim) wX wY
ps'RL (RepoPatchV1 prim) wX wY
-> RepoPatchV1 prim wY wD -> RL (RepoPatchV1 prim) wX wD
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<:RepoPatchV1 prim wC wD -> RepoPatchV1 prim wY wD
forall (a :: * -> * -> *) wX1 wY wX2. a wX1 wY -> a wX2 wY
unsafeCoercePStart RepoPatchV1 prim wC wD
p2)
   _ -> Doc -> [Sealed (RL (RepoPatchV1 prim) wX)]
forall a. Doc -> a
errorDoc (Doc -> [Sealed (RL (RepoPatchV1 prim) wX)])
-> Doc -> [Sealed (RL (RepoPatchV1 prim) wX)]
forall a b. (a -> b) -> a -> b
$ String -> Doc
text "in function newUr"
                 Doc -> Doc -> Doc
$$ String -> Doc
text "Original patch:"
                 Doc -> Doc -> Doc
$$ RepoPatchV1 prim wA wB -> Doc
forall (prim :: * -> * -> *) wX wY.
ShowPatchBasic prim =>
prim wX wY -> Doc
showPatch_ RepoPatchV1 prim wA wB
p
                 Doc -> Doc -> Doc
$$ String -> Doc
text "Unwound:"
                 Doc -> Doc -> Doc
$$ [Doc] -> Doc
vcat ((forall wX. RL (RepoPatchV1 prim) wA wX -> [Doc])
-> Sealed (RL (RepoPatchV1 prim) wA) -> [Doc]
forall (a :: * -> *) b. (forall wX. a wX -> b) -> Sealed a -> b
unseal ((forall wW wZ. RepoPatchV1 prim wW wZ -> Doc)
-> RL (RepoPatchV1 prim) wA wX -> [Doc]
forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> RL a wX wY -> [b]
mapRL forall wW wZ. RepoPatchV1 prim wW wZ -> Doc
forall (prim :: * -> * -> *) wX wY.
ShowPatchBasic prim =>
prim wX wY -> Doc
showPatch_) (Sealed (RL (RepoPatchV1 prim) wA) -> [Doc])
-> Sealed (RL (RepoPatchV1 prim) wA) -> [Doc]
forall a b. (a -> b) -> a -> b
$ RepoPatchV1 prim wA wB -> Sealed (RL (RepoPatchV1 prim) wA)
forall (prim :: * -> * -> *) wX wY.
RepoPatchV1 prim wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
unwind RepoPatchV1 prim wA wB
p)

newUr op :: RepoPatchV1 prim wA wB
op ps :: RL (RepoPatchV1 prim) wX wY
ps =
    case (RL (RepoPatchV1 prim) wX wY -> Bool)
-> [RL (RepoPatchV1 prim) wX wY] -> [RL (RepoPatchV1 prim) wX wY]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(_:<:p :: RepoPatchV1 prim wY wY
p) -> RepoPatchV1 prim wY wY -> Bool
forall (prim :: * -> * -> *) wA wB. RepoPatchV1 prim wA wB -> Bool
isMerger RepoPatchV1 prim wY wY
p) ([RL (RepoPatchV1 prim) wX wY] -> [RL (RepoPatchV1 prim) wX wY])
-> [RL (RepoPatchV1 prim) wX wY] -> [RL (RepoPatchV1 prim) wX wY]
forall a b. (a -> b) -> a -> b
$ RL (RepoPatchV1 prim) wX wY -> [RL (RepoPatchV1 prim) wX wY]
forall (p :: * -> * -> *) wX wY.
Commute p =>
RL p wX wY -> [RL p wX wY]
headPermutationsRL RL (RepoPatchV1 prim) wX wY
ps of
    [] -> [RL (RepoPatchV1 prim) wX wY -> Sealed (RL (RepoPatchV1 prim) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed RL (RepoPatchV1 prim) wX wY
ps]
    (ps' :: RL (RepoPatchV1 prim) wX wY
ps':_) -> RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wY
-> [Sealed (RL (RepoPatchV1 prim) wX)]
forall (prim :: * -> * -> *) wA wB wX wY.
PrimPatch prim =>
RepoPatchV1 prim wA wB
-> RL (RepoPatchV1 prim) wX wY
-> [Sealed (RL (RepoPatchV1 prim) wX)]
newUr RepoPatchV1 prim wA wB
op RL (RepoPatchV1 prim) wX wY
ps'

instance Invert prim => Invert (RepoPatchV1 prim) where
    invert :: RepoPatchV1 prim wX wY -> RepoPatchV1 prim wY wX
invert (Merger undo :: FL (RepoPatchV1 prim) wX wY
undo unwindings :: RL (RepoPatchV1 prim) wX wB
unwindings p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wD
p2)
        = FL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wX wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wY wX
forall (prim :: * -> * -> *) wX wY wB wC wA.
FL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wX wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wA
-> RepoPatchV1 prim wY wX
Regrem FL (RepoPatchV1 prim) wX wY
undo RL (RepoPatchV1 prim) wX wB
unwindings RepoPatchV1 prim wC wB
p1 RepoPatchV1 prim wC wD
p2
    invert (Regrem undo :: FL (RepoPatchV1 prim) wY wX
undo unwindings :: RL (RepoPatchV1 prim) wY wB
unwindings p1 :: RepoPatchV1 prim wC wB
p1 p2 :: RepoPatchV1 prim wC wA
p2)
        = FL (RepoPatchV1 prim) wY wX
-> RL (RepoPatchV1 prim) wY wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wA
-> RepoPatchV1 prim wY wX
forall (prim :: * -> * -> *) wX wY wB wC wD.
FL (RepoPatchV1 prim) wX wY
-> RL (RepoPatchV1 prim) wX wB
-> RepoPatchV1 prim wC wB
-> RepoPatchV1 prim wC wD
-> RepoPatchV1 prim wX wY
Merger FL (RepoPatchV1 prim) wY wX
undo RL (RepoPatchV1 prim) wY wB
unwindings RepoPatchV1 prim wC wB
p1 RepoPatchV1 prim wC wA
p2
    invert (PP p :: prim wX wY
p) = prim wY wX -> RepoPatchV1 prim wY wX
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV1 prim wX wY
PP (prim wX wY -> prim wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert prim wX wY
p)

instance Eq2 prim => Eq2 (RepoPatchV1 prim) where
    unsafeCompare :: RepoPatchV1 prim wA wB -> RepoPatchV1 prim wC wD -> Bool
unsafeCompare = RepoPatchV1 prim wA wB -> RepoPatchV1 prim wC wD -> Bool
forall (prim :: * -> * -> *) wX wY wW wZ.
Eq2 prim =>
RepoPatchV1 prim wX wY -> RepoPatchV1 prim wW wZ -> Bool
eqPatches

instance Eq2 prim => Eq (RepoPatchV1 prim wX wY) where
    == :: RepoPatchV1 prim wX wY -> RepoPatchV1 prim wX wY -> Bool
(==) = RepoPatchV1 prim wX wY -> RepoPatchV1 prim wX wY -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare

eqPatches :: Eq2 prim => RepoPatchV1 prim wX wY -> RepoPatchV1 prim wW wZ -> Bool
eqPatches :: RepoPatchV1 prim wX wY -> RepoPatchV1 prim wW wZ -> Bool
eqPatches (PP p1 :: prim wX wY
p1) (PP p2 :: prim wW wZ
p2) = prim wX wY -> prim wW wZ -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare prim wX wY
p1 prim wW wZ
p2
eqPatches (Merger _ _ p1a :: RepoPatchV1 prim wC wB
p1a p1b :: RepoPatchV1 prim wC wD
p1b) (Merger _ _ p2a :: RepoPatchV1 prim wC wB
p2a p2b :: RepoPatchV1 prim wC wD
p2b)
 = RepoPatchV1 prim wC wB -> RepoPatchV1 prim wC wB -> Bool
forall (prim :: * -> * -> *) wX wY wW wZ.
Eq2 prim =>
RepoPatchV1 prim wX wY -> RepoPatchV1 prim wW wZ -> Bool
eqPatches RepoPatchV1 prim wC wB
p1a RepoPatchV1 prim wC wB
p2a Bool -> Bool -> Bool
&&
   RepoPatchV1 prim wC wD -> RepoPatchV1 prim wC wD -> Bool
forall (prim :: * -> * -> *) wX wY wW wZ.
Eq2 prim =>
RepoPatchV1 prim wX wY -> RepoPatchV1 prim wW wZ -> Bool
eqPatches RepoPatchV1 prim wC wD
p1b RepoPatchV1 prim wC wD
p2b
eqPatches (Regrem _ _ p1a :: RepoPatchV1 prim wC wB
p1a p1b :: RepoPatchV1 prim wC wA
p1b) (Regrem _ _ p2a :: RepoPatchV1 prim wC wB
p2a p2b :: RepoPatchV1 prim wC wA
p2b)
 = RepoPatchV1 prim wC wB -> RepoPatchV1 prim wC wB -> Bool
forall (prim :: * -> * -> *) wX wY wW wZ.
Eq2 prim =>
RepoPatchV1 prim wX wY -> RepoPatchV1 prim wW wZ -> Bool
eqPatches RepoPatchV1 prim wC wB
p1a RepoPatchV1 prim wC wB
p2a Bool -> Bool -> Bool
&&
   RepoPatchV1 prim wC wA -> RepoPatchV1 prim wC wA -> Bool
forall (prim :: * -> * -> *) wX wY wW wZ.
Eq2 prim =>
RepoPatchV1 prim wX wY -> RepoPatchV1 prim wW wZ -> Bool
eqPatches RepoPatchV1 prim wC wA
p1b RepoPatchV1 prim wC wA
p2b
eqPatches _ _ = Bool
False