{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-name-shadowing #-}
module Darcs.Patch.V2.RepoPatch
( RepoPatchV2(..)
, isConsistent
, isForward
, isDuplicate
, mergeUnravelled
) where
import Darcs.Prelude hiding ( (*>) )
import Control.Monad ( mplus, liftM )
import qualified Data.ByteString.Char8 as BC ( ByteString, pack )
import Data.Maybe ( fromMaybe )
import Data.List ( partition, nub )
import Data.List.Ordered ( nubSort )
import Darcs.Patch.Commute ( commuteFL, commuteRL
, commuteRLFL, Commute(..) )
import Darcs.Patch.CommuteFn ( CommuteFn, invertCommuter )
import Darcs.Patch.CommuteNoConflicts ( CommuteNoConflicts(..), mergeNoConflicts )
import Darcs.Patch.Conflict ( Conflict(..), combineConflicts, mangleOrFail )
import Darcs.Patch.Debug
import Darcs.Patch.Effect ( Effect(..) )
import Darcs.Patch.FileHunk ( IsHunk(..) )
import Darcs.Patch.Format ( PatchListFormat(..), ListFormat(ListFormatV2) )
import Darcs.Patch.Ident ( PatchId )
import Darcs.Patch.Invert ( invertFL, invertRL, Invert(..) )
import Darcs.Patch.Merge ( CleanMerge(..), Merge(..), swapMerge )
import Darcs.Patch.FromPrim
( FromPrim(..)
, ToPrim(..)
, PrimPatchBase(..)
)
import Darcs.Patch.Prim ( PrimPatch, applyPrimFL )
import Darcs.Patch.Read ( bracketedFL, ReadPatch(..) )
import Darcs.Util.Parser ( skipSpace, string, choice )
import Darcs.Patch.Repair ( mapMaybeSnd, RepairToFL(..), Check(..) )
import Darcs.Patch.Apply ( Apply(..) )
import Darcs.Patch.Inspect ( PatchInspect(..) )
import Darcs.Patch.Permutations ( commuteWhatWeCanFL, commuteWhatWeCanRL
, genCommuteWhatWeCanRL, removeRL, removeFL
, removeSubsequenceFL )
import Darcs.Patch.Show
( ShowPatch(..), ShowPatchBasic(..), ShowContextPatch(..), ShowPatchFor(..)
, displayPatch )
import Darcs.Patch.Summary
( Summary(..)
, ConflictState(..)
, IsConflictedPrim(..)
, plainSummary
)
import Darcs.Patch.Unwind ( Unwind(..), mkUnwound )
import Darcs.Patch.V2.Non ( Non(..), Nonable(..), unNon, showNons, showNon
, readNons, readNon, commutePrimsOrAddToCtx
, commuteOrAddToCtx, commuteOrAddToCtxRL
, commuteOrRemFromCtx, commuteOrRemFromCtxFL
, remNons, (*>), (>*), (*>>), (>>*) )
import Darcs.Patch.Witnesses.Unsafe ( unsafeCoerceP )
import Darcs.Patch.Witnesses.Eq ( Eq2(..), EqCheck(..) )
import Darcs.Patch.Witnesses.Ordered
( FL(..), RL(..), Fork(..), (:>)(..), (+>+), (+<+)
, mapFL, mapFL_FL, reverseFL, (:\/:)(..), (:/\:)(..)
, reverseRL, lengthFL, lengthRL, nullFL, initsFL )
import Darcs.Patch.Witnesses.Sealed
( FlippedSeal(..), Sealed(Sealed), mapSeal
, unseal )
import Darcs.Patch.Witnesses.Show ( Show1, Show2, showsPrec2, appPrec )
import Darcs.Util.Path ( AnchoredPath )
import Darcs.Util.Printer ( Doc, renderString, blueText, redText, (<+>), ($$), vcat )
data RepoPatchV2 prim wX wY where
Duplicate :: Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Etacilpud :: Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Normal :: prim wX wY -> RepoPatchV2 prim wX wY
Conflictor :: [Non (RepoPatchV2 prim) wX] -> FL prim wX wY
-> Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wY wX
InvConflictor :: [Non (RepoPatchV2 prim) wX] -> FL prim wX wY
-> Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wY
instance PrimPatch prim => PrimPatchBase (RepoPatchV2 prim) where
type PrimOf (RepoPatchV2 prim) = prim
isDuplicate :: RepoPatchV2 prim wS wY -> Bool
isDuplicate :: forall (prim :: * -> * -> *) wS wY. RepoPatchV2 prim wS wY -> Bool
isDuplicate (Duplicate Non (RepoPatchV2 prim) wS
_) = Bool
True
isDuplicate (Etacilpud Non (RepoPatchV2 prim) wS
_) = Bool
True
isDuplicate RepoPatchV2 prim wS wY
_ = Bool
False
isForward :: PrimPatch prim => RepoPatchV2 prim wS wY -> Maybe Doc
isForward :: forall (prim :: * -> * -> *) wS wY.
PrimPatch prim =>
RepoPatchV2 prim wS wY -> Maybe Doc
isForward RepoPatchV2 prim wS wY
p = case RepoPatchV2 prim wS wY
p of
p :: RepoPatchV2 prim wS wY
p@(InvConflictor{}) -> forall {p :: * -> * -> *} {wX} {wY}.
ShowPatchBasic p =>
String -> p wX wY -> Maybe Doc
justRedP String
"An inverse conflictor" RepoPatchV2 prim wS wY
p
p :: RepoPatchV2 prim wS wY
p@(Etacilpud Non (RepoPatchV2 prim) wS
_) -> forall {p :: * -> * -> *} {wX} {wY}.
ShowPatchBasic p =>
String -> p wX wY -> Maybe Doc
justRedP String
"An inverse duplicate" RepoPatchV2 prim wS wY
p
RepoPatchV2 prim wS wY
_ -> forall a. Maybe a
Nothing
where
justRedP :: String -> p wX wY -> Maybe Doc
justRedP String
msg p wX wY
p = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
msg Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch p wX wY
p
mergeUnravelled :: PrimPatch prim => [Sealed ((FL prim) wX)]
-> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
mergeUnravelled :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL prim wX)] -> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
mergeUnravelled [] = forall a. Maybe a
Nothing
mergeUnravelled [Sealed (FL prim wX)
_] = forall a. Maybe a
Nothing
mergeUnravelled [Sealed (FL prim wX)]
ws =
case forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL prim wX)] -> Maybe (RL (RepoPatchV2 prim) wX wX)
mergeUnravelled_private [Sealed (FL prim wX)]
ws of
Maybe (RL (RepoPatchV2 prim) wX wX)
Nothing -> forall a. Maybe a
Nothing
Just RL (RepoPatchV2 prim) wX wX
NilRL -> forall a. HasCallStack => String -> a
error String
"found no patches in mergeUnravelled"
Just (RL (RepoPatchV2 prim) wX wY
_ :<: RepoPatchV2 prim wY wX
z) -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) wI wY. a wI wY -> FlippedSeal a wY
FlippedSeal RepoPatchV2 prim wY wX
z
where
notNullS :: Sealed ((FL prim) wX) -> Bool
notNullS :: forall (prim :: * -> * -> *) wX. Sealed (FL prim wX) -> Bool
notNullS (Sealed FL prim wX wX
NilFL) = Bool
False
notNullS Sealed (FL prim wX)
_ = Bool
True
mergeUnravelled_private :: PrimPatch prim => [Sealed (FL prim wX)]
-> Maybe (RL (RepoPatchV2 prim) wX wX)
mergeUnravelled_private :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL prim wX)] -> Maybe (RL (RepoPatchV2 prim) wX wX)
mergeUnravelled_private [Sealed (FL prim wX)]
xs = let nonNullXs :: [Sealed (FL prim wX)]
nonNullXs = forall a. (a -> Bool) -> [a] -> [a]
filter forall (prim :: * -> * -> *) wX. Sealed (FL prim wX) -> Bool
notNullS [Sealed (FL prim wX)]
xs in
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX] -> Maybe (FL (RepoPatchV2 prim) wX wX)
mergeConflictingNons (forall a b. (a -> b) -> [a] -> [b]
map forall (prim :: * -> * -> *) wX.
Sealed (FL prim wX) -> Non (RepoPatchV2 prim) wX
sealed2non [Sealed (FL prim wX)]
nonNullXs)
sealed2non :: Sealed ((FL prim) wX) -> Non (RepoPatchV2 prim) wX
sealed2non :: forall (prim :: * -> * -> *) wX.
Sealed (FL prim wX) -> Non (RepoPatchV2 prim) wX
sealed2non (Sealed FL prim wX wX
xs) =
case forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL prim wX wX
xs of
RL prim wX wY
ys :<: prim wY wX
y -> forall (p :: * -> * -> *) wX wI wY.
FL p wX wI -> PrimOf p wI wY -> Non p wX
Non (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 (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL prim wX wY
ys) prim wY wX
y
RL prim wX wX
NilRL -> forall a. HasCallStack => String -> a
error String
"NilFL encountered in sealed2non"
mergeConflictingNons :: PrimPatch prim => [Non (RepoPatchV2 prim) wX]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
mergeConflictingNons :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX] -> Maybe (FL (RepoPatchV2 prim) wX wX)
mergeConflictingNons [Non (RepoPatchV2 prim) wX]
ns = forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
mcn forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall (p :: * -> * -> *) wX.
FromPrim p =>
Non p wX -> Sealed (FL p wX)
unNon [Non (RepoPatchV2 prim) wX]
ns
where mcn :: PrimPatch prim => [Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
mcn :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
mcn [] = forall a. a -> Maybe a
Just forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
mcn [Sealed FL (RepoPatchV2 prim) wX wX
p] = case forall (p :: * -> * -> *) wX wY.
(Effect p, Invert (PrimOf p), Commute (PrimOf p),
Eq2 (PrimOf p)) =>
p wX wY -> FL (PrimOf p) wX wY
joinEffects FL (RepoPatchV2 prim) wX wX
p of
FL (PrimOf (FL (RepoPatchV2 prim))) wX wX
NilFL -> forall a. a -> Maybe a
Just FL (RepoPatchV2 prim) wX wX
p
FL (PrimOf (FL (RepoPatchV2 prim))) wX wX
_ -> forall a. Maybe a
Nothing
mcn (Sealed FL (RepoPatchV2 prim) wX wX
p1:Sealed FL (RepoPatchV2 prim) wX wX
p2:[Sealed (FL (RepoPatchV2 prim) wX)]
zs) =
case forall (p :: * -> * -> *) wO wX wY.
(Commute p, Eq2 p) =>
FL p wO wX -> FL p wO wY -> Common p wO wX wY
pullCommon FL (RepoPatchV2 prim) wX wX
p1 FL (RepoPatchV2 prim) wX wX
p2 of
Fork FL (RepoPatchV2 prim) wX wU
c FL (RepoPatchV2 prim) wU wX
ps FL (RepoPatchV2 prim) wU wX
qs ->
case forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
merge (FL (RepoPatchV2 prim) wU wX
ps forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: FL (RepoPatchV2 prim) wU wX
qs) of
FL (RepoPatchV2 prim) wX wZ
qs' :/\: FL (RepoPatchV2 prim) wX wZ
_ -> forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
mcn (forall (a :: * -> *) wI. a wI -> Sealed a
Sealed (FL (RepoPatchV2 prim) wX wU
c forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wU wX
ps forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wX wZ
qs')forall a. a -> [a] -> [a]
:[Sealed (FL (RepoPatchV2 prim) wX)]
zs)
joinEffects :: forall p wX wY . (Effect p, Invert (PrimOf p),
Commute (PrimOf p), Eq2 (PrimOf p)) => p wX wY
-> FL (PrimOf p) wX wY
joinEffects :: forall (p :: * -> * -> *) wX wY.
(Effect p, Invert (PrimOf p), Commute (PrimOf p),
Eq2 (PrimOf p)) =>
p wX wY -> FL (PrimOf p) wX wY
joinEffects = forall wA wB. FL (PrimOf p) wA wB -> FL (PrimOf p) wA wB
joinInverses forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect
where joinInverses :: FL (PrimOf p) wA wB -> FL (PrimOf p) wA wB
joinInverses :: forall wA wB. FL (PrimOf p) wA wB -> FL (PrimOf p) wA wB
joinInverses FL (PrimOf p) wA wB
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
joinInverses (PrimOf p wA wY
p :>: FL (PrimOf p) wY wB
ps) =
let ps' :: FL (PrimOf p) wY wB
ps' = forall wA wB. FL (PrimOf p) wA wB -> FL (PrimOf p) wA wB
joinInverses FL (PrimOf p) wY wB
ps in
forall a. a -> Maybe a -> a
fromMaybe (PrimOf p wA wY
p forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: FL (PrimOf p) wY wB
ps') forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY wZ.
(Eq2 p, Commute p) =>
p wX wY -> FL p wX wZ -> Maybe (FL p wY wZ)
removeFL (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert PrimOf p wA wY
p) FL (PrimOf p) wY wB
ps'
assertConsistent :: PrimPatch prim => RepoPatchV2 prim wX wY
-> RepoPatchV2 prim wX wY
assertConsistent :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wX wY
x = forall b a. b -> (a -> b) -> Maybe a -> b
maybe RepoPatchV2 prim wX wY
x (forall a. HasCallStack => String -> a
error forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> String
renderString) forall a b. (a -> b) -> a -> b
$ do
Doc
e <- forall (prim :: * -> * -> *) wS wY.
PrimPatch prim =>
RepoPatchV2 prim wS wY -> Maybe Doc
isConsistent RepoPatchV2 prim wX wY
x
forall a. a -> Maybe a
Just (String -> Doc
redText String
"Inconsistent patch:" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch RepoPatchV2 prim wX wY
x Doc -> Doc -> Doc
$$ Doc
e)
mergeAfterConflicting :: PrimPatch prim => FL (RepoPatchV2 prim) wX wX
-> FL prim wX wY -> Maybe ( FL (RepoPatchV2 prim) wX wX
, FL (RepoPatchV2 prim) wX wY)
mergeAfterConflicting :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
FL (RepoPatchV2 prim) wX wX
-> FL prim wX wY
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wY)
mergeAfterConflicting FL (RepoPatchV2 prim) wX wX
xxx FL prim wX wY
yyy = forall (prim :: * -> * -> *) wX wY wZ wA.
PrimPatch prim =>
RL (RepoPatchV2 prim) wX wY
-> FL prim wY wZ
-> FL (RepoPatchV2 prim) wZ wA
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
mac (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wX wX
xxx) FL prim wX wY
yyy forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
where
mac :: PrimPatch prim
=> RL (RepoPatchV2 prim) wX wY -> FL prim wY wZ
-> FL (RepoPatchV2 prim) wZ wA
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
mac :: forall (prim :: * -> * -> *) wX wY wZ wA.
PrimPatch prim =>
RL (RepoPatchV2 prim) wX wY
-> FL prim wY wZ
-> FL (RepoPatchV2 prim) wZ wA
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
mac RL (RepoPatchV2 prim) wX wY
NilRL FL prim wY wZ
xs FL (RepoPatchV2 prim) wZ wA
goneby = case forall (p :: * -> * -> *) wX wY.
(Effect p, Invert (PrimOf p), Commute (PrimOf p),
Eq2 (PrimOf p)) =>
p wX wY -> FL (PrimOf p) wX wY
joinEffects FL (RepoPatchV2 prim) wZ wA
goneby of
FL (PrimOf (FL (RepoPatchV2 prim))) wZ wA
NilFL -> forall a. a -> Maybe a
Just (forall (a :: * -> * -> *) wX. FL a wX wX
NilFL, 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 (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal FL prim wY wZ
xs)
FL (PrimOf (FL (RepoPatchV2 prim))) wZ wA
_ -> forall a. Maybe a
Nothing
mac (RL (RepoPatchV2 prim) wX wY
ps :<: RepoPatchV2 prim wY wY
p) FL prim wY wZ
xs FL (RepoPatchV2 prim) wZ wA
goneby =
case forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Maybe ((:>) (FL p) p wX wY)
commuteFL (RepoPatchV2 prim wY wY
p forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> 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 (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal FL prim wY wZ
xs) of
Maybe ((:>) (FL (RepoPatchV2 prim)) (RepoPatchV2 prim) wY wZ)
Nothing ->
case forall (p :: * -> * -> *) (q :: * -> * -> *) wX wY.
Commute p =>
(forall wA wB. (:>) p q wA wB -> Maybe ((:>) q p wA wB))
-> (:>) (RL p) q wX wY -> (:>) (RL p) (q :> RL p) wX wY
genCommuteWhatWeCanRL forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commuteNoConflicts (RL (RepoPatchV2 prim) wX wY
ps forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wY wY
p) of
RL (RepoPatchV2 prim) wX wZ
a :> RepoPatchV2 prim wZ wZ
p' :> RL (RepoPatchV2 prim) wZ wY
b ->
do (FL (RepoPatchV2 prim) wZ wZ
b', FL (RepoPatchV2 prim) wZ wA
xs') <- forall (prim :: * -> * -> *) wX wY wZ wA.
PrimPatch prim =>
RL (RepoPatchV2 prim) wX wY
-> FL prim wY wZ
-> FL (RepoPatchV2 prim) wZ wA
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
mac RL (RepoPatchV2 prim) wZ wY
b FL prim wY wZ
xs FL (RepoPatchV2 prim) wZ wA
goneby
let pa :: FL (PrimOf (RL (RepoPatchV2 prim))) wX wZ
pa = forall (p :: * -> * -> *) wX wY.
(Effect p, Invert (PrimOf p), Commute (PrimOf p),
Eq2 (PrimOf p)) =>
p wX wY -> FL (PrimOf p) wX wY
joinEffects forall a b. (a -> b) -> a -> b
$ RL (RepoPatchV2 prim) wX wZ
a forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: RepoPatchV2 prim wZ wZ
p'
FL prim wX wZ
NilFL <- forall (m :: * -> *) a. Monad m => a -> m a
return FL prim wX wZ
pa
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL (RepoPatchV2 prim) wX wZ
a forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: RepoPatchV2 prim wZ wZ
p') forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wZ wZ
b', FL (RepoPatchV2 prim) wZ wA
xs')
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus`
do FL (RepoPatchV2 prim) wZ wA
NilFL <- forall (m :: * -> *) a. Monad m => a -> m a
return FL (RepoPatchV2 prim) wZ wA
goneby
FL prim wX wY
NilFL <- forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY.
(Effect p, Invert (PrimOf p), Commute (PrimOf p),
Eq2 (PrimOf p)) =>
p wX wY -> FL (PrimOf p) wX wY
joinEffects (RL (RepoPatchV2 prim) wX wY
ps forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: RepoPatchV2 prim wY wY
p)
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL (RepoPatchV2 prim) wX wY
ps forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: RepoPatchV2 prim wY wY
p), 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 (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal FL prim wY wZ
xs)
Just (FL (RepoPatchV2 prim) wY wZ
l :> RepoPatchV2 prim wZ wZ
p'') ->
case forall (prim :: * -> * -> *) wX wY.
FL (RepoPatchV2 prim) wX wY -> Maybe (FL prim wX wY)
allNormal FL (RepoPatchV2 prim) wY wZ
l of
Just FL prim wY wZ
xs'' -> forall (prim :: * -> * -> *) wX wY wZ wA.
PrimPatch prim =>
RL (RepoPatchV2 prim) wX wY
-> FL prim wY wZ
-> FL (RepoPatchV2 prim) wZ wA
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
mac RL (RepoPatchV2 prim) wX wY
ps FL prim wY wZ
xs'' (RepoPatchV2 prim wZ wZ
p'' forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wZ wA
goneby)
Maybe (FL prim wY wZ)
Nothing ->
case forall (p :: * -> * -> *) (q :: * -> * -> *) wX wY.
Commute p =>
(forall wA wB. (:>) p q wA wB -> Maybe ((:>) q p wA wB))
-> (:>) (RL p) q wX wY -> (:>) (RL p) (q :> RL p) wX wY
genCommuteWhatWeCanRL forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commuteNoConflicts (RL (RepoPatchV2 prim) wX wY
ps forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wY wY
p) of
RL (RepoPatchV2 prim) wX wZ
a :> RepoPatchV2 prim wZ wZ
p' :> RL (RepoPatchV2 prim) wZ wY
b ->
do (FL (RepoPatchV2 prim) wZ wZ
b', FL (RepoPatchV2 prim) wZ wA
xs') <- forall (prim :: * -> * -> *) wX wY wZ wA.
PrimPatch prim =>
RL (RepoPatchV2 prim) wX wY
-> FL prim wY wZ
-> FL (RepoPatchV2 prim) wZ wA
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
mac RL (RepoPatchV2 prim) wZ wY
b FL prim wY wZ
xs FL (RepoPatchV2 prim) wZ wA
goneby
let pa :: FL (PrimOf (RL (RepoPatchV2 prim))) wX wZ
pa = forall (p :: * -> * -> *) wX wY.
(Effect p, Invert (PrimOf p), Commute (PrimOf p),
Eq2 (PrimOf p)) =>
p wX wY -> FL (PrimOf p) wX wY
joinEffects forall a b. (a -> b) -> a -> b
$ RL (RepoPatchV2 prim) wX wZ
a forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: RepoPatchV2 prim wZ wZ
p'
FL prim wX wZ
NilFL <- forall (m :: * -> *) a. Monad m => a -> m a
return FL prim wX wZ
pa
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL (RepoPatchV2 prim) wX wZ
a forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: RepoPatchV2 prim wZ wZ
p') forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wZ wZ
b', FL (RepoPatchV2 prim) wZ wA
xs')
geteff :: PrimPatch prim => [Non (RepoPatchV2 prim) wX] -> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
geteff :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
geteff [Non (RepoPatchV2 prim) wX]
_ FL prim wX wY
NilFL = ([], forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
geteff [Non (RepoPatchV2 prim) wX]
ix (prim wX wY
x :>: FL prim wY wY
xs) | Just [Non (RepoPatchV2 prim) wY]
ix' <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (p :: * -> * -> *) wX wY.
(Commute p, Invert p, Eq2 p, ToFromPrim p) =>
p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtx (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
x)) [Non (RepoPatchV2 prim) wX]
ix =
case forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
geteff [Non (RepoPatchV2 prim) wY]
ix' FL prim wY wY
xs of
([Non (RepoPatchV2 prim) wY]
ns, FL (RepoPatchV2 prim) wY wY
xs') -> ( forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
x) forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
x)) [Non (RepoPatchV2 prim) wY]
ns
, forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
x forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wY wY
xs')
geteff [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx =
case forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX] -> Maybe (FL (RepoPatchV2 prim) wX wX)
mergeConflictingNons [Non (RepoPatchV2 prim) wX]
ix of
Maybe (FL (RepoPatchV2 prim) wX wX)
Nothing -> forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ Doc -> String
renderString forall a b. (a -> b) -> a -> b
$
String -> Doc
redText String
"mergeConflictingNons failed in geteff: ix" Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX.
(PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons [Non (RepoPatchV2 prim) wX]
ix Doc -> Doc -> Doc
$$ String -> Doc
redText String
"xx" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch FL prim wX wY
xx
Just FL (RepoPatchV2 prim) wX wX
rix ->
case forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
FL (RepoPatchV2 prim) wX wX
-> FL prim wX wY
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wY)
mergeAfterConflicting FL (RepoPatchV2 prim) wX wX
rix FL prim wX wY
xx of
Just (FL (RepoPatchV2 prim) wX wX
a, FL (RepoPatchV2 prim) wX wY
x) ->
( forall a b. (a -> b) -> [a] -> [b]
map (forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, ToFromPrim p) =>
RL p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtxRL (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wX wX
a)) forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY.
(Commute p, PatchListFormat p, Nonable p,
ShowPatchBasic (PrimOf p), ShowPatchBasic p) =>
FL p wX wY -> [Non p wX]
toNons FL (RepoPatchV2 prim) wX wY
x
, FL (RepoPatchV2 prim) wX wX
a forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wX wY
x)
Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wY)
Nothing ->
forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ Doc -> String
renderString forall a b. (a -> b) -> a -> b
$
String -> Doc
redText String
"mergeAfterConflicting failed in geteff" Doc -> Doc -> Doc
$$
String -> Doc
redText String
"where ix" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX.
(PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons [Non (RepoPatchV2 prim) wX]
ix Doc -> Doc -> Doc
$$
String -> Doc
redText String
"and xx" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch FL prim wX wY
xx Doc -> Doc -> Doc
$$
String -> Doc
redText String
"and rix" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch FL (RepoPatchV2 prim) wX wX
rix
xx2nons :: PrimPatch prim => [Non (RepoPatchV2 prim) wX] -> FL prim wX wY
-> [Non (RepoPatchV2 prim) wX]
xx2nons :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx = forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
geteff [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx
xx2patches :: PrimPatch prim => [Non (RepoPatchV2 prim) wX] -> FL prim wX wY
-> FL (RepoPatchV2 prim) wX wY
xx2patches :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> FL (RepoPatchV2 prim) wX wY
xx2patches [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx = forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
geteff [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx
allNormal :: FL (RepoPatchV2 prim) wX wY -> Maybe (FL prim wX wY)
allNormal :: forall (prim :: * -> * -> *) wX wY.
FL (RepoPatchV2 prim) wX wY -> Maybe (FL prim wX wY)
allNormal (Normal prim wX wY
x :>: FL (RepoPatchV2 prim) wY wY
xs) = (prim wX wY
x forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: ) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` forall (prim :: * -> * -> *) wX wY.
FL (RepoPatchV2 prim) wX wY -> Maybe (FL prim wX wY)
allNormal FL (RepoPatchV2 prim) wY wY
xs
allNormal FL (RepoPatchV2 prim) wX wY
NilFL = forall a. a -> Maybe a
Just forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
allNormal FL (RepoPatchV2 prim) wX wY
_ = forall a. Maybe a
Nothing
isConsistent :: PrimPatch prim => RepoPatchV2 prim wX wY -> Maybe Doc
isConsistent :: forall (prim :: * -> * -> *) wS wY.
PrimPatch prim =>
RepoPatchV2 prim wS wY -> Maybe Doc
isConsistent (Normal prim wX wY
_) = forall a. Maybe a
Nothing
isConsistent (Duplicate Non (RepoPatchV2 prim) wX
_) = forall a. Maybe a
Nothing
isConsistent (Etacilpud Non (RepoPatchV2 prim) wX
_) = forall a. Maybe a
Nothing
isConsistent c :: RepoPatchV2 prim wX wY
c@(InvConflictor{}) = forall (prim :: * -> * -> *) wS wY.
PrimPatch prim =>
RepoPatchV2 prim wS wY -> Maybe Doc
isConsistent (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wX wY
c)
isConsistent (Conflictor [Non (RepoPatchV2 prim) wY]
im FL prim wY wX
mm m :: Non (RepoPatchV2 prim) wY
m@(Non FL (RepoPatchV2 prim) wY wY
deps PrimOf (RepoPatchV2 prim) wY wZ
_))
| Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX] -> Bool
everyoneConflicts [Non (RepoPatchV2 prim) wY]
im =
forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"Someone doesn't conflict in im in isConsistent"
| Just Non (RepoPatchV2 prim) wX
_ <- forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, Eq2 p, ToFromPrim p) =>
FL p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtxFL FL (RepoPatchV2 prim) wY wX
rmm Non (RepoPatchV2 prim) wY
m, prim wY wY
_ :>: FL prim wY wX
_ <- FL prim wY wX
mm =
forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"m doesn't conflict with mm in isConsistent"
| forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\Non (RepoPatchV2 prim) wY
x -> forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Non (RepoPatchV2 prim) wY
x forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
`conflictsWith`) [Non (RepoPatchV2 prim) wY]
nmm) [Non (RepoPatchV2 prim) wY]
im =
forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"mm conflicts with im in isConsistent where nmm is" Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX.
(PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons [Non (RepoPatchV2 prim) wY]
nmm
| Maybe [Non (RepoPatchV2 prim) wY]
Nothing <- ([Non (RepoPatchV2 prim) wY]
nmm forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
im) forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` forall (p :: * -> * -> *) wX wY.
(Commute p, PatchListFormat p, Nonable p,
ShowPatchBasic (PrimOf p), ShowPatchBasic p) =>
FL p wX wY -> [Non p wX]
toNons FL (RepoPatchV2 prim) wY wY
deps =
forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"dependencies not in conflict:" Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX.
(PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons (forall (p :: * -> * -> *) wX wY.
(Commute p, PatchListFormat p, Nonable p,
ShowPatchBasic (PrimOf p), ShowPatchBasic p) =>
FL p wX wY -> [Non p wX]
toNons FL (RepoPatchV2 prim) wY wY
deps) Doc -> Doc -> Doc
$$
String -> Doc
redText String
"compared with deps itself:" Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch FL (RepoPatchV2 prim) wY wY
deps
| Bool
otherwise =
case forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
allConflictsWith Non (RepoPatchV2 prim) wY
m [Non (RepoPatchV2 prim) wY]
im of
([Non (RepoPatchV2 prim) wY]
im1, []) | [Non (RepoPatchV2 prim) wY]
im1 forall a. Eq a => [a] -> [a] -> Bool
`eqSet` [Non (RepoPatchV2 prim) wY]
im -> forall a. Maybe a
Nothing
([Non (RepoPatchV2 prim) wY]
_, [Non (RepoPatchV2 prim) wY]
imnc) -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String -> Doc
redText (String
"m doesn't conflict with im in "
forall a. [a] -> [a] -> [a]
++ String
"isConsistent. unconflicting:") Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX.
(PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons [Non (RepoPatchV2 prim) wY]
imnc
where ([Non (RepoPatchV2 prim) wY]
nmm, FL (RepoPatchV2 prim) wY wX
rmm) = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
geteff [Non (RepoPatchV2 prim) wY]
im FL prim wY wX
mm
everyoneConflicts :: PrimPatch prim => [Non (RepoPatchV2 prim) wX] -> Bool
everyoneConflicts :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX] -> Bool
everyoneConflicts [] = Bool
True
everyoneConflicts (Non (RepoPatchV2 prim) wX
x : [Non (RepoPatchV2 prim) wX]
xs) = case forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
allConflictsWith Non (RepoPatchV2 prim) wX
x [Non (RepoPatchV2 prim) wX]
xs of
([], [Non (RepoPatchV2 prim) wX]
_) -> Bool
False
([Non (RepoPatchV2 prim) wX]
_, [Non (RepoPatchV2 prim) wX]
xs') -> forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX] -> Bool
everyoneConflicts [Non (RepoPatchV2 prim) wX]
xs'
instance PatchDebug prim => PatchDebug (RepoPatchV2 prim)
mergeWith :: PrimPatch prim => Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> Sealed (FL prim wX)
mergeWith :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> Sealed (FL prim wX)
mergeWith Non (RepoPatchV2 prim) wX
p [] = forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
`mapSeal` forall (p :: * -> * -> *) wX.
FromPrim p =>
Non p wX -> Sealed (FL p wX)
unNon Non (RepoPatchV2 prim) wX
p
mergeWith Non (RepoPatchV2 prim) wX
p [Non (RepoPatchV2 prim) wX]
xs =
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX)
mergeall forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (p :: * -> * -> *) wX.
FromPrim p =>
Non p wX -> Sealed (FL p wX)
unNon forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Non (RepoPatchV2 prim) wX
p forall a. a -> [a] -> [a]
:) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {prim :: * -> * -> *} {wX}.
(CleanMerge prim, Commute prim, Invert prim, Eq2 prim, IsHunk prim,
PatchInspect prim, RepairToFL prim, Show2 prim, PrimConstruct prim,
PrimCanonize prim, PrimClassify prim, PrimDetails prim,
PrimApply prim, PrimSift prim, PrimMangleUnravelled prim,
ReadPatch prim, ShowPatch prim, ShowContextPatch prim,
PatchListFormat prim) =>
[Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
unconflicting_of forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
nonDependsOrConflictsP [Non (RepoPatchV2 prim) wX]
xs
where
nonDependsOrConflictsP :: [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
nonDependsOrConflictsP =
forall a. (a -> Bool) -> [a] -> [a]
filter (\Non (RepoPatchV2 prim) wX
x -> Bool -> Bool
not ((Non (RepoPatchV2 prim) wX
p forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
`dependsUpon` Non (RepoPatchV2 prim) wX
x) Bool -> Bool -> Bool
|| (Non (RepoPatchV2 prim) wX
p forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
`conflictsWith` Non (RepoPatchV2 prim) wX
x)))
mergeall :: PrimPatch prim => [Sealed (FL (RepoPatchV2 prim) wX)]
-> Sealed (FL prim wX)
mergeall :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX)
mergeall [Sealed FL (RepoPatchV2 prim) wX wX
x] = forall (a :: * -> *) wI. a wI -> Sealed a
Sealed forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL (RepoPatchV2 prim) wX wX
x
mergeall [] = forall (a :: * -> *) wI. a wI -> Sealed a
Sealed forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
mergeall (Sealed FL (RepoPatchV2 prim) wX wX
x : Sealed FL (RepoPatchV2 prim) wX wX
y : [Sealed (FL (RepoPatchV2 prim) wX)]
rest) =
case forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
merge (FL (RepoPatchV2 prim) wX wX
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: FL (RepoPatchV2 prim) wX wX
y) of
FL (RepoPatchV2 prim) wX wZ
y' :/\: FL (RepoPatchV2 prim) wX wZ
_ -> forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX)
mergeall (forall (a :: * -> *) wI. a wI -> Sealed a
Sealed (FL (RepoPatchV2 prim) wX wX
x forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wX wZ
y') forall a. a -> [a] -> [a]
: [Sealed (FL (RepoPatchV2 prim) wX)]
rest)
unconflicting_of :: [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
unconflicting_of [] = []
unconflicting_of (Non (RepoPatchV2 prim) wX
q : [Non (RepoPatchV2 prim) wX]
qs) = case forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
allConflictsWith Non (RepoPatchV2 prim) wX
q [Non (RepoPatchV2 prim) wX]
qs of
([], [Non (RepoPatchV2 prim) wX]
_) -> Non (RepoPatchV2 prim) wX
q forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wX]
qs
([Non (RepoPatchV2 prim) wX]
_, [Non (RepoPatchV2 prim) wX]
nc) -> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
unconflicting_of [Non (RepoPatchV2 prim) wX]
nc
instance Summary (RepoPatchV2 prim) where
conflictedEffect :: forall wX wY.
RepoPatchV2 prim wX wY
-> [IsConflictedPrim (PrimOf (RepoPatchV2 prim))]
conflictedEffect (Duplicate (Non FL (RepoPatchV2 prim) wX wY
_ PrimOf (RepoPatchV2 prim) wY wZ
x)) = [forall (prim :: * -> * -> *) wI wY.
ConflictState -> prim wI wY -> IsConflictedPrim prim
IsC ConflictState
Duplicated PrimOf (RepoPatchV2 prim) wY wZ
x]
conflictedEffect (Etacilpud Non (RepoPatchV2 prim) wX
_) = forall a. HasCallStack => String -> a
error String
"impossible case"
conflictedEffect (Conflictor [Non (RepoPatchV2 prim) wY]
_ FL prim wY wX
_ (Non FL (RepoPatchV2 prim) wY wY
_ PrimOf (RepoPatchV2 prim) wY wZ
x)) = [forall (prim :: * -> * -> *) wI wY.
ConflictState -> prim wI wY -> IsConflictedPrim prim
IsC ConflictState
Conflicted PrimOf (RepoPatchV2 prim) wY wZ
x]
conflictedEffect (InvConflictor{}) = forall a. HasCallStack => String -> a
error String
"impossible case"
conflictedEffect (Normal prim wX wY
x) = [forall (prim :: * -> * -> *) wI wY.
ConflictState -> prim wI wY -> IsConflictedPrim prim
IsC ConflictState
Okay prim wX wY
x]
instance PrimPatch prim => Conflict (RepoPatchV2 prim) where
resolveConflicts :: forall wO wX wY.
RL (RepoPatchV2 prim) wO wX
-> RL (RepoPatchV2 prim) wX wY
-> [ConflictDetails (PrimOf (RepoPatchV2 prim)) wY]
resolveConflicts RL (RepoPatchV2 prim) wO wX
_ = forall a b. (a -> b) -> [a] -> [b]
map forall (prim :: * -> * -> *) wX.
PrimMangleUnravelled prim =>
Unravelled prim wX -> ConflictDetails prim wX
mangleOrFail forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(forall wA wB. p wA wB -> [Unravelled (PrimOf p) wB])
-> RL p wX wY -> [Unravelled (PrimOf p) wY]
combineConflicts forall wX wY. RepoPatchV2 prim wX wY -> [[Sealed (FL prim wY)]]
resolveOne
where
resolveOne :: RepoPatchV2 prim wX wY -> [[Sealed (FL prim wY)]]
resolveOne :: forall wX wY. RepoPatchV2 prim wX wY -> [[Sealed (FL prim wY)]]
resolveOne (Conflictor [Non (RepoPatchV2 prim) wY]
ix FL prim wY wX
xx Non (RepoPatchV2 prim) wY
x) = [[Sealed (FL prim wY)]
unravelled]
where
unravelled :: [Sealed (FL prim wY)]
unravelled = forall a. Eq a => [a] -> [a]
nub forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter forall (prim :: * -> * -> *) wX. Sealed (FL prim wX) -> Bool
isCons forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> Sealed (FL prim wX)
`mergeWith` [Non (RepoPatchV2 prim) wY]
xIxNonXX) [Non (RepoPatchV2 prim) wY]
xIxNonXX
xIxNonXX :: [Non (RepoPatchV2 prim) wY]
xIxNonXX = Non (RepoPatchV2 prim) wY
x forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
ix forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
nonxx
nonxx :: [Non (RepoPatchV2 prim) wY]
nonxx = forall wX wY.
RL (RepoPatchV2 prim) wX wY -> [Non (RepoPatchV2 prim) wX]
nonxx_ (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> FL (RepoPatchV2 prim) wX wY
xx2patches [Non (RepoPatchV2 prim) wY]
ix FL prim wY wX
xx)
resolveOne RepoPatchV2 prim wX wY
_ = []
nonxx_ :: RL (RepoPatchV2 prim) wX wY -> [Non (RepoPatchV2 prim) wX]
nonxx_ :: forall wX wY.
RL (RepoPatchV2 prim) wX wY -> [Non (RepoPatchV2 prim) wX]
nonxx_ (RL (RepoPatchV2 prim) wX wY
qs :<: Normal prim wY wY
q) = [forall (p :: * -> * -> *) wX wI wY.
FL p wX wI -> PrimOf p wI wY -> Non p wX
Non (forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL (RepoPatchV2 prim) wX wY
qs) prim wY wY
q]
nonxx_ RL (RepoPatchV2 prim) wX wY
_ = []
isCons :: Sealed (FL a wX) -> Bool
isCons = forall (a :: * -> *) b. (forall wX. a wX -> b) -> Sealed a -> b
unseal (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Bool
nullFL)
instance PrimPatch prim => Unwind (RepoPatchV2 prim) where
fullUnwind :: forall wX wY.
RepoPatchV2 prim wX wY -> Unwound (PrimOf (RepoPatchV2 prim)) wX wY
fullUnwind (Normal prim wX wY
p) =
forall (prim :: * -> * -> *) wA wB wC wD.
(Commute prim, Invert prim, Eq2 prim) =>
FL prim wA wB
-> FL prim wB wC -> FL prim wC wD -> Unwound prim wA wD
mkUnwound forall (a :: * -> * -> *) wX. FL a wX wX
NilFL (prim wX wY
p forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
fullUnwind (Duplicate (Non FL (RepoPatchV2 prim) wX wY
ps PrimOf (RepoPatchV2 prim) wY wZ
p)) =
forall (prim :: * -> * -> *) wA wB wC wD.
(Commute prim, Invert prim, Eq2 prim) =>
FL prim wA wB
-> FL prim wB wC -> FL prim wC wD -> Unwound prim wA wD
mkUnwound (forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL (RepoPatchV2 prim) wX wY
ps) (PrimOf (RepoPatchV2 prim) wY wZ
p forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert PrimOf (RepoPatchV2 prim) wY wZ
p forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL (RepoPatchV2 prim) wX wY
ps))
fullUnwind (Conflictor [Non (RepoPatchV2 prim) wY]
_ FL prim wY wX
es (Non FL (RepoPatchV2 prim) wY wY
ps PrimOf (RepoPatchV2 prim) wY wZ
p)) =
forall (prim :: * -> * -> *) wA wB wC wD.
(Commute prim, Invert prim, Eq2 prim) =>
FL prim wA wB
-> FL prim wB wC -> FL prim wC wD -> Unwound prim wA wD
mkUnwound (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wY wX
es forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL (RepoPatchV2 prim) wY wY
ps) (PrimOf (RepoPatchV2 prim) wY wZ
p forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert PrimOf (RepoPatchV2 prim) wY wZ
p forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL (RepoPatchV2 prim) wY wY
ps))
fullUnwind (Etacilpud Non (RepoPatchV2 prim) wX
non) =
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (forall (p :: * -> * -> *) wX wY.
Unwind p =>
p wX wY -> Unwound (PrimOf p) wX wY
fullUnwind (forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
non))
fullUnwind (InvConflictor [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx Non (RepoPatchV2 prim) wX
x) =
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (forall (p :: * -> * -> *) wX wY.
Unwind p =>
p wX wY -> Unwound (PrimOf p) wX wY
fullUnwind (forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx Non (RepoPatchV2 prim) wX
x))
instance PrimPatch prim => CommuteNoConflicts (RepoPatchV2 prim) where
commuteNoConflicts :: forall wX wY.
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
commuteNoConflicts (d1 :: RepoPatchV2 prim wX wZ
d1@(Duplicate Non (RepoPatchV2 prim) wX
_) :> d2 :: RepoPatchV2 prim wZ wY
d2@(Duplicate Non (RepoPatchV2 prim) wZ
_)) = forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
d2 forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
d1)
commuteNoConflicts (e :: RepoPatchV2 prim wX wZ
e@(Etacilpud Non (RepoPatchV2 prim) wX
_) :> d :: RepoPatchV2 prim wZ wY
d@(Duplicate Non (RepoPatchV2 prim) wZ
_)) = forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
d forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
e)
commuteNoConflicts (d :: RepoPatchV2 prim wX wZ
d@(Duplicate Non (RepoPatchV2 prim) wX
_) :> e :: RepoPatchV2 prim wZ wY
e@(Etacilpud Non (RepoPatchV2 prim) wZ
_)) = forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
e forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
d)
commuteNoConflicts (e1 :: RepoPatchV2 prim wX wZ
e1@(Etacilpud Non (RepoPatchV2 prim) wX
_) :> e2 :: RepoPatchV2 prim wZ wY
e2@(Etacilpud Non (RepoPatchV2 prim) wZ
_)) = forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
e2 forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
e1)
commuteNoConflicts orig :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
orig@(RepoPatchV2 prim wX wZ
x :> Duplicate Non (RepoPatchV2 prim) wZ
d) =
if Non (RepoPatchV2 prim) wZ
d forall a. Eq a => a -> a -> Bool
== forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wX wZ
x) (forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non RepoPatchV2 prim wX wZ
x)
then forall a. a -> Maybe a
Just (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
orig
else do Non (RepoPatchV2 prim) wX
d' <- forall (p :: * -> * -> *) wX wY.
(Commute p, Invert p, Eq2 p, ToFromPrim p) =>
p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtx (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wX wZ
x) Non (RepoPatchV2 prim) wZ
d
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
d' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
x)
commuteNoConflicts (Duplicate Non (RepoPatchV2 prim) wX
d :> RepoPatchV2 prim wZ wY
x) =
forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate (forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wZ wY
x) Non (RepoPatchV2 prim) wX
d))
commuteNoConflicts c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(Etacilpud Non (RepoPatchV2 prim) wX
_ :> RepoPatchV2 prim wZ wY
_) = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteNC (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commuteNoConflicts c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(RepoPatchV2 prim wX wZ
_ :> Etacilpud Non (RepoPatchV2 prim) wZ
_) = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteNC (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commuteNoConflicts (Normal prim wX wZ
x :> Normal prim wZ wY
y) = do
prim wX wZ
y' :> prim wZ wY
x' <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (prim wX wZ
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> prim wZ wY
y)
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wZ
y' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wZ wY
x')
commuteNoConflicts (Normal prim wX wZ
x :> Conflictor [Non (RepoPatchV2 prim) wY]
iy FL prim wY wZ
yy Non (RepoPatchV2 prim) wY
y) = do
FL prim wX wZ
iyy' :> prim wZ wY
x' <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Maybe ((:>) (FL p) p wX wY)
commuteFL (prim wX wZ
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wY wZ
yy)
Non (RepoPatchV2 prim) wZ
y' : [Non (RepoPatchV2 prim) wZ]
iy' <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wZ wY
x' forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Maybe (Non p wX)
>*) (Non (RepoPatchV2 prim) wY
y forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
iy)
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wZ]
iy' (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wX wZ
iyy') Non (RepoPatchV2 prim) wZ
y' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wZ wY
x')
commuteNoConflicts c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(InvConflictor{} :> Normal prim wZ wY
_) = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteNC (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commuteNoConflicts (Conflictor [Non (RepoPatchV2 prim) wZ]
iy FL prim wZ wX
yy Non (RepoPatchV2 prim) wZ
y :> Normal prim wZ wY
x) = do
Non (RepoPatchV2 prim) wY
y' : [Non (RepoPatchV2 prim) wY]
iy' <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (p :: * -> * -> *) wX wY.
(Commute p, Invert p, ToFromPrim p) =>
Non p wX -> p wX wY -> Maybe (Non p wY)
*> forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wZ wY
x) (Non (RepoPatchV2 prim) wZ
y forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wZ]
iy)
prim wX wZ
x' :> RL prim wZ wY
iyy' <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) (RL p) p wX wY -> Maybe ((:>) p (RL p) wX wY)
commuteRL (forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL prim wZ wX
yy forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> prim wZ wY
x)
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wZ
x' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wY]
iy' (forall (p :: * -> * -> *) wX wY.
Invert p =>
RL p wX wY -> FL p wY wX
invertRL RL prim wZ wY
iyy') Non (RepoPatchV2 prim) wY
y')
commuteNoConflicts c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(Normal prim wX wZ
_ :> InvConflictor{}) = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteNC (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commuteNoConflicts (Conflictor [Non (RepoPatchV2 prim) wZ]
ix FL prim wZ wX
xx Non (RepoPatchV2 prim) wZ
x :> Conflictor [Non (RepoPatchV2 prim) wY]
iy FL prim wY wZ
yy Non (RepoPatchV2 prim) wY
y) = do
FL prim wY wZ
xx' :> FL prim wZ wX
yy' <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (FL prim wY wZ
yy forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wZ wX
xx)
Non (RepoPatchV2 prim) wY
x':[Non (RepoPatchV2 prim) wY]
ix' <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (FL prim wY wZ
yy forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Maybe (Non p wX)
>>*) (Non (RepoPatchV2 prim) wZ
xforall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
ix)
Non (RepoPatchV2 prim) wZ
y':[Non (RepoPatchV2 prim) wZ]
iy' <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p,
PrimPatchBase p) =>
Non p wX -> l (PrimOf p) wX wY -> Maybe (Non p wY)
*>> FL prim wY wZ
xx') (Non (RepoPatchV2 prim) wY
yforall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wY]
iy)
Bool
False <- forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith Non (RepoPatchV2 prim) wY
y) (Non (RepoPatchV2 prim) wY
x'forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wY]
ix')
Bool
False <- forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith Non (RepoPatchV2 prim) wY
x') [Non (RepoPatchV2 prim) wY]
iy
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wZ]
iy' FL prim wZ wX
yy' Non (RepoPatchV2 prim) wZ
y' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wY]
ix' FL prim wY wZ
xx' Non (RepoPatchV2 prim) wY
x')
commuteNoConflicts c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(InvConflictor{} :> InvConflictor{}) =
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteNC (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commuteNoConflicts (InvConflictor [Non (RepoPatchV2 prim) wX]
ix FL prim wX wZ
xx Non (RepoPatchV2 prim) wX
x :> Conflictor [Non (RepoPatchV2 prim) wY]
iy FL prim wY wZ
yy Non (RepoPatchV2 prim) wY
y) = do
FL prim wX wZ
iyy' :> FL prim wZ wY
xx' <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (FL prim wX wZ
xx forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wY wZ
yy)
Non (RepoPatchV2 prim) wZ
y':[Non (RepoPatchV2 prim) wZ]
iy' <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (FL prim wZ wY
xx' forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Maybe (Non p wX)
>>*) (Non (RepoPatchV2 prim) wY
yforall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wY]
iy)
Non (RepoPatchV2 prim) wZ
x':[Non (RepoPatchV2 prim) wZ]
ix' <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL prim wX wZ
iyy' forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Maybe (Non p wX)
>>*) (Non (RepoPatchV2 prim) wX
xforall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wX]
ix)
Bool
False <- forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith Non (RepoPatchV2 prim) wZ
y') (Non (RepoPatchV2 prim) wZ
x'forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
ix')
Bool
False <- forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith Non (RepoPatchV2 prim) wZ
x') [Non (RepoPatchV2 prim) wZ]
iy'
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wZ]
iy' (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wX wZ
iyy') Non (RepoPatchV2 prim) wZ
y' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wX wY
InvConflictor [Non (RepoPatchV2 prim) wZ]
ix' FL prim wZ wY
xx' Non (RepoPatchV2 prim) wZ
x')
commuteNoConflicts (Conflictor [Non (RepoPatchV2 prim) wZ]
iy' FL prim wZ wX
yy' Non (RepoPatchV2 prim) wZ
y' :> InvConflictor [Non (RepoPatchV2 prim) wZ]
ix' FL prim wZ wY
xx' Non (RepoPatchV2 prim) wZ
x') = do
FL prim wX wZ
xx :> FL prim wZ wY
iyy <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wZ wX
yy' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wZ wY
xx')
Non (RepoPatchV2 prim) wY
y:[Non (RepoPatchV2 prim) wY]
iy <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p,
PrimPatchBase p) =>
Non p wX -> l (PrimOf p) wX wY -> Maybe (Non p wY)
*>> FL prim wZ wY
xx') (Non (RepoPatchV2 prim) wZ
y'forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
iy')
Non (RepoPatchV2 prim) wX
x:[Non (RepoPatchV2 prim) wX]
ix <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p,
PrimPatchBase p) =>
Non p wX -> l (PrimOf p) wX wY -> Maybe (Non p wY)
*>> FL prim wZ wX
yy') (Non (RepoPatchV2 prim) wZ
x'forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
ix')
Bool
False <- forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith Non (RepoPatchV2 prim) wZ
y') (Non (RepoPatchV2 prim) wZ
x'forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
ix')
Bool
False <- forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith Non (RepoPatchV2 prim) wZ
x') [Non (RepoPatchV2 prim) wZ]
iy'
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wX wY
InvConflictor [Non (RepoPatchV2 prim) wX]
ix FL prim wX wZ
xx Non (RepoPatchV2 prim) wX
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wY]
iy (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wZ wY
iyy) Non (RepoPatchV2 prim) wY
y)
instance PrimPatch prim => Check (RepoPatchV2 prim) where
isInconsistent :: forall wX wY. RepoPatchV2 prim wX wY -> Maybe Doc
isInconsistent = forall (prim :: * -> * -> *) wS wY.
PrimPatch prim =>
RepoPatchV2 prim wS wY -> Maybe Doc
isConsistent
type instance PatchId (RepoPatchV2 prim) = ()
instance FromPrim (RepoPatchV2 prim) where
fromAnonymousPrim :: forall wX wY.
PrimOf (RepoPatchV2 prim) wX wY -> RepoPatchV2 prim wX wY
fromAnonymousPrim = forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal
instance ToPrim (RepoPatchV2 prim) where
toPrim :: forall wX wY.
RepoPatchV2 prim wX wY -> Maybe (PrimOf (RepoPatchV2 prim) wX wY)
toPrim (Normal prim wX wY
p) = forall a. a -> Maybe a
Just prim wX wY
p
toPrim RepoPatchV2 prim wX wY
_ = forall a. Maybe a
Nothing
instance PrimPatch prim => Eq2 (RepoPatchV2 prim) where
(Duplicate Non (RepoPatchV2 prim) wA
x) =\/= :: forall wA wB wC.
RepoPatchV2 prim wA wB -> RepoPatchV2 prim wA wC -> EqCheck wB wC
=\/= (Duplicate Non (RepoPatchV2 prim) wA
y) | Non (RepoPatchV2 prim) wA
x forall a. Eq a => a -> a -> Bool
== Non (RepoPatchV2 prim) wA
y = forall wA. EqCheck wA wA
IsEq
(Etacilpud Non (RepoPatchV2 prim) wA
x) =\/= (Etacilpud Non (RepoPatchV2 prim) wA
y) | Non (RepoPatchV2 prim) wA
x forall a. Eq a => a -> a -> Bool
== Non (RepoPatchV2 prim) wA
y = forall wA. EqCheck wA wA
IsEq
(Normal prim wA wB
x) =\/= (Normal prim wA wC
y) = prim wA wB
x forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= prim wA wC
y
(Conflictor [Non (RepoPatchV2 prim) wB]
cx FL prim wB wA
xx Non (RepoPatchV2 prim) wB
x) =\/= (Conflictor [Non (RepoPatchV2 prim) wC]
cy FL prim wC wA
yy Non (RepoPatchV2 prim) wC
y)
| forall a b. (a -> b) -> [a] -> [b]
map Non (RepoPatchV2 prim) wB -> Non (RepoPatchV2 prim) wA
commuteOrAddIXX [Non (RepoPatchV2 prim) wB]
cx forall a. Eq a => [a] -> [a] -> Bool
`eqSet` forall a b. (a -> b) -> [a] -> [b]
map Non (RepoPatchV2 prim) wC -> Non (RepoPatchV2 prim) wA
commuteOrAddIYY [Non (RepoPatchV2 prim) wC]
cy
Bool -> Bool -> Bool
&& Non (RepoPatchV2 prim) wB -> Non (RepoPatchV2 prim) wA
commuteOrAddIXX Non (RepoPatchV2 prim) wB
x forall a. Eq a => a -> a -> Bool
== Non (RepoPatchV2 prim) wC -> Non (RepoPatchV2 prim) wA
commuteOrAddIYY Non (RepoPatchV2 prim) wC
y = FL prim wB wA
xx forall (p :: * -> * -> *) wA wC wB.
Eq2 p =>
p wA wC -> p wB wC -> EqCheck wA wB
=/\= FL prim wC wA
yy
where
commuteOrAddIXX :: Non (RepoPatchV2 prim) wB -> Non (RepoPatchV2 prim) wA
commuteOrAddIXX = forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Non p wX
commutePrimsOrAddToCtx (forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL prim wB wA
xx)
commuteOrAddIYY :: Non (RepoPatchV2 prim) wC -> Non (RepoPatchV2 prim) wA
commuteOrAddIYY = forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Non p wX
commutePrimsOrAddToCtx (forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL prim wC wA
yy)
(InvConflictor [Non (RepoPatchV2 prim) wA]
cx FL prim wA wB
xx Non (RepoPatchV2 prim) wA
x) =\/= (InvConflictor [Non (RepoPatchV2 prim) wA]
cy FL prim wA wC
yy Non (RepoPatchV2 prim) wA
y)
| [Non (RepoPatchV2 prim) wA]
cx forall a. Eq a => [a] -> [a] -> Bool
`eqSet` [Non (RepoPatchV2 prim) wA]
cy Bool -> Bool -> Bool
&& Non (RepoPatchV2 prim) wA
x forall a. Eq a => a -> a -> Bool
== Non (RepoPatchV2 prim) wA
y = FL prim wA wB
xx forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= FL prim wA wC
yy
RepoPatchV2 prim wA wB
_ =\/= RepoPatchV2 prim wA wC
_ = forall wA wB. EqCheck wA wB
NotEq
eqSet :: Eq a => [a] -> [a] -> Bool
eqSet :: forall a. Eq a => [a] -> [a] -> Bool
eqSet [] [] = Bool
True
eqSet (a
x:[a]
xs) [a]
xys | Just [a]
ys <- forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
x [a]
xys = forall a. Eq a => [a] -> [a] -> Bool
eqSet [a]
xs [a]
ys
eqSet [a]
_ [a]
_ = Bool
False
remove1 :: Eq a => a -> [a] -> Maybe [a]
remove1 :: forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
x (a
y : [a]
ys) = if a
x forall a. Eq a => a -> a -> Bool
== a
y then forall a. a -> Maybe a
Just [a]
ys else (a
y forall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
x [a]
ys
remove1 a
_ [] = forall a. Maybe a
Nothing
minus :: Eq a => [a] -> [a] -> Maybe [a]
minus :: forall a. Eq a => [a] -> [a] -> Maybe [a]
minus [a]
xs [] = forall a. a -> Maybe a
Just [a]
xs
minus [a]
xs (a
y:[a]
ys) = do [a]
xs' <- forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
y [a]
xs
[a]
xs' forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` [a]
ys
invertNon :: PrimPatch prim => Non (RepoPatchV2 prim) wX
-> Non (RepoPatchV2 prim) wX
invertNon :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX
invertNon (Non FL (RepoPatchV2 prim) wX wY
c PrimOf (RepoPatchV2 prim) wY wZ
x)
| Just RL (RepoPatchV2 prim) wX wZ
rc' <- forall (p :: * -> * -> *) wY wZ wX.
(Eq2 p, Commute p) =>
p wY wZ -> RL p wX wZ -> Maybe (RL p wX wY)
removeRL RepoPatchV2 prim wZ wY
nix (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wX wY
c) = forall (p :: * -> * -> *) wX wI wY.
FL p wX wI -> PrimOf p wI wY -> Non p wX
Non (forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL (RepoPatchV2 prim) wX wZ
rc') (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert PrimOf (RepoPatchV2 prim) wY wZ
x)
| Bool
otherwise = forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, ToFromPrim p) =>
RL p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtxRL (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wX wY
c forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal PrimOf (RepoPatchV2 prim) wY wZ
x) forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non RepoPatchV2 prim wZ wY
nix
where
nix :: RepoPatchV2 prim wZ wY
nix = forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert PrimOf (RepoPatchV2 prim) wY wZ
x
nonTouches :: PatchInspect prim => Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches :: forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches (Non FL (RepoPatchV2 prim) wX wY
c PrimOf (RepoPatchV2 prim) wY wZ
x) = forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [AnchoredPath]
listTouchedFiles (FL (RepoPatchV2 prim) wX wY
c forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal PrimOf (RepoPatchV2 prim) wY wZ
x forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
nonHunkMatches :: PatchInspect prim => (BC.ByteString -> Bool)
-> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches :: forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f (Non FL (RepoPatchV2 prim) wX wY
c PrimOf (RepoPatchV2 prim) wY wZ
x) = forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL (RepoPatchV2 prim) wX wY
c Bool -> Bool -> Bool
|| forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f PrimOf (RepoPatchV2 prim) wY wZ
x
toNons :: forall p wX wY . (Commute p, PatchListFormat p,
Nonable p, ShowPatchBasic (PrimOf p), ShowPatchBasic p)
=> FL p wX wY -> [Non p wX]
toNons :: forall (p :: * -> * -> *) wX wY.
(Commute p, PatchListFormat p, Nonable p,
ShowPatchBasic (PrimOf p), ShowPatchBasic p) =>
FL p wX wY -> [Non p wX]
toNons FL p wX wY
xs = forall a b. (a -> b) -> [a] -> [b]
map Sealed ((:>) p (FL p) wX) -> Non p wX
lastNon forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY.
FL p wX wY -> [Sealed ((:>) p (FL p) wX)]
initsFL FL p wX wY
xs
where lastNon :: Sealed ((p :> FL p) wX) -> Non p wX
lastNon :: Sealed ((:>) p (FL p) wX) -> Non p wX
lastNon (Sealed (:>) p (FL p) wX wX
xxx) =
case forall wZ. (:>) p (FL p) wX wZ -> (:>) (RL p) (p :> RL p) wX wZ
lastNon_aux (:>) p (FL p) wX wX
xxx of
RL p wX wZ
deps :> p wZ wZ
p :> RL p wZ wX
_ ->
case forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non p wZ wZ
p of
Non FL p wZ wY
NilFL PrimOf p wY wZ
pp -> forall (p :: * -> * -> *) wX wI wY.
FL p wX wI -> PrimOf p wI wY -> Non p wX
Non (forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL p wX wZ
deps) PrimOf p wY wZ
pp
Non FL p wZ wY
ds PrimOf p wY wZ
pp ->
forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ Doc -> String
renderString forall a b. (a -> b) -> a -> b
$
String -> Doc
redText String
"Weird case in toNons" Doc -> Doc -> Doc
$$
String -> Doc
redText String
"please report this bug!" Doc -> Doc -> Doc
$$
(case (:>) p (FL p) wX wX
xxx of
p wX wZ
z :> FL p wZ wX
zs -> forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch (p wX wZ
z forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: FL p wZ wX
zs)) Doc -> Doc -> Doc
$$
String -> Doc
redText String
"ds are" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch FL p wZ wY
ds Doc -> Doc -> Doc
$$
String -> Doc
redText String
"pp is" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch PrimOf p wY wZ
pp
reverseFoo :: (p :> FL p) wX wZ -> (RL p :> p) wX wZ
reverseFoo :: forall wZ. (:>) p (FL p) wX wZ -> (:>) (RL p) p wX wZ
reverseFoo (p wX wZ
p :> FL p wZ wZ
ps) = forall wA wB wC wD.
RL p wA wB -> p wB wC -> FL p wC wD -> (:>) (RL p) p wA wD
rf forall (a :: * -> * -> *) wX. RL a wX wX
NilRL p wX wZ
p FL p wZ wZ
ps
where
rf :: RL p wA wB -> p wB wC -> FL p wC wD
-> (RL p :> p) wA wD
rf :: forall wA wB wC wD.
RL p wA wB -> p wB wC -> FL p wC wD -> (:>) (RL p) p wA wD
rf RL p wA wB
rs p wB wC
l FL p wC wD
NilFL = RL p wA wB
rs forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> p wB wC
l
rf RL p wA wB
rs p wB wC
x (p wC wY
y :>: FL p wY wD
ys) = forall wA wB wC wD.
RL p wA wB -> p wB wC -> FL p wC wD -> (:>) (RL p) p wA wD
rf (RL p wA wB
rs forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: p wB wC
x) p wC wY
y FL p wY wD
ys
lastNon_aux :: (p :> FL p) wX wZ -> (RL p :> p :> RL p) wX wZ
lastNon_aux :: forall wZ. (:>) p (FL p) wX wZ -> (:>) (RL p) (p :> RL p) wX wZ
lastNon_aux = forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) (RL p) p wX wY -> (:>) (RL p) (p :> RL p) wX wY
commuteWhatWeCanRL forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall wZ. (:>) p (FL p) wX wZ -> (:>) (RL p) p wX wZ
reverseFoo
filterConflictsFL :: PrimPatch prim => Non (RepoPatchV2 prim) wX
-> FL prim wX wY -> (FL prim :> FL prim) wX wY
filterConflictsFL :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> FL prim wX wY -> (:>) (FL prim) (FL prim) wX wY
filterConflictsFL Non (RepoPatchV2 prim) wX
_ FL prim wX wY
NilFL = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
filterConflictsFL Non (RepoPatchV2 prim) wX
n (prim wX wY
p :>: FL prim wY wY
ps)
| Just Non (RepoPatchV2 prim) wY
n' <- forall (p :: * -> * -> *) wX wY.
(Commute p, Invert p, Eq2 p, ToFromPrim p) =>
p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtx (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
p) Non (RepoPatchV2 prim) wX
n =
case forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> FL prim wX wY -> (:>) (FL prim) (FL prim) wX wY
filterConflictsFL Non (RepoPatchV2 prim) wY
n' FL prim wY wY
ps of
FL prim wY wZ
p1 :> FL prim wZ wY
p2 -> prim wX wY
p forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: FL prim wY wZ
p1 forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wZ wY
p2
| Bool
otherwise = case forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> (:>) (FL p) (p :> FL p) wX wY
commuteWhatWeCanFL (prim wX wY
p forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wY wY
ps) of
FL prim wX wZ
p1 :> prim wZ wZ
p' :> FL prim wZ wY
p2 ->
case forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> FL prim wX wY -> (:>) (FL prim) (FL prim) wX wY
filterConflictsFL Non (RepoPatchV2 prim) wX
n FL prim wX wZ
p1 of
FL prim wX wZ
p1a :> FL prim wZ wZ
p1b -> FL prim wX wZ
p1a forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wZ wZ
p1b forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ prim wZ wZ
p' forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: FL prim wZ wY
p2
instance Invert prim => Invert (RepoPatchV2 prim) where
invert :: forall wX wY. RepoPatchV2 prim wX wY -> RepoPatchV2 prim wY wX
invert (Duplicate Non (RepoPatchV2 prim) wX
d) = forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Etacilpud Non (RepoPatchV2 prim) wX
d
invert (Etacilpud Non (RepoPatchV2 prim) wX
d) = forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
d
invert (Normal prim wX wY
p) = forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert prim wX wY
p)
invert (Conflictor [Non (RepoPatchV2 prim) wY]
x FL prim wY wX
c Non (RepoPatchV2 prim) wY
p) = forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wX wY
InvConflictor [Non (RepoPatchV2 prim) wY]
x FL prim wY wX
c Non (RepoPatchV2 prim) wY
p
invert (InvConflictor [Non (RepoPatchV2 prim) wX]
x FL prim wX wY
c Non (RepoPatchV2 prim) wX
p) = forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wX]
x FL prim wX wY
c Non (RepoPatchV2 prim) wX
p
commuteConflicting :: PrimPatch prim
=> CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
commuteConflicting :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
commuteConflicting (Normal prim wX wZ
x :> Conflictor [Non (RepoPatchV2 prim) wY]
a1'nop2 FL prim wY wZ
n1'x Non (RepoPatchV2 prim) wY
p1')
| Just RL prim wY wX
rn1' <- forall (p :: * -> * -> *) wY wZ wX.
(Eq2 p, Commute p) =>
p wY wZ -> RL p wX wZ -> Maybe (RL p wX wY)
removeRL prim wX wZ
x (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL prim wY wZ
n1'x) = do
let Non (RepoPatchV2 prim) wY
p2 : [Non (RepoPatchV2 prim) wY]
n1nons = forall a. [a] -> [a]
reverse forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wY]
a1'nop2 forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL prim wY wX
rn1' forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: prim wX wZ
x)
a2 :: [Non (RepoPatchV2 prim) wY]
a2 = Non (RepoPatchV2 prim) wY
p1' forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
a1'nop2 forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
n1nons
case ([Non (RepoPatchV2 prim) wY]
a1'nop2, forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL prim wY wX
rn1', Non (RepoPatchV2 prim) wY
p1') of
([], FL prim wY wX
NilFL, Non FL (RepoPatchV2 prim) wY wY
c PrimOf (RepoPatchV2 prim) wY wZ
y) | FL (PrimOf (FL (RepoPatchV2 prim))) wY wY
NilFL <- forall (p :: * -> * -> *) wX wY.
(Effect p, Invert (PrimOf p), Commute (PrimOf p),
Eq2 (PrimOf p)) =>
p wX wY -> FL (PrimOf p) wX wY
joinEffects FL (RepoPatchV2 prim) wY wY
c ->
forall a. a -> Maybe a
Just (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal PrimOf (RepoPatchV2 prim) wY wZ
y forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wY]
a1'nop2 (PrimOf (RepoPatchV2 prim) wY wZ
y forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) Non (RepoPatchV2 prim) wY
p2)
([Non (RepoPatchV2 prim) wY]
a1, FL prim wY wX
n1, Non (RepoPatchV2 prim) wY
_) ->
forall a. a -> Maybe a
Just (forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wY]
a1 FL prim wY wX
n1 Non (RepoPatchV2 prim) wY
p1' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wY]
a2 forall (a :: * -> * -> *) wX. FL a wX wX
NilFL Non (RepoPatchV2 prim) wY
p2)
commuteConflicting c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(InvConflictor{} :> Normal prim wZ wY
_) = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteC (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commuteConflicting (Conflictor [Non (RepoPatchV2 prim) wZ]
a1 FL prim wZ wX
n1 Non (RepoPatchV2 prim) wZ
p1 :> Conflictor [Non (RepoPatchV2 prim) wY]
a2 FL prim wY wZ
n2 Non (RepoPatchV2 prim) wY
p2)
| Just [Non (RepoPatchV2 prim) wY]
a2_minus_p1 <- forall a. Eq a => a -> [a] -> Maybe [a]
remove1 Non (RepoPatchV2 prim) wY
p1' [Non (RepoPatchV2 prim) wY]
a2
, Bool -> Bool
not (Non (RepoPatchV2 prim) wY
p2 forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
`dependsUpon` Non (RepoPatchV2 prim) wY
p1') = do
let n1nons :: [Non (RepoPatchV2 prim) wY]
n1nons = forall a b. (a -> b) -> [a] -> [b]
map (forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Non p wX
commutePrimsOrAddToCtx FL prim wY wZ
n2) forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wZ]
a1 FL prim wZ wX
n1
n2nons :: [Non (RepoPatchV2 prim) wY]
n2nons = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wY]
a2 FL prim wY wZ
n2
Just [Non (RepoPatchV2 prim) wY]
a2_minus_p1n1 = [Non (RepoPatchV2 prim) wY]
a2_minus_p1 forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` [Non (RepoPatchV2 prim) wY]
n1nons
n2n1 :: FL prim wY wX
n2n1 = FL prim wY wZ
n2 forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL prim wZ wX
n1
a1' :: [Non (RepoPatchV2 prim) wY]
a1' = forall a b. (a -> b) -> [a] -> [b]
map (forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Non p wX
commutePrimsOrAddToCtx FL prim wY wZ
n2) [Non (RepoPatchV2 prim) wZ]
a1
p2ooo :: Non (RepoPatchV2 prim) wY
p2ooo = forall (p :: * -> * -> *) wX.
(Nonable p, Effect p, Apply p, Commute p, Invert p, Eq2 p,
ToFromPrim p, PrimPatchBase p) =>
[Non p wX] -> Non p wX -> Non p wX
remNons [Non (RepoPatchV2 prim) wY]
a1' Non (RepoPatchV2 prim) wY
p2
FL prim wY wZ
n1' :> FL prim wZ wX
n2' <- forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> FL prim wX wY -> (:>) (FL prim) (FL prim) wX wY
filterConflictsFL Non (RepoPatchV2 prim) wY
p2ooo FL prim wY wX
n2n1
let n1'n2'nons :: [Non (RepoPatchV2 prim) wY]
n1'n2'nons = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wY]
a2_minus_p1n1 (FL prim wY wZ
n1' forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL prim wZ wX
n2')
n1'nons :: [Non (RepoPatchV2 prim) wY]
n1'nons = forall a. Int -> [a] -> [a]
take (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Int
lengthFL FL prim wY wZ
n1') [Non (RepoPatchV2 prim) wY]
n1'n2'nons
n2'nons :: [Non (RepoPatchV2 prim) wY]
n2'nons = forall a. Int -> [a] -> [a]
drop (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Int
lengthFL FL prim wY wZ
n1') [Non (RepoPatchV2 prim) wY]
n1'n2'nons
Just [Non (RepoPatchV2 prim) wY]
a1'nop2 = ([Non (RepoPatchV2 prim) wY]
a2 forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
n2nons) forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` (Non (RepoPatchV2 prim) wY
p1' forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
n1'nons)
Just [Non (RepoPatchV2 prim) wY]
a2'o =
forall a b. (a, b) -> a
fst (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
allConflictsWith Non (RepoPatchV2 prim) wY
p2 forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wY]
a2_minus_p1 forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
n2nons)
forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` [Non (RepoPatchV2 prim) wY]
n2'nons
Just [Non (RepoPatchV2 prim) wZ]
a2' =
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, Eq2 p, ToFromPrim p) =>
FL p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtxFL (forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> FL (RepoPatchV2 prim) wX wY
xx2patches [Non (RepoPatchV2 prim) wY]
a1'nop2 FL prim wY wZ
n1')) [Non (RepoPatchV2 prim) wY]
a2'o
Just Non (RepoPatchV2 prim) wZ
p2' = forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, Eq2 p, ToFromPrim p) =>
FL p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtxFL (forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> FL (RepoPatchV2 prim) wX wY
xx2patches [Non (RepoPatchV2 prim) wY]
a1'nop2 FL prim wY wZ
n1') Non (RepoPatchV2 prim) wY
p2
case ([Non (RepoPatchV2 prim) wZ]
a2', FL prim wZ wX
n2', Non (RepoPatchV2 prim) wZ
p2') of
([], FL prim wZ wX
NilFL, Non FL (RepoPatchV2 prim) wZ wY
c PrimOf (RepoPatchV2 prim) wY wZ
x) ->
case forall (p :: * -> * -> *) wX wY.
(Effect p, Invert (PrimOf p), Commute (PrimOf p),
Eq2 (PrimOf p)) =>
p wX wY -> FL (PrimOf p) wX wY
joinEffects FL (RepoPatchV2 prim) wZ wY
c of
FL (PrimOf (FL (RepoPatchV2 prim))) wZ wY
NilFL -> let n1'x :: FL prim wY wZ
n1'x = FL prim wY wZ
n1' forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ PrimOf (RepoPatchV2 prim) wY wZ
x forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL in
forall a. a -> Maybe a
Just (forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal PrimOf (RepoPatchV2 prim) wY wZ
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wY]
a1'nop2 FL prim wY wZ
n1'x Non (RepoPatchV2 prim) wY
p1')
FL (PrimOf (FL (RepoPatchV2 prim))) wZ wY
_ -> forall a. HasCallStack => String -> a
error String
"impossible case"
([Non (RepoPatchV2 prim) wZ], FL prim wZ wX,
Non (RepoPatchV2 prim) wZ)
_ -> forall a. a -> Maybe a
Just (RepoPatchV2 prim wX wZ
c1 forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wZ wY
c2)
where
c1 :: RepoPatchV2 prim wX wZ
c1 = forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wZ]
a2' FL prim wZ wX
n2' Non (RepoPatchV2 prim) wZ
p2'
c2 :: RepoPatchV2 prim wZ wY
c2 = forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor (Non (RepoPatchV2 prim) wY
p2 forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
a1'nop2) FL prim wY wZ
n1' Non (RepoPatchV2 prim) wY
p1'
where ([Non (RepoPatchV2 prim) wY]
_, FL (RepoPatchV2 prim) wY wZ
rpn2) = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
geteff [Non (RepoPatchV2 prim) wY]
a2 FL prim wY wZ
n2
p1' :: Non (RepoPatchV2 prim) wY
p1' = forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, ToFromPrim p) =>
RL p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtxRL (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wY wZ
rpn2) Non (RepoPatchV2 prim) wZ
p1
commuteConflicting c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(InvConflictor{} :> InvConflictor{}) = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteC (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commuteConflicting (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
_ = forall a. Maybe a
Nothing
instance PrimPatch prim => Commute (RepoPatchV2 prim) where
commute :: forall wX wY.
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
commute pair :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
pair@(RepoPatchV2 prim wX wZ
x :> RepoPatchV2 prim wZ wY
y) =
forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commuteNoConflicts (forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wX wZ
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wZ wY
y)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus`
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
commuteConflicting (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
pair
instance PrimPatch prim => CleanMerge (RepoPatchV2 prim) where
cleanMerge :: forall wX wY.
(:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
cleanMerge = forall (p :: * -> * -> *) wX wY.
(Invert p, CommuteNoConflicts p) =>
(:\/:) p p wX wY -> Maybe ((:/\:) p p wX wY)
mergeNoConflicts
instance PrimPatch prim => Merge (RepoPatchV2 prim) where
merge :: forall wX wY.
(:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
merge (InvConflictor{} :\/: RepoPatchV2 prim wZ wY
_) = forall a. HasCallStack => String -> a
error String
"impossible case"
merge (RepoPatchV2 prim wZ wX
_ :\/: InvConflictor{}) = forall a. HasCallStack => String -> a
error String
"impossible case"
merge (Etacilpud Non (RepoPatchV2 prim) wZ
_ :\/: RepoPatchV2 prim wZ wY
_) = forall a. HasCallStack => String -> a
error String
"impossible case"
merge (RepoPatchV2 prim wZ wX
_ :\/: Etacilpud Non (RepoPatchV2 prim) wZ
_) = forall a. HasCallStack => String -> a
error String
"impossible case"
merge (Duplicate Non (RepoPatchV2 prim) wZ
a :\/: Duplicate Non (RepoPatchV2 prim) wZ
b) = forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wZ
b forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wZ
a
merge (Duplicate Non (RepoPatchV2 prim) wZ
a :\/: RepoPatchV2 prim wZ wY
b) =
RepoPatchV2 prim wZ wY
b forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate (forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wZ wY
b) Non (RepoPatchV2 prim) wZ
a)
merge m :: (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
m@(RepoPatchV2 prim wZ wX
_ :\/: Duplicate Non (RepoPatchV2 prim) wZ
_) = forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
swapMerge (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
m
merge (RepoPatchV2 prim wZ wX
x :\/: RepoPatchV2 prim wZ wY
y)
| Just (RepoPatchV2 prim wX wZ
y' :/\: RepoPatchV2 prim wY wZ
x') <-
forall (p :: * -> * -> *) wX wY.
(Invert p, CommuteNoConflicts p) =>
(:\/:) p p wX wY -> Maybe ((:/\:) p p wX wY)
mergeNoConflicts ((forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wZ wX
x) forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: (forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wZ wY
y))
= forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wX wZ
y' forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wY wZ
x'
| EqCheck wX wY
IsEq <- RepoPatchV2 prim wZ wX
x forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= RepoPatchV2 prim wZ wY
y
, Non (RepoPatchV2 prim) wX
n <- forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wZ wX
x) forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non RepoPatchV2 prim wZ wX
x =
forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
n forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
n
merge (nx :: RepoPatchV2 prim wZ wX
nx@(Normal prim wZ wX
x) :\/: ny :: RepoPatchV2 prim wZ wY
ny@(Normal prim wZ wY
y)) = RepoPatchV2 prim wX wZ
cy forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: RepoPatchV2 prim wY wZ
cx
where
cy :: RepoPatchV2 prim wX wZ
cy = forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [] (prim wZ wX
x forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non RepoPatchV2 prim wZ wY
ny)
cx :: RepoPatchV2 prim wY wZ
cx = forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [] (prim wZ wY
y forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non RepoPatchV2 prim wZ wX
nx)
merge (Normal prim wZ wX
x :\/: Conflictor [Non (RepoPatchV2 prim) wY]
iy FL prim wY wZ
yy Non (RepoPatchV2 prim) wY
y) =
forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) wY]
iy FL prim wY wX
yyx Non (RepoPatchV2 prim) wY
y forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor (Non (RepoPatchV2 prim) wY
y forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
iy forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
nyy) forall (a :: * -> * -> *) wX. FL a wX wX
NilFL Non (RepoPatchV2 prim) wY
x'
where yyx :: FL prim wY wX
yyx = FL prim wY wZ
yy forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ prim wZ wX
x forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
(Non (RepoPatchV2 prim) wY
x' : [Non (RepoPatchV2 prim) wY]
nyy) = forall a. [a] -> [a]
reverse forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wY]
iy FL prim wY wX
yyx
merge m :: (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
m@(Conflictor{} :\/: Normal prim wZ wY
_) = forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
swapMerge (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
m
merge (Conflictor [Non (RepoPatchV2 prim) wX]
ix FL prim wX wZ
xx Non (RepoPatchV2 prim) wX
x :\/: Conflictor [Non (RepoPatchV2 prim) wY]
iy FL prim wY wZ
yy Non (RepoPatchV2 prim) wY
y) =
case forall (p :: * -> * -> *) wX wO wY.
(Commute p, Eq2 p) =>
RL p wX wO -> RL p wY wO -> CommonRL p wX wY wO
pullCommonRL (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL prim wX wZ
xx) (forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL prim wY wZ
yy) of
CommonRL RL prim wX wI
rxx1 RL prim wY wI
ryy1 RL prim wI wZ
c ->
case forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) (RL p) (FL p) wX wY -> Maybe ((:>) (FL p) (RL p) wX wY)
commuteRLFL (RL prim wY wI
ryy1 forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (p :: * -> * -> *) wX wY.
Invert p =>
RL p wX wY -> FL p wY wX
invertRL RL prim wX wI
rxx1) of
Just (FL prim wY wZ
ixx' :> RL prim wZ wX
ryy') ->
let xx' :: FL prim wZ wY
xx' = forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wY wZ
ixx'
yy' :: FL prim wZ wX
yy' = forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL prim wZ wX
ryy'
Non (RepoPatchV2 prim) wZ
y' : [Non (RepoPatchV2 prim) wZ]
iy' =
forall a b. (a -> b) -> [a] -> [b]
map (forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Non p wX
commutePrimsOrAddToCtx FL prim wZ wY
xx') (Non (RepoPatchV2 prim) wY
y forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
iy)
Non (RepoPatchV2 prim) wZ
x' : [Non (RepoPatchV2 prim) wZ]
ix' =
forall a b. (a -> b) -> [a] -> [b]
map (forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Non p wX
commutePrimsOrAddToCtx RL prim wZ wX
ryy') (Non (RepoPatchV2 prim) wX
x forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wX]
ix)
nyy' :: [Non (RepoPatchV2 prim) wZ]
nyy' = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wZ]
iy' FL prim wZ wX
yy'
nxx' :: [Non (RepoPatchV2 prim) wZ]
nxx' = forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wZ]
ix' FL prim wZ wY
xx'
icx :: [Non (RepoPatchV2 prim) wX]
icx = forall a. Int -> [a] -> [a]
drop (forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> Int
lengthRL RL prim wX wI
rxx1) forall a b. (a -> b) -> a -> b
$
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wX]
ix (forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL forall a b. (a -> b) -> a -> b
$ RL prim wX wI
rxx1 forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> RL a wY wZ -> RL a wX wZ
+<+ RL prim wI wZ
c)
ic' :: [Non (RepoPatchV2 prim) wZ]
ic' = forall a b. (a -> b) -> [a] -> [b]
map (forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Non p wX
commutePrimsOrAddToCtx RL prim wZ wX
ryy') [Non (RepoPatchV2 prim) wX]
icx
ixy' :: [Non (RepoPatchV2 prim) wZ]
ixy' = [Non (RepoPatchV2 prim) wZ]
ic' forall a. [a] -> [a] -> [a]
++ ([Non (RepoPatchV2 prim) wZ]
iy' forall a. Eq a => [a] -> [a] -> [a]
+++ [Non (RepoPatchV2 prim) wZ]
ix')
c1 :: RepoPatchV2 prim wX wZ
c1 = forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor (Non (RepoPatchV2 prim) wZ
x' forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wZ]
ixy' forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wZ]
nxx') FL prim wZ wX
yy' Non (RepoPatchV2 prim) wZ
y'
c2 :: RepoPatchV2 prim wY wZ
c2 = forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor (Non (RepoPatchV2 prim) wZ
y' forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wZ]
ixy' forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wZ]
nyy') FL prim wZ wY
xx' Non (RepoPatchV2 prim) wZ
x' in
RepoPatchV2 prim wX wZ
c1 forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: RepoPatchV2 prim wY wZ
c2
Maybe ((:>) (FL prim) (RL prim) wY wX)
Nothing -> forall a. HasCallStack => String -> a
error String
"impossible case"
instance PatchInspect prim => PatchInspect (RepoPatchV2 prim) where
listTouchedFiles :: forall wX wY. RepoPatchV2 prim wX wY -> [AnchoredPath]
listTouchedFiles (Duplicate Non (RepoPatchV2 prim) wX
p) = forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches Non (RepoPatchV2 prim) wX
p
listTouchedFiles (Etacilpud Non (RepoPatchV2 prim) wX
p) = forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches Non (RepoPatchV2 prim) wX
p
listTouchedFiles (Normal prim wX wY
p) = forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [AnchoredPath]
listTouchedFiles prim wX wY
p
listTouchedFiles (Conflictor [Non (RepoPatchV2 prim) wY]
x FL prim wY wX
c Non (RepoPatchV2 prim) wY
p) =
forall a. Ord a => [a] -> [a]
nubSort forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches [Non (RepoPatchV2 prim) wY]
x forall a. [a] -> [a] -> [a]
++ forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [AnchoredPath]
listTouchedFiles FL prim wY wX
c forall a. [a] -> [a] -> [a]
++ forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches Non (RepoPatchV2 prim) wY
p
listTouchedFiles (InvConflictor [Non (RepoPatchV2 prim) wX]
x FL prim wX wY
c Non (RepoPatchV2 prim) wX
p) =
forall a. Ord a => [a] -> [a]
nubSort forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches [Non (RepoPatchV2 prim) wX]
x forall a. [a] -> [a] -> [a]
++ forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [AnchoredPath]
listTouchedFiles FL prim wX wY
c forall a. [a] -> [a] -> [a]
++ forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches Non (RepoPatchV2 prim) wX
p
hunkMatches :: forall wX wY.
(ByteString -> Bool) -> RepoPatchV2 prim wX wY -> Bool
hunkMatches ByteString -> Bool
f (Duplicate Non (RepoPatchV2 prim) wX
p) = forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f Non (RepoPatchV2 prim) wX
p
hunkMatches ByteString -> Bool
f (Etacilpud Non (RepoPatchV2 prim) wX
p) = forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f Non (RepoPatchV2 prim) wX
p
hunkMatches ByteString -> Bool
f (Normal prim wX wY
p) = forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f prim wX wY
p
hunkMatches ByteString -> Bool
f (Conflictor [Non (RepoPatchV2 prim) wY]
x FL prim wY wX
c Non (RepoPatchV2 prim) wY
p) =
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f) [Non (RepoPatchV2 prim) wY]
x Bool -> Bool -> Bool
|| forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL prim wY wX
c Bool -> Bool -> Bool
|| forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f Non (RepoPatchV2 prim) wY
p
hunkMatches ByteString -> Bool
f (InvConflictor [Non (RepoPatchV2 prim) wX]
x FL prim wX wY
c Non (RepoPatchV2 prim) wX
p) =
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f) [Non (RepoPatchV2 prim) wX]
x Bool -> Bool -> Bool
|| forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL prim wX wY
c Bool -> Bool -> Bool
|| forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f Non (RepoPatchV2 prim) wX
p
allConflictsWith :: PrimPatch prim => Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
allConflictsWith :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
allConflictsWith Non (RepoPatchV2 prim) wX
x [Non (RepoPatchV2 prim) wX]
ys = forall {prim :: * -> * -> *} {wX}.
(CleanMerge prim, Commute prim, Invert prim, Eq2 prim, IsHunk prim,
PatchInspect prim, RepairToFL prim, Show2 prim, PrimConstruct prim,
PrimCanonize prim, PrimClassify prim, PrimDetails prim,
PrimApply prim, PrimSift prim, PrimMangleUnravelled prim,
ReadPatch prim, ShowPatch prim, ShowContextPatch prim,
PatchListFormat prim) =>
([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
acw forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith Non (RepoPatchV2 prim) wX
x) [Non (RepoPatchV2 prim) wX]
ys
where
acw :: ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
acw ([], [Non (RepoPatchV2 prim) wX]
nc) = ([], [Non (RepoPatchV2 prim) wX]
nc)
acw (Non (RepoPatchV2 prim) wX
c:[Non (RepoPatchV2 prim) wX]
cs, [Non (RepoPatchV2 prim) wX]
nc) = case forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
allConflictsWith Non (RepoPatchV2 prim) wX
c [Non (RepoPatchV2 prim) wX]
nc of
([Non (RepoPatchV2 prim) wX]
c1, [Non (RepoPatchV2 prim) wX]
nc1) -> case ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
acw ([Non (RepoPatchV2 prim) wX]
cs, [Non (RepoPatchV2 prim) wX]
nc1) of
([Non (RepoPatchV2 prim) wX]
xs', [Non (RepoPatchV2 prim) wX]
nc') -> (Non (RepoPatchV2 prim) wX
c forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wX]
c1 forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wX]
xs', [Non (RepoPatchV2 prim) wX]
nc')
conflictsWith :: PrimPatch prim => Non (RepoPatchV2 prim) wX
-> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
conflictsWith Non (RepoPatchV2 prim) wX
x Non (RepoPatchV2 prim) wX
y | Non (RepoPatchV2 prim) wX
x forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
`dependsUpon` Non (RepoPatchV2 prim) wX
y Bool -> Bool -> Bool
|| Non (RepoPatchV2 prim) wX
y forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
`dependsUpon` Non (RepoPatchV2 prim) wX
x = Bool
False
conflictsWith Non (RepoPatchV2 prim) wX
x (Non FL (RepoPatchV2 prim) wX wY
cy PrimOf (RepoPatchV2 prim) wY wZ
y) =
case forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, Eq2 p, ToFromPrim p) =>
FL p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtxFL FL (RepoPatchV2 prim) wX wY
cy Non (RepoPatchV2 prim) wX
x of
Just (Non FL (RepoPatchV2 prim) wY wY
cx' PrimOf (RepoPatchV2 prim) wY wZ
x') ->
let iy :: RepoPatchV2 prim wZ wY
iy = forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert PrimOf (RepoPatchV2 prim) wY wZ
y in
case forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Maybe ((:>) (FL p) p wX wY)
commuteFL (RepoPatchV2 prim wZ wY
iy forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV2 prim) wY wY
cx' forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal PrimOf (RepoPatchV2 prim) wY wZ
x' forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) of
Just (:>) (FL (RepoPatchV2 prim)) (RepoPatchV2 prim) wZ wZ
_ -> Bool
False
Maybe ((:>) (FL (RepoPatchV2 prim)) (RepoPatchV2 prim) wZ wZ)
Nothing -> Bool
True
Maybe (Non (RepoPatchV2 prim) wY)
Nothing -> Bool
True
dependsUpon :: PrimPatch prim => Non (RepoPatchV2 prim) wX
-> Non (RepoPatchV2 prim) wX -> Bool
dependsUpon :: forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
dependsUpon (Non FL (RepoPatchV2 prim) wX wY
xs PrimOf (RepoPatchV2 prim) wY wZ
_) (Non FL (RepoPatchV2 prim) wX wY
ys PrimOf (RepoPatchV2 prim) wY wZ
y) =
case forall (p :: * -> * -> *) wA wB wC.
(Eq2 p, Commute p) =>
FL p wA wB -> FL p wA wC -> Maybe (FL p wB wC)
removeSubsequenceFL (FL (RepoPatchV2 prim) wX wY
ys forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal PrimOf (RepoPatchV2 prim) wY wZ
y forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) FL (RepoPatchV2 prim) wX wY
xs of
Just FL (RepoPatchV2 prim) wZ wY
_ -> Bool
True
Maybe (FL (RepoPatchV2 prim) wZ wY)
Nothing -> Bool
False
(+++) :: Eq a => [a] -> [a] -> [a]
[] +++ :: forall a. Eq a => [a] -> [a] -> [a]
+++ [a]
x = [a]
x
[a]
x +++ [] = [a]
x
(a
x:[a]
xs) +++ [a]
xys | Just [a]
ys <- forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
x [a]
xys = a
x forall a. a -> [a] -> [a]
: ([a]
xs forall a. Eq a => [a] -> [a] -> [a]
+++ [a]
ys)
| Bool
otherwise = a
x forall a. a -> [a] -> [a]
: ([a]
xs forall a. Eq a => [a] -> [a] -> [a]
+++ [a]
xys)
invertCommuteC :: PrimPatch prim => CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
invertCommuteC :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteC = forall (p :: * -> * -> *) (q :: * -> * -> *).
(Invert p, Invert q) =>
CommuteFn p q -> CommuteFn q p
invertCommuter forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
commuteConflicting
invertCommuteNC :: PrimPatch prim => CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
invertCommuteNC :: forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteNC = forall (p :: * -> * -> *) (q :: * -> * -> *).
(Invert p, Invert q) =>
CommuteFn p q -> CommuteFn q p
invertCommuter forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commuteNoConflicts
pullCommon :: (Commute p, Eq2 p) => FL p wO wX -> FL p wO wY -> Common p wO wX wY
pullCommon :: forall (p :: * -> * -> *) wO wX wY.
(Commute p, Eq2 p) =>
FL p wO wX -> FL p wO wY -> Common p wO wX wY
pullCommon FL p wO wX
NilFL FL p wO wY
ys = forall (common :: * -> * -> *) (left :: * -> * -> *)
(right :: * -> * -> *) wA wX wY wU.
common wA wU
-> left wU wX -> right wU wY -> Fork common left right wA wX wY
Fork forall (a :: * -> * -> *) wX. FL a wX wX
NilFL forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL p wO wY
ys
pullCommon FL p wO wX
xs FL p wO wY
NilFL = forall (common :: * -> * -> *) (left :: * -> * -> *)
(right :: * -> * -> *) wA wX wY wU.
common wA wU
-> left wU wX -> right wU wY -> Fork common left right wA wX wY
Fork forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL p wO wX
xs forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
pullCommon (p wO wY
x :>: FL p wY wX
xs) FL p wO wY
xys | Just FL p wY wY
ys <- forall (p :: * -> * -> *) wX wY wZ.
(Eq2 p, Commute p) =>
p wX wY -> FL p wX wZ -> Maybe (FL p wY wZ)
removeFL p wO wY
x FL p wO wY
xys =
case forall (p :: * -> * -> *) wO wX wY.
(Commute p, Eq2 p) =>
FL p wO wX -> FL p wO wY -> Common p wO wX wY
pullCommon FL p wY wX
xs FL p wY wY
ys of
Fork FL p wY wU
c FL p wU wX
xs' FL p wU wY
ys' -> forall (common :: * -> * -> *) (left :: * -> * -> *)
(right :: * -> * -> *) wA wX wY wU.
common wA wU
-> left wU wX -> right wU wY -> Fork common left right wA wX wY
Fork (p wO wY
x forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: FL p wY wU
c) FL p wU wX
xs' FL p wU wY
ys'
pullCommon (p wO wY
x :>: FL p wY wX
xs) FL p wO wY
ys =
case forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> (:>) (FL p) (p :> FL p) wX wY
commuteWhatWeCanFL (p wO wY
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL p wY wX
xs) of
FL p wO wZ
xs1 :> p wZ wZ
x' :> FL p wZ wX
xs2 -> case forall (p :: * -> * -> *) wO wX wY.
(Commute p, Eq2 p) =>
FL p wO wX -> FL p wO wY -> Common p wO wX wY
pullCommon FL p wO wZ
xs1 FL p wO wY
ys of
Fork FL p wO wU
c FL p wU wZ
xs1' FL p wU wY
ys' -> forall (common :: * -> * -> *) (left :: * -> * -> *)
(right :: * -> * -> *) wA wX wY wU.
common wA wU
-> left wU wX -> right wU wY -> Fork common left right wA wX wY
Fork FL p wO wU
c (FL p wU wZ
xs1' forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ p wZ wZ
x' forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: FL p wZ wX
xs2) FL p wU wY
ys'
type Common p wO wX wY = Fork (FL p) (FL p) (FL p) wO wX wY
pullCommonRL :: (Commute p, Eq2 p) => RL p wX wO -> RL p wY wO -> CommonRL p wX wY wO
pullCommonRL :: forall (p :: * -> * -> *) wX wO wY.
(Commute p, Eq2 p) =>
RL p wX wO -> RL p wY wO -> CommonRL p wX wY wO
pullCommonRL RL p wX wO
NilRL RL p wY wO
ys = forall (p :: * -> * -> *) wX wI wY wF.
RL p wX wI -> RL p wY wI -> RL p wI wF -> CommonRL p wX wY wF
CommonRL forall (a :: * -> * -> *) wX. RL a wX wX
NilRL RL p wY wO
ys forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
pullCommonRL RL p wX wO
xs RL p wY wO
NilRL = forall (p :: * -> * -> *) wX wI wY wF.
RL p wX wI -> RL p wY wI -> RL p wI wF -> CommonRL p wX wY wF
CommonRL RL p wX wO
xs forall (a :: * -> * -> *) wX. RL a wX wX
NilRL forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
pullCommonRL (RL p wX wY
xs :<: p wY wO
x) RL p wY wO
xys | Just RL p wY wY
ys <- forall (p :: * -> * -> *) wY wZ wX.
(Eq2 p, Commute p) =>
p wY wZ -> RL p wX wZ -> Maybe (RL p wX wY)
removeRL p wY wO
x RL p wY wO
xys =
case forall (p :: * -> * -> *) wX wO wY.
(Commute p, Eq2 p) =>
RL p wX wO -> RL p wY wO -> CommonRL p wX wY wO
pullCommonRL RL p wX wY
xs RL p wY wY
ys of
CommonRL RL p wX wI
xs' RL p wY wI
ys' RL p wI wY
c -> forall (p :: * -> * -> *) wX wI wY wF.
RL p wX wI -> RL p wY wI -> RL p wI wF -> CommonRL p wX wY wF
CommonRL RL p wX wI
xs' RL p wY wI
ys' (RL p wI wY
c forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: p wY wO
x)
pullCommonRL (RL p wX wY
xs :<: p wY wO
x) RL p wY wO
ys =
case forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) (RL p) p wX wY -> (:>) (RL p) (p :> RL p) wX wY
commuteWhatWeCanRL (RL p wX wY
xs forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> p wY wO
x) of
RL p wX wZ
xs1 :> p wZ wZ
x' :> RL p wZ wO
xs2 ->
case forall (p :: * -> * -> *) wX wO wY.
(Commute p, Eq2 p) =>
RL p wX wO -> RL p wY wO -> CommonRL p wX wY wO
pullCommonRL RL p wZ wO
xs2 RL p wY wO
ys of
CommonRL RL p wZ wI
xs2' RL p wY wI
ys' RL p wI wO
c -> forall (p :: * -> * -> *) wX wI wY wF.
RL p wX wI -> RL p wY wI -> RL p wI wF -> CommonRL p wX wY wF
CommonRL (RL p wX wZ
xs1 forall (a :: * -> * -> *) wX wI wZ.
RL a wX wI -> a wI wZ -> RL a wX wZ
:<: p wZ wZ
x' forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> RL a wY wZ -> RL a wX wZ
+<+ RL p wZ wI
xs2') RL p wY wI
ys' RL p wI wO
c
data CommonRL p wX wY wF where
CommonRL :: RL p wX wI -> RL p wY wI -> RL p wI wF -> CommonRL p wX wY wF
instance PrimPatch prim => Apply (RepoPatchV2 prim) where
type ApplyState (RepoPatchV2 prim) = ApplyState prim
apply :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (RepoPatchV2 prim)) m =>
RepoPatchV2 prim wX wY -> m ()
apply RepoPatchV2 prim wX wY
p = forall (prim :: * -> * -> *) (m :: * -> *) wX wY.
(PrimApply prim, ApplyMonad (ApplyState prim) m) =>
FL prim wX wY -> m ()
applyPrimFL (forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect RepoPatchV2 prim wX wY
p)
instance PrimPatch prim => RepairToFL (RepoPatchV2 prim) where
applyAndTryToFixFL :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (RepoPatchV2 prim)) m =>
RepoPatchV2 prim wX wY
-> m (Maybe (String, FL (RepoPatchV2 prim) wX wY))
applyAndTryToFixFL (Normal prim wX wY
p) =
forall a b c. (a -> b) -> Maybe (c, a) -> Maybe (c, b)
mapMaybeSnd (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 (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal) forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(RepairToFL p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m (Maybe (String, FL p wX wY))
applyAndTryToFixFL prim wX wY
p
applyAndTryToFixFL RepoPatchV2 prim wX wY
x = do forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply RepoPatchV2 prim wX wY
x; forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
instance PatchListFormat (RepoPatchV2 prim) where
patchListFormat :: ListFormat (RepoPatchV2 prim)
patchListFormat = forall (p :: * -> * -> *). ListFormat p
ListFormatV2
duplicate, etacilpud, conflictor, rotcilfnoc :: String
duplicate :: String
duplicate = String
"duplicate"
etacilpud :: String
etacilpud = String
"etacilpud"
conflictor :: String
conflictor = String
"conflictor"
rotcilfnoc :: String
rotcilfnoc = String
"rotcilfnoc"
instance PrimPatch prim => ShowPatchBasic (RepoPatchV2 prim) where
showPatch :: forall wX wY. ShowPatchFor -> RepoPatchV2 prim wX wY -> Doc
showPatch ShowPatchFor
f (Duplicate Non (RepoPatchV2 prim) wX
d) = String -> Doc
blueText String
duplicate Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> Non p wX -> Doc
showNon ShowPatchFor
f Non (RepoPatchV2 prim) wX
d
showPatch ShowPatchFor
f (Etacilpud Non (RepoPatchV2 prim) wX
d) = String -> Doc
blueText String
etacilpud Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> Non p wX -> Doc
showNon ShowPatchFor
f Non (RepoPatchV2 prim) wX
d
showPatch ShowPatchFor
f (Normal prim wX wY
p) = forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f prim wX wY
p
showPatch ShowPatchFor
f (Conflictor [Non (RepoPatchV2 prim) wY]
i FL prim wY wX
NilFL Non (RepoPatchV2 prim) wY
p) =
String -> Doc
blueText String
conflictor Doc -> Doc -> Doc
<+> forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> [Non p wX] -> Doc
showNons ShowPatchFor
f [Non (RepoPatchV2 prim) wY]
i Doc -> Doc -> Doc
<+> String -> Doc
blueText String
"[]" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> Non p wX -> Doc
showNon ShowPatchFor
f Non (RepoPatchV2 prim) wY
p
showPatch ShowPatchFor
f (Conflictor [Non (RepoPatchV2 prim) wY]
i FL prim wY wX
cs Non (RepoPatchV2 prim) wY
p) =
String -> Doc
blueText String
conflictor Doc -> Doc -> Doc
<+> forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> [Non p wX] -> Doc
showNons ShowPatchFor
f [Non (RepoPatchV2 prim) wY]
i Doc -> Doc -> Doc
<+> String -> Doc
blueText String
"[" Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> FL p wX wY -> Doc
showFL ShowPatchFor
f FL prim wY wX
cs Doc -> Doc -> Doc
$$
String -> Doc
blueText String
"]" Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> Non p wX -> Doc
showNon ShowPatchFor
f Non (RepoPatchV2 prim) wY
p
showPatch ShowPatchFor
f (InvConflictor [Non (RepoPatchV2 prim) wX]
i FL prim wX wY
NilFL Non (RepoPatchV2 prim) wX
p) =
String -> Doc
blueText String
rotcilfnoc Doc -> Doc -> Doc
<+> forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> [Non p wX] -> Doc
showNons ShowPatchFor
f [Non (RepoPatchV2 prim) wX]
i Doc -> Doc -> Doc
<+> String -> Doc
blueText String
"[]" Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> Non p wX -> Doc
showNon ShowPatchFor
f Non (RepoPatchV2 prim) wX
p
showPatch ShowPatchFor
f (InvConflictor [Non (RepoPatchV2 prim) wX]
i FL prim wX wY
cs Non (RepoPatchV2 prim) wX
p) =
String -> Doc
blueText String
rotcilfnoc Doc -> Doc -> Doc
<+> forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> [Non p wX] -> Doc
showNons ShowPatchFor
f [Non (RepoPatchV2 prim) wX]
i Doc -> Doc -> Doc
<+> String -> Doc
blueText String
"[" Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> FL p wX wY -> Doc
showFL ShowPatchFor
f FL prim wX wY
cs Doc -> Doc -> Doc
$$
String -> Doc
blueText String
"]" Doc -> Doc -> Doc
$$
forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> Non p wX -> Doc
showNon ShowPatchFor
f Non (RepoPatchV2 prim) wX
p
instance PrimPatch prim => ShowContextPatch (RepoPatchV2 prim) where
showContextPatch :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (RepoPatchV2 prim)) m =>
ShowPatchFor -> RepoPatchV2 prim wX wY -> m Doc
showContextPatch ShowPatchFor
f (Normal prim wX wY
p) = forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(ShowContextPatch p, ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> p wX wY -> m Doc
showContextPatch ShowPatchFor
f prim wX wY
p
showContextPatch ShowPatchFor
f RepoPatchV2 prim wX wY
p = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f RepoPatchV2 prim wX wY
p
instance PrimPatch prim => ShowPatch (RepoPatchV2 prim) where
summary :: forall wX wY. RepoPatchV2 prim wX wY -> Doc
summary = forall (e :: * -> * -> *) wX wY.
(Summary e, PrimDetails (PrimOf e)) =>
e wX wY -> Doc
plainSummary
summaryFL :: forall wX wY. FL (RepoPatchV2 prim) wX wY -> Doc
summaryFL = forall (e :: * -> * -> *) wX wY.
(Summary e, PrimDetails (PrimOf e)) =>
e wX wY -> Doc
plainSummary
thing :: forall wX wY. RepoPatchV2 prim wX wY -> String
thing RepoPatchV2 prim wX wY
_ = String
"change"
instance PrimPatch prim => ReadPatch (RepoPatchV2 prim) where
readPatch' :: forall wX. Parser (Sealed (RepoPatchV2 prim wX))
readPatch' = do
Parser ()
skipSpace
let str :: String -> Parser ()
str = ByteString -> Parser ()
string forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BC.pack
readConflictorPs :: Parser
ByteString
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
readConflictorPs = do
[Non (RepoPatchV2 prim) wX]
i <- forall (p :: * -> * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p) =>
Parser [Non p wX]
readNons
Sealed (FL prim wX)
ps <- forall (p :: * -> * -> *) wX.
(forall wY. Parser (Sealed (p wY)))
-> Char -> Char -> Parser (Sealed (FL p wX))
bracketedFL forall (p :: * -> * -> *) wX. ReadPatch p => Parser (Sealed (p wX))
readPatch' Char
'[' Char
']'
Non (RepoPatchV2 prim) wX
p <- forall (p :: * -> * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p) =>
Parser (Non p wX)
readNon
forall (m :: * -> *) a. Monad m => a -> m a
return ([Non (RepoPatchV2 prim) wX]
i, Sealed (FL prim wX)
ps, Non (RepoPatchV2 prim) wX
p)
forall (f :: * -> *) a. Alternative f => [f a] -> f a
choice [ do String -> Parser ()
str String
duplicate
Non (RepoPatchV2 prim) wX
p <- forall (p :: * -> * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p) =>
Parser (Non p wX)
readNon
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (a :: * -> *) wI. a wI -> Sealed a
Sealed forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
p
, do String -> Parser ()
str String
etacilpud
Non (RepoPatchV2 prim) wX
p <- forall (p :: * -> * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p) =>
Parser (Non p wX)
readNon
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (a :: * -> *) wI. a wI -> Sealed a
Sealed forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Etacilpud Non (RepoPatchV2 prim) wX
p
, do String -> Parser ()
str String
conflictor
([Non (RepoPatchV2 prim) Any]
i, Sealed FL prim Any wX
ps, Non (RepoPatchV2 prim) Any
p) <- forall {wX} {wX} {wX}.
Parser
ByteString
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
readConflictorPs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (a :: * -> *) wI. a wI -> Sealed a
Sealed forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
Conflictor [Non (RepoPatchV2 prim) Any]
i (forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP FL prim Any wX
ps) Non (RepoPatchV2 prim) Any
p
, do String -> Parser ()
str String
rotcilfnoc
([Non (RepoPatchV2 prim) wX]
i, Sealed FL prim wX wX
ps, Non (RepoPatchV2 prim) wX
p) <- forall {wX} {wX} {wX}.
Parser
ByteString
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
readConflictorPs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (a :: * -> *) wI. a wI -> Sealed a
Sealed forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wX wY
InvConflictor [Non (RepoPatchV2 prim) wX]
i FL prim wX wX
ps Non (RepoPatchV2 prim) wX
p
, do Sealed prim wX wX
p <- forall (p :: * -> * -> *) wX. ReadPatch p => Parser (Sealed (p wX))
readPatch'
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (a :: * -> *) wI. a wI -> Sealed a
Sealed forall a b. (a -> b) -> a -> b
$ forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wX
p
]
instance Show2 prim => Show (RepoPatchV2 prim wX wY) where
showsPrec :: Int -> RepoPatchV2 prim wX wY -> ShowS
showsPrec Int
d (Normal prim wX wY
prim) =
Bool -> ShowS -> ShowS
showParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
appPrec) forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"Normal " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wY. Show2 a => Int -> a wX wY -> ShowS
showsPrec2 (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) prim wX wY
prim
showsPrec Int
d (Duplicate Non (RepoPatchV2 prim) wX
x) =
Bool -> ShowS -> ShowS
showParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
appPrec) forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"Duplicate " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) Non (RepoPatchV2 prim) wX
x
showsPrec Int
d (Etacilpud Non (RepoPatchV2 prim) wX
x) =
Bool -> ShowS -> ShowS
showParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
appPrec) forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"Etacilpud " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) Non (RepoPatchV2 prim) wX
x
showsPrec Int
d (Conflictor [Non (RepoPatchV2 prim) wY]
ix FL prim wY wX
xx Non (RepoPatchV2 prim) wY
x) =
Bool -> ShowS -> ShowS
showParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
appPrec) forall a b. (a -> b) -> a -> b
$
String -> ShowS
showString String
"Conflictor " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) [Non (RepoPatchV2 prim) wY]
ix forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> ShowS
showString String
" " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) FL prim wY wX
xx forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> ShowS
showString String
" " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) Non (RepoPatchV2 prim) wY
x
showsPrec Int
d (InvConflictor [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx Non (RepoPatchV2 prim) wX
x) =
Bool -> ShowS -> ShowS
showParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
appPrec) forall a b. (a -> b) -> a -> b
$
String -> ShowS
showString String
"InvConflictor " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) [Non (RepoPatchV2 prim) wX]
ix forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> ShowS
showString String
" " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) FL prim wX wY
xx forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> ShowS
showString String
" " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec (Int
appPrec forall a. Num a => a -> a -> a
+ Int
1) Non (RepoPatchV2 prim) wX
x
instance Show2 prim => Show1 (RepoPatchV2 prim wX)
instance Show2 prim => Show2 (RepoPatchV2 prim)
instance PrimPatch prim => Nonable (RepoPatchV2 prim) where
non :: forall wX wY. RepoPatchV2 prim wX wY -> Non (RepoPatchV2 prim) wX
non (Duplicate Non (RepoPatchV2 prim) wX
d) = Non (RepoPatchV2 prim) wX
d
non (Etacilpud Non (RepoPatchV2 prim) wX
d) = forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX
invertNon Non (RepoPatchV2 prim) wX
d
non (Normal prim wX wY
p) = forall (p :: * -> * -> *) wX wI wY.
FL p wX wI -> PrimOf p wI wY -> Non p wX
Non forall (a :: * -> * -> *) wX. FL a wX wX
NilFL prim wX wY
p
non (Conflictor [Non (RepoPatchV2 prim) wY]
_ FL prim wY wX
xx Non (RepoPatchV2 prim) wY
x) = forall (l :: (* -> * -> *) -> * -> * -> *) (p :: * -> * -> *) wX
wY.
(WL l, Apply p, Commute p, Invert p, ToFromPrim p) =>
l (PrimOf p) wX wY -> Non p wY -> Non p wX
commutePrimsOrAddToCtx (forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL prim wY wX
xx) Non (RepoPatchV2 prim) wY
x
non (InvConflictor [Non (RepoPatchV2 prim) wX]
_ FL prim wX wY
_ Non (RepoPatchV2 prim) wX
n) = forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX
invertNon Non (RepoPatchV2 prim) wX
n
instance PrimPatch prim => Effect (RepoPatchV2 prim) where
effect :: forall wX wY.
RepoPatchV2 prim wX wY -> FL (PrimOf (RepoPatchV2 prim)) wX wY
effect (Duplicate Non (RepoPatchV2 prim) wX
_) = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Etacilpud Non (RepoPatchV2 prim) wX
_) = forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Normal prim wX wY
p) = prim wX wY
p forall (a :: * -> * -> *) wX wI wZ.
a wX wI -> FL a wI wZ -> FL a wX wZ
:>: forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Conflictor [Non (RepoPatchV2 prim) wY]
_ FL prim wY wX
e Non (RepoPatchV2 prim) wY
_) = forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wY wX
e
effect (InvConflictor [Non (RepoPatchV2 prim) wX]
_ FL prim wX wY
e Non (RepoPatchV2 prim) wX
_) = FL prim wX wY
e
instance IsHunk prim => IsHunk (RepoPatchV2 prim) where
isHunk :: forall wX wY. RepoPatchV2 prim wX wY -> Maybe (FileHunk wX wY)
isHunk RepoPatchV2 prim wX wY
rp = do Normal prim wX wY
p <- forall (m :: * -> *) a. Monad m => a -> m a
return RepoPatchV2 prim wX wY
rp
forall (p :: * -> * -> *) wX wY.
IsHunk p =>
p wX wY -> Maybe (FileHunk wX wY)
isHunk prim wX wY
p
displayNons :: (PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons :: forall (p :: * -> * -> *) wX.
(PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons [Non p wX]
p = forall (p :: * -> * -> *) wX.
(ShowPatchBasic p, PatchListFormat p, PrimPatchBase p) =>
ShowPatchFor -> [Non p wX] -> Doc
showNons ShowPatchFor
ForDisplay [Non p wX]
p
showFL :: ShowPatchBasic p => ShowPatchFor -> FL p wX wY -> Doc
showFL :: forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> FL p wX wY -> Doc
showFL ShowPatchFor
f = [Doc] -> Doc
vcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f)