{-# 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 :: 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
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
]
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
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
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
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)
(_ :> 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'')
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
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)
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"
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
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
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 :: 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