{-# 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 :: 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 :: 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{}) -> String -> RepoPatchV2 prim wS wY -> Maybe Doc
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
_) -> String -> RepoPatchV2 prim wS wY -> Maybe Doc
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
_ -> Maybe Doc
forall a. Maybe a
Nothing
where
justRedP :: String -> p wX wY -> Maybe Doc
justRedP String
msg p wX wY
p = Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Doc -> Maybe Doc) -> Doc -> Maybe Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
msg Doc -> Doc -> Doc
$$ p wX wY -> 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 :: [Sealed (FL prim wX)] -> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
mergeUnravelled [] = Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a. Maybe a
Nothing
mergeUnravelled [Sealed (FL prim wX)
_] = Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a. Maybe a
Nothing
mergeUnravelled [Sealed (FL prim wX)]
ws =
case [Sealed (FL prim wX)] -> Maybe (RL (RepoPatchV2 prim) wX wX)
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 -> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a. Maybe a
Nothing
Just RL (RepoPatchV2 prim) wX wX
NilRL -> String -> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a. HasCallStack => String -> a
error String
"found no patches in mergeUnravelled"
Just (RL (RepoPatchV2 prim) wX wY
_ :<: RepoPatchV2 prim wY wX
z) -> FlippedSeal (RepoPatchV2 prim) wX
-> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a. a -> Maybe a
Just (FlippedSeal (RepoPatchV2 prim) wX
-> Maybe (FlippedSeal (RepoPatchV2 prim) wX))
-> FlippedSeal (RepoPatchV2 prim) wX
-> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a b. (a -> b) -> a -> b
$ RepoPatchV2 prim wY wX -> FlippedSeal (RepoPatchV2 prim) wX
forall (a :: * -> * -> *) wX wY. a wX wY -> FlippedSeal a wY
FlippedSeal RepoPatchV2 prim wY wX
z
where
notNullS :: Sealed ((FL prim) wX) -> Bool
notNullS :: 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 :: [Sealed (FL prim wX)] -> Maybe (RL (RepoPatchV2 prim) wX wX)
mergeUnravelled_private [Sealed (FL prim wX)]
xs = let nonNullXs :: [Sealed (FL prim wX)]
nonNullXs = (Sealed (FL prim wX) -> Bool)
-> [Sealed (FL prim wX)] -> [Sealed (FL prim wX)]
forall a. (a -> Bool) -> [a] -> [a]
filter Sealed (FL prim wX) -> Bool
forall (prim :: * -> * -> *) wX. Sealed (FL prim wX) -> Bool
notNullS [Sealed (FL prim wX)]
xs in
FL (RepoPatchV2 prim) wX wX -> RL (RepoPatchV2 prim) wX wX
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL (FL (RepoPatchV2 prim) wX wX -> RL (RepoPatchV2 prim) wX wX)
-> Maybe (FL (RepoPatchV2 prim) wX wX)
-> Maybe (RL (RepoPatchV2 prim) wX wX)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` [Non (RepoPatchV2 prim) wX] -> Maybe (FL (RepoPatchV2 prim) wX wX)
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX] -> Maybe (FL (RepoPatchV2 prim) wX wX)
mergeConflictingNons ((Sealed (FL prim wX) -> Non (RepoPatchV2 prim) wX)
-> [Sealed (FL prim wX)] -> [Non (RepoPatchV2 prim) wX]
forall a b. (a -> b) -> [a] -> [b]
map Sealed (FL prim wX) -> Non (RepoPatchV2 prim) wX
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 :: Sealed (FL prim wX) -> Non (RepoPatchV2 prim) wX
sealed2non (Sealed FL prim wX wX
xs) =
case FL prim wX wX -> RL prim wX wX
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 -> FL (RepoPatchV2 prim) wX wY
-> PrimOf (RepoPatchV2 prim) wY wX -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY wZ.
FL p wX wY -> PrimOf p wY wZ -> Non p wX
Non ((forall wW wY. prim wW wY -> RepoPatchV2 prim wW wY)
-> FL prim wX wY -> FL (RepoPatchV2 prim) 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 wW wY. prim wW wY -> RepoPatchV2 prim wW wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal (FL prim wX wY -> FL (RepoPatchV2 prim) wX wY)
-> FL prim wX wY -> FL (RepoPatchV2 prim) wX wY
forall a b. (a -> b) -> a -> b
$ RL prim wX wY -> FL prim wX wY
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL prim wX wY
ys) prim wY wX
PrimOf (RepoPatchV2 prim) wY wX
y
RL prim wX wX
NilRL -> String -> Non (RepoPatchV2 prim) wX
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 :: [Non (RepoPatchV2 prim) wX] -> Maybe (FL (RepoPatchV2 prim) wX wX)
mergeConflictingNons [Non (RepoPatchV2 prim) wX]
ns = [Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
mcn ([Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX))
-> [Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wX -> Sealed (FL (RepoPatchV2 prim) wX))
-> [Non (RepoPatchV2 prim) wX]
-> [Sealed (FL (RepoPatchV2 prim) wX)]
forall a b. (a -> b) -> [a] -> [b]
map Non (RepoPatchV2 prim) wX -> Sealed (FL (RepoPatchV2 prim) wX)
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 :: [Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
mcn [] = FL (RepoPatchV2 prim) wX wX -> Maybe (FL (RepoPatchV2 prim) wX wX)
forall a. a -> Maybe a
Just FL (RepoPatchV2 prim) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
mcn [Sealed FL (RepoPatchV2 prim) wX wX
p] = case FL (RepoPatchV2 prim) wX wX
-> FL (PrimOf (FL (RepoPatchV2 prim))) wX wX
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 -> FL (RepoPatchV2 prim) wX wX -> Maybe (FL (RepoPatchV2 prim) wX wX)
forall a. a -> Maybe a
Just FL (RepoPatchV2 prim) wX wX
p
FL (PrimOf (FL (RepoPatchV2 prim))) wX wX
_ -> Maybe (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 FL (RepoPatchV2 prim) wX wX
-> FL (RepoPatchV2 prim) wX wX
-> Common (RepoPatchV2 prim) wX wX wX
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 (:\/:) (FL (RepoPatchV2 prim)) (FL (RepoPatchV2 prim)) wX wX
-> (:/\:) (FL (RepoPatchV2 prim)) (FL (RepoPatchV2 prim)) wX wX
forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
merge (FL (RepoPatchV2 prim) wU wX
ps FL (RepoPatchV2 prim) wU wX
-> FL (RepoPatchV2 prim) wU wX
-> (:\/:) (FL (RepoPatchV2 prim)) (FL (RepoPatchV2 prim)) wX wX
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
_ -> [Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)]
-> Maybe (FL (RepoPatchV2 prim) wX wX)
mcn (FL (RepoPatchV2 prim) wX wZ -> Sealed (FL (RepoPatchV2 prim) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (FL (RepoPatchV2 prim) wX wU
c FL (RepoPatchV2 prim) wX wU
-> FL (RepoPatchV2 prim) wU wZ -> FL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wU wX
ps FL (RepoPatchV2 prim) wU wX
-> FL (RepoPatchV2 prim) wX wZ -> FL (RepoPatchV2 prim) wU wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wX wZ
qs')Sealed (FL (RepoPatchV2 prim) wX)
-> [Sealed (FL (RepoPatchV2 prim) wX)]
-> [Sealed (FL (RepoPatchV2 prim) wX)]
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 :: p wX wY -> FL (PrimOf p) wX wY
joinEffects = FL (PrimOf p) wX wY -> FL (PrimOf p) wX wY
forall wA wB. FL (PrimOf p) wA wB -> FL (PrimOf p) wA wB
joinInverses (FL (PrimOf p) wX wY -> FL (PrimOf p) wX wY)
-> (p wX wY -> FL (PrimOf p) wX wY)
-> p wX wY
-> FL (PrimOf p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p wX wY -> FL (PrimOf p) wX wY
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 :: FL (PrimOf p) wA wB -> FL (PrimOf p) wA wB
joinInverses FL (PrimOf p) wA wB
NilFL = FL (PrimOf p) wA wB
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' = FL (PrimOf p) wY wB -> FL (PrimOf p) wY wB
forall wA wB. FL (PrimOf p) wA wB -> FL (PrimOf p) wA wB
joinInverses FL (PrimOf p) wY wB
ps in
FL (PrimOf p) wA wB
-> Maybe (FL (PrimOf p) wA wB) -> FL (PrimOf p) wA wB
forall a. a -> Maybe a -> a
fromMaybe (PrimOf p wA wY
p PrimOf p wA wY -> FL (PrimOf p) wY wB -> FL (PrimOf p) wA wB
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (PrimOf p) wY wB
ps') (Maybe (FL (PrimOf p) wA wB) -> FL (PrimOf p) wA wB)
-> Maybe (FL (PrimOf p) wA wB) -> FL (PrimOf p) wA wB
forall a b. (a -> b) -> a -> b
$ PrimOf p wY wA
-> FL (PrimOf p) wY wB -> Maybe (FL (PrimOf p) wA wB)
forall (p :: * -> * -> *) wX wY wZ.
(Eq2 p, Commute p) =>
p wX wY -> FL p wX wZ -> Maybe (FL p wY wZ)
removeFL (PrimOf p wA wY -> PrimOf p wY wA
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 :: RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wX wY
x = RepoPatchV2 prim wX wY
-> (Doc -> RepoPatchV2 prim wX wY)
-> Maybe Doc
-> RepoPatchV2 prim wX wY
forall b a. b -> (a -> b) -> Maybe a -> b
maybe RepoPatchV2 prim wX wY
x (String -> RepoPatchV2 prim wX wY
forall a. HasCallStack => String -> a
error (String -> RepoPatchV2 prim wX wY)
-> (Doc -> String) -> Doc -> RepoPatchV2 prim wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> String
renderString) (Maybe Doc -> RepoPatchV2 prim wX wY)
-> Maybe Doc -> RepoPatchV2 prim wX wY
forall a b. (a -> b) -> a -> b
$ do
Doc
e <- RepoPatchV2 prim wX wY -> Maybe Doc
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> Maybe Doc
isConsistent RepoPatchV2 prim wX wY
x
Doc -> Maybe Doc
forall a. a -> Maybe a
Just (String -> Doc
redText String
"Inconsistent patch:" Doc -> Doc -> Doc
$$ RepoPatchV2 prim wX wY -> 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 :: 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 = RL (RepoPatchV2 prim) wX wX
-> FL prim wX wY
-> FL (RepoPatchV2 prim) wY wY
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wY)
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 (FL (RepoPatchV2 prim) wX wX -> RL (RepoPatchV2 prim) wX wX
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wX wX
xxx) FL prim wX wY
yyy FL (RepoPatchV2 prim) wY wY
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 :: 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 FL (RepoPatchV2 prim) wZ wA
-> FL (PrimOf (FL (RepoPatchV2 prim))) wZ wA
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 -> (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wY wZ)
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wY wZ)
forall a. a -> Maybe a
Just (FL (RepoPatchV2 prim) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL, (forall wW wY. prim wW wY -> RepoPatchV2 prim wW wY)
-> FL prim wY wZ -> FL (RepoPatchV2 prim) wY wZ
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. prim wW wY -> RepoPatchV2 prim wW wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal FL prim wY wZ
xs)
FL (PrimOf (FL (RepoPatchV2 prim))) wZ wA
_ -> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX 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 (:>) (RepoPatchV2 prim) (FL (RepoPatchV2 prim)) wY wZ
-> Maybe ((:>) (FL (RepoPatchV2 prim)) (RepoPatchV2 prim) wY wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Maybe ((:>) (FL p) p wX wY)
commuteFL (RepoPatchV2 prim wY wY
p RepoPatchV2 prim wY wY
-> FL (RepoPatchV2 prim) wY wZ
-> (:>) (RepoPatchV2 prim) (FL (RepoPatchV2 prim)) wY wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (forall wW wY. prim wW wY -> RepoPatchV2 prim wW wY)
-> FL prim wY wZ -> FL (RepoPatchV2 prim) wY wZ
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. prim wW wY -> RepoPatchV2 prim wW wY
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 wA wB.
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wA wB
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wA wB))
-> (:>) (RL (RepoPatchV2 prim)) (RepoPatchV2 prim) wX wY
-> (:>)
(RL (RepoPatchV2 prim))
(RepoPatchV2 prim :> RL (RepoPatchV2 prim))
wX
wY
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 wA wB.
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wA wB
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wA wB)
forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commuteNoConflicts (RL (RepoPatchV2 prim) wX wY
ps RL (RepoPatchV2 prim) wX wY
-> RepoPatchV2 prim wY wY
-> (:>) (RL (RepoPatchV2 prim)) (RepoPatchV2 prim) wX wY
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') <- RL (RepoPatchV2 prim) wZ wY
-> FL prim wY wZ
-> FL (RepoPatchV2 prim) wZ wA
-> Maybe (FL (RepoPatchV2 prim) wZ wZ, FL (RepoPatchV2 prim) wZ wA)
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 = RL (RepoPatchV2 prim) wX wZ
-> FL (PrimOf (RL (RepoPatchV2 prim))) wX wZ
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 wZ
-> FL (PrimOf (RL (RepoPatchV2 prim))) wX wZ)
-> RL (RepoPatchV2 prim) wX wZ
-> FL (PrimOf (RL (RepoPatchV2 prim))) wX wZ
forall a b. (a -> b) -> a -> b
$ RL (RepoPatchV2 prim) wX wZ
a RL (RepoPatchV2 prim) wX wZ
-> RepoPatchV2 prim wZ wZ -> RL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV2 prim wZ wZ
p'
FL prim wX wZ
NilFL <- FL prim wX wZ -> Maybe (FL prim wX wZ)
forall (m :: * -> *) a. Monad m => a -> m a
return FL prim wX wZ
pa
(FL (RepoPatchV2 prim) wX wZ, FL (RepoPatchV2 prim) wZ wA)
-> Maybe (FL (RepoPatchV2 prim) wX wZ, FL (RepoPatchV2 prim) wZ wA)
forall (m :: * -> *) a. Monad m => a -> m a
return (RL (RepoPatchV2 prim) wX wZ -> FL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL (RepoPatchV2 prim) wX wZ
a RL (RepoPatchV2 prim) wX wZ
-> RepoPatchV2 prim wZ wZ -> RL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV2 prim wZ wZ
p') FL (RepoPatchV2 prim) wX wZ
-> FL (RepoPatchV2 prim) wZ wZ -> FL (RepoPatchV2 prim) wX wZ
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')
Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus`
do FL (RepoPatchV2 prim) wZ wA
NilFL <- FL (RepoPatchV2 prim) wZ wA -> Maybe (FL (RepoPatchV2 prim) wZ wA)
forall (m :: * -> *) a. Monad m => a -> m a
return FL (RepoPatchV2 prim) wZ wA
goneby
FL prim wX wY
NilFL <- FL prim wX wY -> Maybe (FL prim wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (FL prim wX wY -> Maybe (FL prim wX wY))
-> FL prim wX wY -> Maybe (FL prim wX wY)
forall a b. (a -> b) -> a -> b
$ RL (RepoPatchV2 prim) wX wY
-> FL (PrimOf (RL (RepoPatchV2 prim))) wX wY
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 RL (RepoPatchV2 prim) wX wY
-> RepoPatchV2 prim wY wY -> RL (RepoPatchV2 prim) wX wY
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV2 prim wY wY
p)
(FL (RepoPatchV2 prim) wX wY, FL (RepoPatchV2 prim) wY wZ)
-> Maybe (FL (RepoPatchV2 prim) wX wY, FL (RepoPatchV2 prim) wY wZ)
forall (m :: * -> *) a. Monad m => a -> m a
return (RL (RepoPatchV2 prim) wX wY -> FL (RepoPatchV2 prim) wX wY
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL (RepoPatchV2 prim) wX wY
ps RL (RepoPatchV2 prim) wX wY
-> RepoPatchV2 prim wY wY -> RL (RepoPatchV2 prim) wX wY
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV2 prim wY wY
p), (forall wW wY. prim wW wY -> RepoPatchV2 prim wW wY)
-> FL prim wY wZ -> FL (RepoPatchV2 prim) wY wZ
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. prim wW wY -> RepoPatchV2 prim wW wY
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 FL (RepoPatchV2 prim) wY wZ -> Maybe (FL prim wY wZ)
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'' -> 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)
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'' RepoPatchV2 prim wZ wZ
-> FL (RepoPatchV2 prim) wZ wA -> FL (RepoPatchV2 prim) wZ wA
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wZ wA
goneby)
Maybe (FL prim wY wZ)
Nothing ->
case (forall wA wB.
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wA wB
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wA wB))
-> (:>) (RL (RepoPatchV2 prim)) (RepoPatchV2 prim) wX wY
-> (:>)
(RL (RepoPatchV2 prim))
(RepoPatchV2 prim :> RL (RepoPatchV2 prim))
wX
wY
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 wA wB.
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wA wB
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wA wB)
forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commuteNoConflicts (RL (RepoPatchV2 prim) wX wY
ps RL (RepoPatchV2 prim) wX wY
-> RepoPatchV2 prim wY wY
-> (:>) (RL (RepoPatchV2 prim)) (RepoPatchV2 prim) wX wY
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') <- RL (RepoPatchV2 prim) wZ wY
-> FL prim wY wZ
-> FL (RepoPatchV2 prim) wZ wA
-> Maybe (FL (RepoPatchV2 prim) wZ wZ, FL (RepoPatchV2 prim) wZ wA)
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 = RL (RepoPatchV2 prim) wX wZ
-> FL (PrimOf (RL (RepoPatchV2 prim))) wX wZ
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 wZ
-> FL (PrimOf (RL (RepoPatchV2 prim))) wX wZ)
-> RL (RepoPatchV2 prim) wX wZ
-> FL (PrimOf (RL (RepoPatchV2 prim))) wX wZ
forall a b. (a -> b) -> a -> b
$ RL (RepoPatchV2 prim) wX wZ
a RL (RepoPatchV2 prim) wX wZ
-> RepoPatchV2 prim wZ wZ -> RL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV2 prim wZ wZ
p'
FL prim wX wZ
NilFL <- FL prim wX wZ -> Maybe (FL prim wX wZ)
forall (m :: * -> *) a. Monad m => a -> m a
return FL prim wX wZ
pa
(FL (RepoPatchV2 prim) wX wZ, FL (RepoPatchV2 prim) wZ wA)
-> Maybe (FL (RepoPatchV2 prim) wX wZ, FL (RepoPatchV2 prim) wZ wA)
forall (m :: * -> *) a. Monad m => a -> m a
return (RL (RepoPatchV2 prim) wX wZ -> FL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL (RepoPatchV2 prim) wX wZ
a RL (RepoPatchV2 prim) wX wZ
-> RepoPatchV2 prim wZ wZ -> RL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RepoPatchV2 prim wZ wZ
p') FL (RepoPatchV2 prim) wX wZ
-> FL (RepoPatchV2 prim) wZ wZ -> FL (RepoPatchV2 prim) wX wZ
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 :: [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 = ([], FL (RepoPatchV2 prim) wX wY
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' <- (Non (RepoPatchV2 prim) wX -> Maybe (Non (RepoPatchV2 prim) wY))
-> [Non (RepoPatchV2 prim) wX] -> Maybe [Non (RepoPatchV2 prim) wY]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (RepoPatchV2 prim wX wY
-> Non (RepoPatchV2 prim) wX -> Maybe (Non (RepoPatchV2 prim) wY)
forall (p :: * -> * -> *) wX wY.
(Commute p, Invert p, Eq2 p, ToFromPrim p) =>
p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtx (prim wX wY -> RepoPatchV2 prim wX wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
x)) [Non (RepoPatchV2 prim) wX]
ix =
case [Non (RepoPatchV2 prim) wY]
-> FL prim wY wY
-> ([Non (RepoPatchV2 prim) wY], FL (RepoPatchV2 prim) wY wY)
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') -> ( RepoPatchV2 prim wX wY -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non (prim wX wY -> RepoPatchV2 prim wX wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
x) Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a. a -> [a] -> [a]
: (Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wX)
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wX]
forall a b. (a -> b) -> [a] -> [b]
map (RepoPatchV2 prim wX wY
-> Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (prim wX wY -> RepoPatchV2 prim wX wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
x)) [Non (RepoPatchV2 prim) wY]
ns
, prim wX wY -> RepoPatchV2 prim wX wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
x RepoPatchV2 prim wX wY
-> FL (RepoPatchV2 prim) wY wY -> FL (RepoPatchV2 prim) wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wY wY
xs')
geteff [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx =
case [Non (RepoPatchV2 prim) wX] -> Maybe (FL (RepoPatchV2 prim) wX wX)
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 -> String
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
forall a. HasCallStack => String -> a
error (String
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY))
-> String
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
forall a b. (a -> b) -> a -> b
$ Doc -> String
renderString (Doc -> String) -> Doc -> String
forall a b. (a -> b) -> a -> b
$
String -> Doc
redText String
"mergeConflictingNons failed in geteff: ix" Doc -> Doc -> Doc
$$
[Non (RepoPatchV2 prim) wX] -> 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
$$ FL prim wX wY -> 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 FL (RepoPatchV2 prim) wX wX
-> FL prim wX wY
-> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wY)
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) ->
( (Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX)
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a b. (a -> b) -> [a] -> [b]
map (RL (RepoPatchV2 prim) wX wX
-> Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, ToFromPrim p) =>
RL p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtxRL (FL (RepoPatchV2 prim) wX wX -> RL (RepoPatchV2 prim) wX wX
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wX wX
a)) ([Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX])
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a b. (a -> b) -> a -> b
$ FL (RepoPatchV2 prim) wX wY -> [Non (RepoPatchV2 prim) wX]
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 FL (RepoPatchV2 prim) wX wX
-> FL (RepoPatchV2 prim) wX wY -> FL (RepoPatchV2 prim) wX wY
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 ->
String
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
forall a. HasCallStack => String -> a
error (String
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY))
-> String
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
forall a b. (a -> b) -> a -> b
$ Doc -> String
renderString (Doc -> String) -> Doc -> String
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
$$ [Non (RepoPatchV2 prim) wX] -> 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
$$ FL prim wX wY -> 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
$$ FL (RepoPatchV2 prim) wX wX -> 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 :: [Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx = ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
-> [Non (RepoPatchV2 prim) wX]
forall a b. (a, b) -> a
fst (([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
-> [Non (RepoPatchV2 prim) wX])
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
-> [Non (RepoPatchV2 prim) wX]
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
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 :: [Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> FL (RepoPatchV2 prim) wX wY
xx2patches [Non (RepoPatchV2 prim) wX]
ix FL prim wX wY
xx = ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
-> FL (RepoPatchV2 prim) wX wY
forall a b. (a, b) -> b
snd (([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
-> FL (RepoPatchV2 prim) wX wY)
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
-> FL (RepoPatchV2 prim) wX wY
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
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 :: 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 prim wX wY -> FL prim wY wY -> FL prim wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: ) (FL prim wY wY -> FL prim wX wY)
-> Maybe (FL prim wY wY) -> Maybe (FL prim wX wY)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` FL (RepoPatchV2 prim) wY wY -> Maybe (FL prim wY wY)
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 = FL prim wX wX -> Maybe (FL prim wX wX)
forall a. a -> Maybe a
Just FL prim wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
allNormal FL (RepoPatchV2 prim) wX wY
_ = Maybe (FL prim wX wY)
forall a. Maybe a
Nothing
isConsistent :: PrimPatch prim => RepoPatchV2 prim wX wY -> Maybe Doc
isConsistent :: RepoPatchV2 prim wX wY -> Maybe Doc
isConsistent (Normal prim wX wY
_) = Maybe Doc
forall a. Maybe a
Nothing
isConsistent (Duplicate Non (RepoPatchV2 prim) wX
_) = Maybe Doc
forall a. Maybe a
Nothing
isConsistent (Etacilpud Non (RepoPatchV2 prim) wX
_) = Maybe Doc
forall a. Maybe a
Nothing
isConsistent c :: RepoPatchV2 prim wX wY
c@(InvConflictor{}) = RepoPatchV2 prim wY wX -> Maybe Doc
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> Maybe Doc
isConsistent (RepoPatchV2 prim wX wY -> RepoPatchV2 prim wY wX
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 (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wY] -> Bool
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX] -> Bool
everyoneConflicts [Non (RepoPatchV2 prim) wY]
im =
Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Doc -> Maybe Doc) -> Doc -> Maybe Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"Someone doesn't conflict in im in isConsistent"
| Just Non (RepoPatchV2 prim) wX
_ <- FL (RepoPatchV2 prim) wY wX
-> Non (RepoPatchV2 prim) wY -> Maybe (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 =
Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Doc -> Maybe Doc) -> Doc -> Maybe Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"m doesn't conflict with mm in isConsistent"
| (Non (RepoPatchV2 prim) wY -> Bool)
-> [Non (RepoPatchV2 prim) wY] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\Non (RepoPatchV2 prim) wY
x -> (Non (RepoPatchV2 prim) wY -> Bool)
-> [Non (RepoPatchV2 prim) wY] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Non (RepoPatchV2 prim) wY
x Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wY -> Bool
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 =
Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Doc -> Maybe Doc) -> Doc -> Maybe Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"mm conflicts with im in isConsistent where nmm is" Doc -> Doc -> Doc
$$
[Non (RepoPatchV2 prim) wY] -> 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 [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
im) [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wY]
forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` FL (RepoPatchV2 prim) wY wY -> [Non (RepoPatchV2 prim) wY]
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 -> Maybe Doc
forall a. a -> Maybe a
Just (Doc -> Maybe Doc) -> Doc -> Maybe Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"dependencies not in conflict:" Doc -> Doc -> Doc
$$
[Non (RepoPatchV2 prim) wY] -> Doc
forall (p :: * -> * -> *) wX.
(PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons (FL (RepoPatchV2 prim) wY wY -> [Non (RepoPatchV2 prim) wY]
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
$$
FL (RepoPatchV2 prim) wY wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch FL (RepoPatchV2 prim) wY wY
deps
| Bool
otherwise =
case Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY]
-> ([Non (RepoPatchV2 prim) wY], [Non (RepoPatchV2 prim) wY])
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 [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`eqSet` [Non (RepoPatchV2 prim) wY]
im -> Maybe Doc
forall a. Maybe a
Nothing
([Non (RepoPatchV2 prim) wY]
_, [Non (RepoPatchV2 prim) wY]
imnc) -> Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Doc -> Maybe Doc) -> Doc -> Maybe Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
redText (String
"m doesn't conflict with im in "
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"isConsistent. unconflicting:") Doc -> Doc -> Doc
$$
[Non (RepoPatchV2 prim) wY] -> 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) = [Non (RepoPatchV2 prim) wY]
-> FL prim wY wX
-> ([Non (RepoPatchV2 prim) wY], FL (RepoPatchV2 prim) wY wX)
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 :: [Non (RepoPatchV2 prim) wX] -> Bool
everyoneConflicts [] = Bool
True
everyoneConflicts (Non (RepoPatchV2 prim) wX
x : [Non (RepoPatchV2 prim) wX]
xs) = case Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
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') -> [Non (RepoPatchV2 prim) wX] -> Bool
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 :: Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> Sealed (FL prim wX)
mergeWith Non (RepoPatchV2 prim) wX
p [] = forall wX. FL (RepoPatchV2 prim) wX wX -> FL prim wX wX
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (forall wX. FL (RepoPatchV2 prim) wX wX -> FL prim wX wX)
-> Sealed (FL (RepoPatchV2 prim) wX) -> Sealed (FL prim wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
`mapSeal` Non (RepoPatchV2 prim) wX -> Sealed (FL (RepoPatchV2 prim) wX)
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 =
[Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX)
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX)
mergeall ([Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX))
-> ([Non (RepoPatchV2 prim) wX]
-> [Sealed (FL (RepoPatchV2 prim) wX)])
-> [Non (RepoPatchV2 prim) wX]
-> Sealed (FL prim wX)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Non (RepoPatchV2 prim) wX -> Sealed (FL (RepoPatchV2 prim) wX))
-> [Non (RepoPatchV2 prim) wX]
-> [Sealed (FL (RepoPatchV2 prim) wX)]
forall a b. (a -> b) -> [a] -> [b]
map Non (RepoPatchV2 prim) wX -> Sealed (FL (RepoPatchV2 prim) wX)
forall (p :: * -> * -> *) wX.
FromPrim p =>
Non p wX -> Sealed (FL p wX)
unNon ([Non (RepoPatchV2 prim) wX]
-> [Sealed (FL (RepoPatchV2 prim) wX)])
-> ([Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX])
-> [Non (RepoPatchV2 prim) wX]
-> [Sealed (FL (RepoPatchV2 prim) wX)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Non (RepoPatchV2 prim) wX
p Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a. a -> [a] -> [a]
:) ([Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX])
-> ([Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX])
-> [Non (RepoPatchV2 prim) wX]
-> [Non (RepoPatchV2 prim) wX]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
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 ([Non (RepoPatchV2 prim) wX] -> Sealed (FL prim wX))
-> [Non (RepoPatchV2 prim) wX] -> Sealed (FL prim wX)
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 =
(Non (RepoPatchV2 prim) wX -> Bool)
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a. (a -> Bool) -> [a] -> [a]
filter (\Non (RepoPatchV2 prim) wX
x -> Bool -> Bool
not ((Non (RepoPatchV2 prim) wX
p Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
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 Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
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 :: [Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX)
mergeall [Sealed FL (RepoPatchV2 prim) wX wX
x] = FL prim wX wX -> Sealed (FL prim wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (FL prim wX wX -> Sealed (FL prim wX))
-> FL prim wX wX -> Sealed (FL prim wX)
forall a b. (a -> b) -> a -> b
$ FL (RepoPatchV2 prim) wX wX
-> FL (PrimOf (FL (RepoPatchV2 prim))) wX wX
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL (RepoPatchV2 prim) wX wX
x
mergeall [] = FL prim wX wX -> Sealed (FL prim wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed FL prim wX wX
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 (:\/:) (FL (RepoPatchV2 prim)) (FL (RepoPatchV2 prim)) wX wX
-> (:/\:) (FL (RepoPatchV2 prim)) (FL (RepoPatchV2 prim)) wX wX
forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
merge (FL (RepoPatchV2 prim) wX wX
x FL (RepoPatchV2 prim) wX wX
-> FL (RepoPatchV2 prim) wX wX
-> (:\/:) (FL (RepoPatchV2 prim)) (FL (RepoPatchV2 prim)) wX wX
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
_ -> [Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX)
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL (RepoPatchV2 prim) wX)] -> Sealed (FL prim wX)
mergeall (FL (RepoPatchV2 prim) wX wZ -> Sealed (FL (RepoPatchV2 prim) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (FL (RepoPatchV2 prim) wX wX
x FL (RepoPatchV2 prim) wX wX
-> FL (RepoPatchV2 prim) wX wZ -> FL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wX wZ
y') Sealed (FL (RepoPatchV2 prim) wX)
-> [Sealed (FL (RepoPatchV2 prim) wX)]
-> [Sealed (FL (RepoPatchV2 prim) wX)]
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 Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
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 Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
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 :: RepoPatchV2 prim wX wY
-> [IsConflictedPrim (PrimOf (RepoPatchV2 prim))]
conflictedEffect (Duplicate (Non FL (RepoPatchV2 prim) wX wY
_ PrimOf (RepoPatchV2 prim) wY wZ
x)) = [ConflictState -> prim wY wZ -> IsConflictedPrim prim
forall (prim :: * -> * -> *) wX wY.
ConflictState -> prim wX wY -> IsConflictedPrim prim
IsC ConflictState
Duplicated prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
x]
conflictedEffect (Etacilpud Non (RepoPatchV2 prim) wX
_) = String -> [IsConflictedPrim prim]
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)) = [ConflictState -> prim wY wZ -> IsConflictedPrim prim
forall (prim :: * -> * -> *) wX wY.
ConflictState -> prim wX wY -> IsConflictedPrim prim
IsC ConflictState
Conflicted prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
x]
conflictedEffect (InvConflictor{}) = String -> [IsConflictedPrim prim]
forall a. HasCallStack => String -> a
error String
"impossible case"
conflictedEffect (Normal prim wX wY
x) = [ConflictState -> prim wX wY -> IsConflictedPrim prim
forall (prim :: * -> * -> *) wX wY.
ConflictState -> prim wX wY -> IsConflictedPrim prim
IsC ConflictState
Okay prim wX wY
x]
instance PrimPatch prim => Conflict (RepoPatchV2 prim) where
resolveConflicts :: RL (RepoPatchV2 prim) wO wX
-> RL (RepoPatchV2 prim) wX wY
-> [ConflictDetails (PrimOf (RepoPatchV2 prim)) wY]
resolveConflicts RL (RepoPatchV2 prim) wO wX
_ = (Unravelled prim wY -> ConflictDetails prim wY)
-> [Unravelled prim wY] -> [ConflictDetails prim wY]
forall a b. (a -> b) -> [a] -> [b]
map Unravelled prim wY -> ConflictDetails prim wY
forall (prim :: * -> * -> *) wX.
PrimMangleUnravelled prim =>
Unravelled prim wX -> ConflictDetails prim wX
mangleOrFail ([Unravelled prim wY] -> [ConflictDetails prim wY])
-> (RL (RepoPatchV2 prim) wX wY -> [Unravelled prim wY])
-> RL (RepoPatchV2 prim) wX wY
-> [ConflictDetails prim wY]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall wA wB.
RepoPatchV2 prim wA wB
-> [Unravelled (PrimOf (RepoPatchV2 prim)) wB])
-> RL (RepoPatchV2 prim) wX wY
-> [Unravelled (PrimOf (RepoPatchV2 prim)) wY]
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)]]
forall wA wB.
RepoPatchV2 prim wA wB
-> [Unravelled (PrimOf (RepoPatchV2 prim)) wB]
resolveOne
where
resolveOne :: RepoPatchV2 prim wX wY -> [[Sealed (FL prim wY)]]
resolveOne :: 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 = [Sealed (FL prim wY)] -> [Sealed (FL prim wY)]
forall a. Eq a => [a] -> [a]
nub ([Sealed (FL prim wY)] -> [Sealed (FL prim wY)])
-> [Sealed (FL prim wY)] -> [Sealed (FL prim wY)]
forall a b. (a -> b) -> a -> b
$ (Sealed (FL prim wY) -> Bool)
-> [Sealed (FL prim wY)] -> [Sealed (FL prim wY)]
forall a. (a -> Bool) -> [a] -> [a]
filter Sealed (FL prim wY) -> Bool
forall (prim :: * -> * -> *) wX. Sealed (FL prim wX) -> Bool
isCons ([Sealed (FL prim wY)] -> [Sealed (FL prim wY)])
-> [Sealed (FL prim wY)] -> [Sealed (FL prim wY)]
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wY -> Sealed (FL prim wY))
-> [Non (RepoPatchV2 prim) wY] -> [Sealed (FL prim wY)]
forall a b. (a -> b) -> [a] -> [b]
map (Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> Sealed (FL prim wY)
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 Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
ix [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
nonxx
nonxx :: [Non (RepoPatchV2 prim) wY]
nonxx = RL (RepoPatchV2 prim) wY wX -> [Non (RepoPatchV2 prim) wY]
forall wX wY.
RL (RepoPatchV2 prim) wX wY -> [Non (RepoPatchV2 prim) wX]
nonxx_ (FL (RepoPatchV2 prim) wY wX -> RL (RepoPatchV2 prim) wY wX
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL (FL (RepoPatchV2 prim) wY wX -> RL (RepoPatchV2 prim) wY wX)
-> FL (RepoPatchV2 prim) wY wX -> RL (RepoPatchV2 prim) wY wX
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wY]
-> FL prim wY wX -> FL (RepoPatchV2 prim) wY wX
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_ :: RL (RepoPatchV2 prim) wX wY -> [Non (RepoPatchV2 prim) wX]
nonxx_ (RL (RepoPatchV2 prim) wX wY
qs :<: Normal prim wY wY
q) = [FL (RepoPatchV2 prim) wX wY
-> PrimOf (RepoPatchV2 prim) wY wY -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY wZ.
FL p wX wY -> PrimOf p wY wZ -> Non p wX
Non (RL (RepoPatchV2 prim) wX wY -> FL (RepoPatchV2 prim) wX wY
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL (RepoPatchV2 prim) wX wY
qs) prim wY wY
PrimOf (RepoPatchV2 prim) wY wY
q]
nonxx_ RL (RepoPatchV2 prim) wX wY
_ = []
isCons :: Sealed (FL a wX) -> Bool
isCons = (forall wX. FL a wX wX -> Bool) -> Sealed (FL a wX) -> Bool
forall (a :: * -> *) b. (forall wX. a wX -> b) -> Sealed a -> b
unseal (Bool -> Bool
not (Bool -> Bool) -> (FL a wX wX -> Bool) -> FL a wX wX -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL a wX wX -> Bool
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Bool
nullFL)
instance PrimPatch prim => Unwind (RepoPatchV2 prim) where
fullUnwind :: RepoPatchV2 prim wX wY -> Unwound (PrimOf (RepoPatchV2 prim)) wX wY
fullUnwind (Normal prim wX wY
p) =
FL prim wX wX
-> FL prim wX wY -> FL prim wY wY -> Unwound prim wX wY
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 FL prim wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL (prim wX wY
p prim wX wY -> FL prim wY wY -> FL prim wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) FL prim wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
fullUnwind (Duplicate (Non FL (RepoPatchV2 prim) wX wY
ps PrimOf (RepoPatchV2 prim) wY wZ
p)) =
FL prim wX wY
-> FL prim wY wZ -> FL prim wZ wX -> Unwound prim wX wX
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 (FL (RepoPatchV2 prim) wX wY
-> FL (PrimOf (FL (RepoPatchV2 prim))) wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL (RepoPatchV2 prim) wX wY
ps) (prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
p prim wY wZ -> FL prim wZ wZ -> FL prim wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wZ wZ
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (prim wY wZ -> prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
p prim wZ wY -> FL prim wY wX -> FL prim wZ wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wY wX
-> FL (PrimOf (FL (RepoPatchV2 prim))) wY wX
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (FL (RepoPatchV2 prim) wX wY -> FL (RepoPatchV2 prim) wY wX
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)) =
FL prim wX wY
-> FL prim wY wZ -> FL prim wZ wY -> Unwound prim wX wY
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 (FL prim wY wX -> FL prim wX wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wY wX
es FL prim wX wY -> FL prim wY wY -> FL prim wX wY
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RepoPatchV2 prim) wY wY
-> FL (PrimOf (FL (RepoPatchV2 prim))) wY wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL (RepoPatchV2 prim) wY wY
ps) (prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
p prim wY wZ -> FL prim wZ wZ -> FL prim wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wZ wZ
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (prim wY wZ -> prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
p prim wZ wY -> FL prim wY wY -> FL prim wZ wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wY wY
-> FL (PrimOf (FL (RepoPatchV2 prim))) wY wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (FL (RepoPatchV2 prim) wY wY -> FL (RepoPatchV2 prim) wY wY
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) =
Unwound prim wX wX -> Unwound prim wX wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (RepoPatchV2 prim wX wX -> Unwound (PrimOf (RepoPatchV2 prim)) wX wX
forall (p :: * -> * -> *) wX wY.
Unwind p =>
p wX wY -> Unwound (PrimOf p) wX wY
fullUnwind (Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
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) =
Unwound prim wY wX -> Unwound prim wX wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (RepoPatchV2 prim wY wX -> Unwound (PrimOf (RepoPatchV2 prim)) wY wX
forall (p :: * -> * -> *) wX wY.
Unwind p =>
p wX wY -> Unwound (PrimOf p) wX wY
fullUnwind ([Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
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 :: (:>) (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
_)) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ)
forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
d2 RepoPatchV2 prim wZ wY
-> RepoPatchV2 prim wY wZ
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
RepoPatchV2 prim wY 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
_)) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ)
forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
d RepoPatchV2 prim wZ wY
-> RepoPatchV2 prim wY wZ
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
RepoPatchV2 prim wY 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
_)) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ)
forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
e RepoPatchV2 prim wZ wY
-> RepoPatchV2 prim wY wZ
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
RepoPatchV2 prim wY 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
_)) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ)
forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
e2 RepoPatchV2 prim wZ wY
-> RepoPatchV2 prim wY wZ
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wX wZ
RepoPatchV2 prim wY 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 Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wZ -> Bool
forall a. Eq a => a -> a -> Bool
== RepoPatchV2 prim wZ wX
-> Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wZ
forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (RepoPatchV2 prim wX wZ -> RepoPatchV2 prim wZ wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wX wZ
x) (RepoPatchV2 prim wX wZ -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non RepoPatchV2 prim wX wZ
x)
then (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. a -> Maybe a
Just (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
orig
else do Non (RepoPatchV2 prim) wX
d' <- RepoPatchV2 prim wZ wX
-> Non (RepoPatchV2 prim) wZ -> Maybe (Non (RepoPatchV2 prim) wX)
forall (p :: * -> * -> *) wX wY.
(Commute p, Invert p, Eq2 p, ToFromPrim p) =>
p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtx (RepoPatchV2 prim wX wZ -> RepoPatchV2 prim wZ wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wX wZ
x) Non (RepoPatchV2 prim) wZ
d
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wZ
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wZ)
forall (m :: * -> *) a. Monad m => a -> m a
return (Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
d' RepoPatchV2 prim wX wX
-> RepoPatchV2 prim wX wZ
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wZ
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) =
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wY)
forall a. a -> Maybe a
Just (RepoPatchV2 prim wZ wY
x RepoPatchV2 prim wZ wY
-> RepoPatchV2 prim wY wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> Non (RepoPatchV2 prim) wY -> RepoPatchV2 prim wY wY
forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate (RepoPatchV2 prim wY wZ
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wY
forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (RepoPatchV2 prim wZ wY -> RepoPatchV2 prim wY wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wZ wY
x) Non (RepoPatchV2 prim) wX
Non (RepoPatchV2 prim) wZ
d))
commuteNoConflicts c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(Etacilpud Non (RepoPatchV2 prim) wX
_ :> RepoPatchV2 prim wZ wY
_) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX 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
_) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX 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 (Normal prim wX wZ
x :> Normal prim wZ wY
y) = do
prim wX wZ
y' :> prim wZ wY
x' <- (:>) prim prim wX wY -> Maybe ((:>) prim prim wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (prim wX wZ
x prim wX wZ -> prim wZ wY -> (:>) prim prim wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> prim wZ wY
y)
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (prim wX wZ -> RepoPatchV2 prim wX wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wZ
y' RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> prim wZ wY -> RepoPatchV2 prim wZ 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' <- (:>) prim (FL prim) wX wY -> Maybe ((:>) (FL prim) prim wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Maybe ((:>) (FL p) p wX wY)
commuteFL (prim wX wZ
x prim wX wZ -> FL prim wZ wY -> (:>) prim (FL prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wY wZ -> FL prim wZ 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' <- (Non (RepoPatchV2 prim) wY -> Maybe (Non (RepoPatchV2 prim) wZ))
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wZ]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (prim wZ wY -> RepoPatchV2 prim wZ wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wZ wY
x' RepoPatchV2 prim wZ wY
-> Non (RepoPatchV2 prim) wY -> Maybe (Non (RepoPatchV2 prim) wZ)
forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Maybe (Non p wX)
>*) (Non (RepoPatchV2 prim) wY
y Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
iy)
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wX
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wX wZ
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 wX wZ -> FL prim wZ wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wX wZ
iyy') Non (RepoPatchV2 prim) wZ
y' RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> prim wZ wY -> RepoPatchV2 prim wZ 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
_) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX 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' <- (Non (RepoPatchV2 prim) wZ -> Maybe (Non (RepoPatchV2 prim) wY))
-> [Non (RepoPatchV2 prim) wZ] -> Maybe [Non (RepoPatchV2 prim) wY]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wZ wY -> Maybe (Non (RepoPatchV2 prim) wY)
forall (p :: * -> * -> *) wX wY.
(Commute p, Invert p, ToFromPrim p) =>
Non p wX -> p wX wY -> Maybe (Non p wY)
*> prim wZ wY -> RepoPatchV2 prim wZ wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wZ wY
x) (Non (RepoPatchV2 prim) wZ
y Non (RepoPatchV2 prim) wZ
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wZ]
iy)
prim wX wZ
x' :> RL prim wZ wY
iyy' <- (:>) (RL prim) prim wX wY -> Maybe ((:>) prim (RL prim) wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) (RL p) p wX wY -> Maybe ((:>) p (RL p) wX wY)
commuteRL (FL prim wZ wX -> RL prim wX wZ
forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL prim wZ wX
yy RL prim wX wZ -> prim wZ wY -> (:>) (RL prim) prim wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> prim wZ wY
x)
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (prim wX wZ -> RepoPatchV2 prim wX wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wZ
x' RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wZ 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' (RL prim wZ wY -> FL prim wY wZ
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{}) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX 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]
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' <- (:>) (FL prim) (FL prim) wY wX
-> Maybe ((:>) (FL prim) (FL prim) wY wX)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (FL prim wY wZ
yy FL prim wY wZ -> FL prim wZ wX -> (:>) (FL prim) (FL prim) wY wX
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' <- (Non (RepoPatchV2 prim) wZ -> Maybe (Non (RepoPatchV2 prim) wY))
-> [Non (RepoPatchV2 prim) wZ] -> Maybe [Non (RepoPatchV2 prim) wY]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (FL prim wY wZ
FL (PrimOf (RepoPatchV2 prim)) wY wZ
yy FL (PrimOf (RepoPatchV2 prim)) wY wZ
-> Non (RepoPatchV2 prim) wZ -> Maybe (Non (RepoPatchV2 prim) wY)
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
xNon (RepoPatchV2 prim) wZ
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
ix)
Non (RepoPatchV2 prim) wZ
y':[Non (RepoPatchV2 prim) wZ]
iy' <- (Non (RepoPatchV2 prim) wY -> Maybe (Non (RepoPatchV2 prim) wZ))
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wZ]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Non (RepoPatchV2 prim) wY
-> FL (PrimOf (RepoPatchV2 prim)) wY wZ
-> Maybe (Non (RepoPatchV2 prim) wZ)
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
FL (PrimOf (RepoPatchV2 prim)) wY wZ
xx') (Non (RepoPatchV2 prim) wY
yNon (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wY]
iy)
Bool
False <- Bool -> Maybe Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wY -> Bool)
-> [Non (RepoPatchV2 prim) wY] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wY -> Bool
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'Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wY]
ix')
Bool
False <- Bool -> Maybe Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wY -> Bool)
-> [Non (RepoPatchV2 prim) wY] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wY -> Bool
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
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wX
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wX wZ
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' RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wZ 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{}) =
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX 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 (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' <- (:>) (FL prim) (FL prim) wX wY
-> Maybe ((:>) (FL prim) (FL prim) wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (FL prim wX wZ
xx FL prim wX wZ -> FL prim wZ wY -> (:>) (FL prim) (FL prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wY wZ -> FL prim wZ 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' <- (Non (RepoPatchV2 prim) wY -> Maybe (Non (RepoPatchV2 prim) wZ))
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wZ]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (FL prim wZ wY
FL (PrimOf (RepoPatchV2 prim)) wZ wY
xx' FL (PrimOf (RepoPatchV2 prim)) wZ wY
-> Non (RepoPatchV2 prim) wY -> Maybe (Non (RepoPatchV2 prim) wZ)
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
yNon (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wY]
iy)
Non (RepoPatchV2 prim) wZ
x':[Non (RepoPatchV2 prim) wZ]
ix' <- (Non (RepoPatchV2 prim) wX -> Maybe (Non (RepoPatchV2 prim) wZ))
-> [Non (RepoPatchV2 prim) wX] -> Maybe [Non (RepoPatchV2 prim) wZ]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (FL prim wX wZ -> RL prim wZ wX
forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL prim wX wZ
iyy' RL (PrimOf (RepoPatchV2 prim)) wZ wX
-> Non (RepoPatchV2 prim) wX -> Maybe (Non (RepoPatchV2 prim) wZ)
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
xNon (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wX]
ix)
Bool
False <- Bool -> Maybe Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wZ -> Bool)
-> [Non (RepoPatchV2 prim) wZ] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wZ -> Bool
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'Non (RepoPatchV2 prim) wZ
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
ix')
Bool
False <- Bool -> Maybe Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wZ -> Bool)
-> [Non (RepoPatchV2 prim) wZ] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wZ -> Bool
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'
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wX
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wX wZ
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 wX wZ -> FL prim wZ wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wX wZ
iyy') Non (RepoPatchV2 prim) wZ
y' RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wY
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wZ 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 <- (:>) (FL prim) (FL prim) wX wY
-> Maybe ((:>) (FL prim) (FL prim) wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (FL prim wZ wX -> FL prim wX wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wZ wX
yy' FL prim wX wZ -> FL prim wZ wY -> (:>) (FL prim) (FL prim) wX wY
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 <- (Non (RepoPatchV2 prim) wZ -> Maybe (Non (RepoPatchV2 prim) wY))
-> [Non (RepoPatchV2 prim) wZ] -> Maybe [Non (RepoPatchV2 prim) wY]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Non (RepoPatchV2 prim) wZ
-> FL (PrimOf (RepoPatchV2 prim)) wZ wY
-> Maybe (Non (RepoPatchV2 prim) wY)
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
FL (PrimOf (RepoPatchV2 prim)) wZ wY
xx') (Non (RepoPatchV2 prim) wZ
y'Non (RepoPatchV2 prim) wZ
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
iy')
Non (RepoPatchV2 prim) wX
x:[Non (RepoPatchV2 prim) wX]
ix <- (Non (RepoPatchV2 prim) wZ -> Maybe (Non (RepoPatchV2 prim) wX))
-> [Non (RepoPatchV2 prim) wZ] -> Maybe [Non (RepoPatchV2 prim) wX]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Non (RepoPatchV2 prim) wZ
-> FL (PrimOf (RepoPatchV2 prim)) wZ wX
-> Maybe (Non (RepoPatchV2 prim) wX)
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
FL (PrimOf (RepoPatchV2 prim)) wZ wX
yy') (Non (RepoPatchV2 prim) wZ
x'Non (RepoPatchV2 prim) wZ
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
ix')
Bool
False <- Bool -> Maybe Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wZ -> Bool)
-> [Non (RepoPatchV2 prim) wZ] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wZ -> Bool
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'Non (RepoPatchV2 prim) wZ
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. a -> [a] -> [a]
:[Non (RepoPatchV2 prim) wZ]
ix')
Bool
False <- Bool -> Maybe Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wZ -> Bool)
-> [Non (RepoPatchV2 prim) wZ] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wZ -> Bool
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'
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Non (RepoPatchV2 prim) wX]
-> FL prim wX wZ
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wX wZ
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 RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wZ 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 (FL prim wZ wY -> FL prim wY wZ
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 :: RepoPatchV2 prim wX wY -> Maybe Doc
isInconsistent = RepoPatchV2 prim wX wY -> Maybe Doc
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> Maybe Doc
isConsistent
type instance PatchId (RepoPatchV2 prim) = ()
instance FromPrim (RepoPatchV2 prim) where
fromAnonymousPrim :: PrimOf (RepoPatchV2 prim) wX wY -> RepoPatchV2 prim wX wY
fromAnonymousPrim = PrimOf (RepoPatchV2 prim) wX wY -> RepoPatchV2 prim wX wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal
instance ToPrim (RepoPatchV2 prim) where
toPrim :: RepoPatchV2 prim wX wY -> Maybe (PrimOf (RepoPatchV2 prim) wX wY)
toPrim (Normal prim wX wY
p) = prim wX wY -> Maybe (prim wX wY)
forall a. a -> Maybe a
Just prim wX wY
p
toPrim RepoPatchV2 prim wX wY
_ = Maybe (PrimOf (RepoPatchV2 prim) wX wY)
forall a. Maybe a
Nothing
instance PrimPatch prim => Eq2 (RepoPatchV2 prim) where
(Duplicate Non (RepoPatchV2 prim) wA
x) =\/= :: RepoPatchV2 prim wA wB -> RepoPatchV2 prim wA wC -> EqCheck wB wC
=\/= (Duplicate Non (RepoPatchV2 prim) wA
y) | Non (RepoPatchV2 prim) wA
x Non (RepoPatchV2 prim) wA -> Non (RepoPatchV2 prim) wA -> Bool
forall a. Eq a => a -> a -> Bool
== Non (RepoPatchV2 prim) wA
y = EqCheck wB wC
forall wA. EqCheck wA wA
IsEq
(Etacilpud Non (RepoPatchV2 prim) wA
x) =\/= (Etacilpud Non (RepoPatchV2 prim) wA
y) | Non (RepoPatchV2 prim) wA
x Non (RepoPatchV2 prim) wA -> Non (RepoPatchV2 prim) wA -> Bool
forall a. Eq a => a -> a -> Bool
== Non (RepoPatchV2 prim) wA
y = EqCheck wB wC
forall wA. EqCheck wA wA
IsEq
(Normal prim wA wB
x) =\/= (Normal prim wA wC
y) = prim wA wB
x prim wA wB -> prim wA wC -> EqCheck wB wC
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)
| (Non (RepoPatchV2 prim) wB -> Non (RepoPatchV2 prim) wA)
-> [Non (RepoPatchV2 prim) wB] -> [Non (RepoPatchV2 prim) wA]
forall a b. (a -> b) -> [a] -> [b]
map Non (RepoPatchV2 prim) wB -> Non (RepoPatchV2 prim) wA
commuteOrAddIXX [Non (RepoPatchV2 prim) wB]
cx [Non (RepoPatchV2 prim) wA] -> [Non (RepoPatchV2 prim) wA] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`eqSet` (Non (RepoPatchV2 prim) wC -> Non (RepoPatchV2 prim) wA)
-> [Non (RepoPatchV2 prim) wC] -> [Non (RepoPatchV2 prim) wA]
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 Non (RepoPatchV2 prim) wA -> Non (RepoPatchV2 prim) wA -> Bool
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 FL prim wB wA -> FL prim wC wA -> EqCheck wB wC
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 = RL (PrimOf (RepoPatchV2 prim)) wA wB
-> Non (RepoPatchV2 prim) wB -> Non (RepoPatchV2 prim) wA
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 wB wA -> RL prim wA wB
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 = RL (PrimOf (RepoPatchV2 prim)) wA wC
-> Non (RepoPatchV2 prim) wC -> Non (RepoPatchV2 prim) wA
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 wC wA -> RL prim wA wC
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 [Non (RepoPatchV2 prim) wA] -> [Non (RepoPatchV2 prim) wA] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`eqSet` [Non (RepoPatchV2 prim) wA]
cy Bool -> Bool -> Bool
&& Non (RepoPatchV2 prim) wA
x Non (RepoPatchV2 prim) wA -> Non (RepoPatchV2 prim) wA -> Bool
forall a. Eq a => a -> a -> Bool
== Non (RepoPatchV2 prim) wA
y = FL prim wA wB
xx FL prim wA wB -> FL prim wA wC -> EqCheck wB wC
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
_ = EqCheck wB wC
forall wA wB. EqCheck wA wB
NotEq
eqSet :: Eq a => [a] -> [a] -> Bool
eqSet :: [a] -> [a] -> Bool
eqSet [] [] = Bool
True
eqSet (a
x:[a]
xs) [a]
xys | Just [a]
ys <- a -> [a] -> Maybe [a]
forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
x [a]
xys = [a] -> [a] -> Bool
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 :: a -> [a] -> Maybe [a]
remove1 a
x (a
y : [a]
ys) = if a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y then [a] -> Maybe [a]
forall a. a -> Maybe a
Just [a]
ys else (a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
:) ([a] -> [a]) -> Maybe [a] -> Maybe [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` a -> [a] -> Maybe [a]
forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
x [a]
ys
remove1 a
_ [] = Maybe [a]
forall a. Maybe a
Nothing
minus :: Eq a => [a] -> [a] -> Maybe [a]
minus :: [a] -> [a] -> Maybe [a]
minus [a]
xs [] = [a] -> Maybe [a]
forall a. a -> Maybe a
Just [a]
xs
minus [a]
xs (a
y:[a]
ys) = do [a]
xs' <- a -> [a] -> Maybe [a]
forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
y [a]
xs
[a]
xs' [a] -> [a] -> Maybe [a]
forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` [a]
ys
invertNon :: PrimPatch prim => Non (RepoPatchV2 prim) wX
-> Non (RepoPatchV2 prim) wX
invertNon :: 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' <- RepoPatchV2 prim wZ wY
-> RL (RepoPatchV2 prim) wX wY
-> Maybe (RL (RepoPatchV2 prim) wX wZ)
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 (FL (RepoPatchV2 prim) wX wY -> RL (RepoPatchV2 prim) wX wY
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wX wY
c) = FL (RepoPatchV2 prim) wX wZ
-> PrimOf (RepoPatchV2 prim) wZ wY -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY wZ.
FL p wX wY -> PrimOf p wY wZ -> Non p wX
Non (RL (RepoPatchV2 prim) wX wZ -> FL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL (RepoPatchV2 prim) wX wZ
rc') (prim wY wZ -> prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
x)
| Bool
otherwise = RL (RepoPatchV2 prim) wX wZ
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, ToFromPrim p) =>
RL p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtxRL (FL (RepoPatchV2 prim) wX wY -> RL (RepoPatchV2 prim) wX wY
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL (RepoPatchV2 prim) wX wY
c RL (RepoPatchV2 prim) wX wY
-> RepoPatchV2 prim wY wZ -> RL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: prim wY wZ -> RepoPatchV2 prim wY wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
x) (Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wX)
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wX
forall a b. (a -> b) -> a -> b
$ RepoPatchV2 prim wZ wY -> Non (RepoPatchV2 prim) wZ
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 = prim wZ wY -> RepoPatchV2 prim wZ wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal (prim wZ wY -> RepoPatchV2 prim wZ wY)
-> prim wZ wY -> RepoPatchV2 prim wZ wY
forall a b. (a -> b) -> a -> b
$ prim wY wZ -> prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
x
nonTouches :: PatchInspect prim => Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches :: Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches (Non FL (RepoPatchV2 prim) wX wY
c PrimOf (RepoPatchV2 prim) wY wZ
x) = FL (RepoPatchV2 prim) wX wZ -> [AnchoredPath]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [AnchoredPath]
listTouchedFiles (FL (RepoPatchV2 prim) wX wY
c FL (RepoPatchV2 prim) wX wY
-> FL (RepoPatchV2 prim) wY wZ -> FL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ prim wY wZ -> RepoPatchV2 prim wY wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
x RepoPatchV2 prim wY wZ
-> FL (RepoPatchV2 prim) wZ wZ -> FL (RepoPatchV2 prim) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wZ wZ
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
nonHunkMatches :: PatchInspect prim => (BC.ByteString -> Bool)
-> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches :: (ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f (Non FL (RepoPatchV2 prim) wX wY
c PrimOf (RepoPatchV2 prim) wY wZ
x) = (ByteString -> Bool) -> FL (RepoPatchV2 prim) wX wY -> Bool
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
|| (ByteString -> Bool) -> prim wY wZ -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f prim wY wZ
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 :: FL p wX wY -> [Non p wX]
toNons FL p wX wY
xs = (Sealed ((:>) p (FL p) wX) -> Non p wX)
-> [Sealed ((:>) p (FL p) wX)] -> [Non p wX]
forall a b. (a -> b) -> [a] -> [b]
map Sealed ((:>) p (FL p) wX) -> Non p wX
lastNon ([Sealed ((:>) p (FL p) wX)] -> [Non p wX])
-> [Sealed ((:>) p (FL p) wX)] -> [Non p wX]
forall a b. (a -> b) -> a -> b
$ FL p wX wY -> [Sealed ((:>) p (FL p) wX)]
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 (:>) p (FL p) wX wX -> (:>) (RL p) (p :> RL p) wX wX
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 p wZ wZ -> Non p wZ
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 -> FL p wX wZ -> PrimOf p wZ wZ -> Non p wX
forall (p :: * -> * -> *) wX wY wZ.
FL p wX wY -> PrimOf p wY wZ -> Non p wX
Non (RL p wX wZ -> FL p wX wZ
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL p wX wZ
deps) PrimOf p wZ wZ
PrimOf p wY wZ
pp
Non FL p wZ wY
ds PrimOf p wY wZ
pp ->
String -> Non p wX
forall a. HasCallStack => String -> a
error (String -> Non p wX) -> String -> Non p wX
forall a b. (a -> b) -> a -> b
$ Doc -> String
renderString (Doc -> String) -> Doc -> String
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 -> FL p wX wX -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch (p wX wZ
z p wX wZ -> FL p wZ wX -> FL p wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL p wZ wX
zs)) Doc -> Doc -> Doc
$$
String -> Doc
redText String
"ds are" Doc -> Doc -> Doc
$$ FL p wZ wY -> 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
$$ PrimOf p wY wZ -> 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 :: (:>) p (FL p) wX wZ -> (:>) (RL p) p wX wZ
reverseFoo (p wX wZ
p :> FL p wZ wZ
ps) = RL p wX wX -> p wX wZ -> FL p wZ wZ -> (:>) (RL p) p wX wZ
forall wA wB wC wD.
RL p wA wB -> p wB wC -> FL p wC wD -> (:>) (RL p) p wA wD
rf RL p wX wX
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 :: 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 RL p wA wB -> p wB wC -> (:>) (RL p) p wA wC
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) = RL p wA wC -> p wC wY -> FL p wY wD -> (:>) (RL p) p wA wD
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 RL p wA wB -> p wB wC -> RL p wA wC
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY 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 :: (:>) p (FL p) wX wZ -> (:>) (RL p) (p :> RL p) wX wZ
lastNon_aux = (:>) (RL p) p wX wZ -> (:>) (RL p) (p :> RL p) wX wZ
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) (RL p) p wX wY -> (:>) (RL p) (p :> RL p) wX wY
commuteWhatWeCanRL ((:>) (RL p) p wX wZ -> (:>) (RL p) (p :> RL p) wX wZ)
-> ((:>) p (FL p) wX wZ -> (:>) (RL p) p wX wZ)
-> (:>) p (FL p) wX wZ
-> (:>) (RL p) (p :> RL p) wX wZ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) p (FL p) wX wZ -> (:>) (RL p) p wX wZ
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 :: Non (RepoPatchV2 prim) wX
-> FL prim wX wY -> (:>) (FL prim) (FL prim) wX wY
filterConflictsFL Non (RepoPatchV2 prim) wX
_ FL prim wX wY
NilFL = FL prim wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL prim wX wX -> FL prim wX wX -> (:>) (FL prim) (FL prim) wX wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wX wX
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' <- RepoPatchV2 prim wX wY
-> Non (RepoPatchV2 prim) wX -> Maybe (Non (RepoPatchV2 prim) wY)
forall (p :: * -> * -> *) wX wY.
(Commute p, Invert p, Eq2 p, ToFromPrim p) =>
p wX wY -> Non p wX -> Maybe (Non p wY)
commuteOrRemFromCtx (prim wX wY -> RepoPatchV2 prim wX wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wY
p) Non (RepoPatchV2 prim) wX
n =
case Non (RepoPatchV2 prim) wY
-> FL prim wY wY -> (:>) (FL prim) (FL prim) wY wY
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 prim wX wY -> FL prim wY wZ -> FL prim wX wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wY wZ
p1 FL prim wX wZ -> FL prim wZ wY -> (:>) (FL prim) (FL prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wZ wY
p2
| Bool
otherwise = case (:>) prim (FL prim) wX wY -> (:>) (FL prim) (prim :> FL prim) wX wY
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> (:>) (FL p) (p :> FL p) wX wY
commuteWhatWeCanFL (prim wX wY
p prim wX wY -> FL prim wY wY -> (:>) prim (FL prim) wX wY
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 Non (RepoPatchV2 prim) wX
-> FL prim wX wZ -> (:>) (FL prim) (FL prim) wX wZ
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 FL prim wX wZ -> FL prim wZ wY -> (:>) (FL prim) (FL prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL prim wZ wZ
p1b FL prim wZ wZ -> FL prim wZ wY -> FL prim wZ wY
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ prim wZ wZ
p' prim wZ wZ -> FL prim wZ wY -> FL prim wZ wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wZ wY
p2
instance Invert prim => Invert (RepoPatchV2 prim) where
invert :: RepoPatchV2 prim wX wY -> RepoPatchV2 prim wY wX
invert (Duplicate Non (RepoPatchV2 prim) wX
d) = Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Etacilpud Non (RepoPatchV2 prim) wX
d
invert (Etacilpud Non (RepoPatchV2 prim) wX
d) = Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
d
invert (Normal prim wX wY
p) = prim wY wX -> RepoPatchV2 prim wY wX
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal (prim wX wY -> prim wY wX
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) = [Non (RepoPatchV2 prim) wY]
-> FL prim wY wX
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wY wX
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) = [Non (RepoPatchV2 prim) wX]
-> FL prim wX wY
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wY wX
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 :: CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
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' <- prim wX wZ -> RL prim wY wZ -> Maybe (RL prim wY wX)
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 (FL prim wY wZ -> RL prim wY wZ
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 = [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. [a] -> [a]
reverse ([Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY])
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ -> [Non (RepoPatchV2 prim) wY]
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 (FL prim wY wZ -> [Non (RepoPatchV2 prim) wY])
-> FL prim wY wZ -> [Non (RepoPatchV2 prim) wY]
forall a b. (a -> b) -> a -> b
$ RL prim wY wZ -> FL prim wY wZ
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL prim wY wX
rn1' RL prim wY wX -> prim wX wZ -> RL prim wY wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: prim wX wZ
x)
a2 :: [Non (RepoPatchV2 prim) wY]
a2 = Non (RepoPatchV2 prim) wY
p1' Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
a1'nop2 [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
n1nons
case ([Non (RepoPatchV2 prim) wY]
a1'nop2, RL prim wY wX -> FL prim wY wX
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 <- FL (RepoPatchV2 prim) wY wY
-> FL (PrimOf (FL (RepoPatchV2 prim))) wY wY
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 ->
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. a -> Maybe a
Just (prim wX wZ -> RepoPatchV2 prim wX wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wZ
PrimOf (RepoPatchV2 prim) wY wZ
y RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wZ 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 (prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
y prim wY wZ -> FL prim wZ wZ -> FL prim wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wZ 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
_) ->
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. a -> Maybe a
Just ([Non (RepoPatchV2 prim) wY]
-> FL prim wY wX
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim 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 FL prim wY wX
n1 Non (RepoPatchV2 prim) wY
p1' RepoPatchV2 prim wX wY
-> RepoPatchV2 prim wY wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> [Non (RepoPatchV2 prim) wY]
-> FL prim wY wY
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wY 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 FL prim wY wY
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
_) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX 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 <- Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wY]
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 Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wY -> Bool
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 = (Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wY)
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wY]
forall a b. (a -> b) -> [a] -> [b]
map (FL (PrimOf (RepoPatchV2 prim)) wY wZ
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wY
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
FL (PrimOf (RepoPatchV2 prim)) wY wZ
n2) ([Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wY])
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wY]
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wX -> [Non (RepoPatchV2 prim) wZ]
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 = [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ -> [Non (RepoPatchV2 prim) wY]
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 [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wY]
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 FL prim wY wZ -> FL prim wZ wX -> FL prim wY wX
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' = (Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wY)
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wY]
forall a b. (a -> b) -> [a] -> [b]
map (FL (PrimOf (RepoPatchV2 prim)) wY wZ
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wY
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
FL (PrimOf (RepoPatchV2 prim)) wY wZ
n2) [Non (RepoPatchV2 prim) wZ]
a1
p2ooo :: Non (RepoPatchV2 prim) wY
p2ooo = [Non (RepoPatchV2 prim) wY]
-> Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wY
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' <- (:>) (FL prim) (FL prim) wY wX
-> Maybe ((:>) (FL prim) (FL prim) wY wX)
forall (m :: * -> *) a. Monad m => a -> m a
return ((:>) (FL prim) (FL prim) wY wX
-> Maybe ((:>) (FL prim) (FL prim) wY wX))
-> (:>) (FL prim) (FL prim) wY wX
-> Maybe ((:>) (FL prim) (FL prim) wY wX)
forall a b. (a -> b) -> a -> b
$ Non (RepoPatchV2 prim) wY
-> FL prim wY wX -> (:>) (FL prim) (FL prim) wY wX
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 = [Non (RepoPatchV2 prim) wY]
-> FL prim wY wX -> [Non (RepoPatchV2 prim) wY]
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' FL prim wY wZ -> FL prim wZ wX -> FL prim wY wX
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 = Int -> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. Int -> [a] -> [a]
take (FL prim wY wZ -> Int
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 = Int -> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. Int -> [a] -> [a]
drop (FL prim wY wZ -> Int
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 [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
n2nons) [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wY]
forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` (Non (RepoPatchV2 prim) wY
p1' Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
n1'nons)
Just [Non (RepoPatchV2 prim) wY]
a2'o =
([Non (RepoPatchV2 prim) wY], [Non (RepoPatchV2 prim) wY])
-> [Non (RepoPatchV2 prim) wY]
forall a b. (a, b) -> a
fst (Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY]
-> ([Non (RepoPatchV2 prim) wY], [Non (RepoPatchV2 prim) wY])
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 ([Non (RepoPatchV2 prim) wY]
-> ([Non (RepoPatchV2 prim) wY], [Non (RepoPatchV2 prim) wY]))
-> [Non (RepoPatchV2 prim) wY]
-> ([Non (RepoPatchV2 prim) wY], [Non (RepoPatchV2 prim) wY])
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wY]
a2_minus_p1 [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
n2nons)
[Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wY]
forall a. Eq a => [a] -> [a] -> Maybe [a]
`minus` [Non (RepoPatchV2 prim) wY]
n2'nons
Just [Non (RepoPatchV2 prim) wZ]
a2' =
(Non (RepoPatchV2 prim) wY -> Maybe (Non (RepoPatchV2 prim) wZ))
-> [Non (RepoPatchV2 prim) wY] -> Maybe [Non (RepoPatchV2 prim) wZ]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (FL (RepoPatchV2 prim) wY wZ
-> Non (RepoPatchV2 prim) wY -> Maybe (Non (RepoPatchV2 prim) wZ)
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 ([Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ -> FL (RepoPatchV2 prim) wY wZ
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' = FL (RepoPatchV2 prim) wY wZ
-> Non (RepoPatchV2 prim) wY -> Maybe (Non (RepoPatchV2 prim) wZ)
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 ([Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ -> FL (RepoPatchV2 prim) wY wZ
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 FL (RepoPatchV2 prim) wZ wY
-> FL (PrimOf (FL (RepoPatchV2 prim))) wZ wY
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' FL prim wY wZ -> FL prim wZ wZ -> FL prim wY wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ prim wZ wZ
PrimOf (RepoPatchV2 prim) wY wZ
x prim wZ wZ -> FL prim wZ wZ -> FL prim wZ wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wZ wZ
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL in
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. a -> Maybe a
Just (prim wX wZ -> RepoPatchV2 prim wX wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wX wZ
PrimOf (RepoPatchV2 prim) wY wZ
x RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wZ 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
_ -> String -> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. HasCallStack => String -> a
error String
"impossible case"
([Non (RepoPatchV2 prim) wZ], FL prim wZ wX,
Non (RepoPatchV2 prim) wZ)
_ -> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. a -> Maybe a
Just (RepoPatchV2 prim wX wZ
c1 RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
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 = [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wX
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wX wZ
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 = [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wZ 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
p2 Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
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) = [Non (RepoPatchV2 prim) wY]
-> FL prim wY wZ
-> ([Non (RepoPatchV2 prim) wY], FL (RepoPatchV2 prim) wY wZ)
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' = RL (RepoPatchV2 prim) wY wZ
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wY
forall (p :: * -> * -> *) wX wY.
(Apply p, Commute p, Invert p, ToFromPrim p) =>
RL p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtxRL (FL (RepoPatchV2 prim) wY wZ -> RL (RepoPatchV2 prim) wY wZ
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{}) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX 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 (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
_ = Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. Maybe a
Nothing
instance PrimPatch prim => Commute (RepoPatchV2 prim) where
commute :: (:>) (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) =
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commuteNoConflicts (RepoPatchV2 prim wX wZ -> RepoPatchV2 prim wX wZ
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wX wZ
x RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wZ wY
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RepoPatchV2 prim wZ wY -> RepoPatchV2 prim wZ wY
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wZ wY
y)
Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus`
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
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 :: (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
cleanMerge = (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
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 :: (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
merge (InvConflictor{} :\/: RepoPatchV2 prim wZ wY
_) = String -> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. HasCallStack => String -> a
error String
"impossible case"
merge (RepoPatchV2 prim wZ wX
_ :\/: InvConflictor{}) = String -> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. HasCallStack => String -> a
error String
"impossible case"
merge (Etacilpud Non (RepoPatchV2 prim) wZ
_ :\/: RepoPatchV2 prim wZ wY
_) = String -> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. HasCallStack => String -> a
error String
"impossible case"
merge (RepoPatchV2 prim wZ wX
_ :\/: Etacilpud Non (RepoPatchV2 prim) wZ
_) = String -> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. HasCallStack => String -> a
error String
"impossible case"
merge (Duplicate Non (RepoPatchV2 prim) wZ
a :\/: Duplicate Non (RepoPatchV2 prim) wZ
b) = Non (RepoPatchV2 prim) wZ -> RepoPatchV2 prim wZ wZ
forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wZ
b RepoPatchV2 prim wZ wZ
-> RepoPatchV2 prim wZ wZ
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wZ
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: Non (RepoPatchV2 prim) wZ -> RepoPatchV2 prim wZ wZ
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 RepoPatchV2 prim wZ wY
-> RepoPatchV2 prim wY wY
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wZ wY
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: Non (RepoPatchV2 prim) wY -> RepoPatchV2 prim wY wY
forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate (RepoPatchV2 prim wY wZ
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wY
forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (RepoPatchV2 prim wZ wY -> RepoPatchV2 prim wY wZ
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
_) = (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
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') <-
(:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (p :: * -> * -> *) wX wY.
(Invert p, CommuteNoConflicts p) =>
(:\/:) p p wX wY -> Maybe ((:/\:) p p wX wY)
mergeNoConflicts ((RepoPatchV2 prim wZ wX -> RepoPatchV2 prim wZ wX
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wZ wX
x) RepoPatchV2 prim wZ wX
-> RepoPatchV2 prim wZ wY
-> (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: (RepoPatchV2 prim wZ wY -> RepoPatchV2 prim wZ wY
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wZ wY
y))
= RepoPatchV2 prim wX wZ -> RepoPatchV2 prim wX wZ
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
assertConsistent RepoPatchV2 prim wX wZ
y' RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wY wZ
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: RepoPatchV2 prim wY wZ -> RepoPatchV2 prim wY wZ
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 RepoPatchV2 prim wZ wX -> RepoPatchV2 prim wZ wY -> EqCheck wX wY
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 <- RepoPatchV2 prim wX wZ
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY.
(Commute p, ToFromPrim p) =>
p wX wY -> Non p wY -> Non p wX
commuteOrAddToCtx (RepoPatchV2 prim wZ wX -> RepoPatchV2 prim wX wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wZ wX
x) (Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wX)
-> Non (RepoPatchV2 prim) wZ -> Non (RepoPatchV2 prim) wX
forall a b. (a -> b) -> a -> b
$ RepoPatchV2 prim wZ wX -> Non (RepoPatchV2 prim) wZ
forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non RepoPatchV2 prim wZ wX
x =
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
forall (prim :: * -> * -> *) wX.
Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
Duplicate Non (RepoPatchV2 prim) wX
n RepoPatchV2 prim wX wX
-> RepoPatchV2 prim wX wX
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wX
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
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 RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wY wZ
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
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 = [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wX
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wX wZ
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 prim wZ wX -> FL prim wX wX -> FL prim wZ wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (RepoPatchV2 prim wZ wY -> Non (RepoPatchV2 prim) wZ
forall (p :: * -> * -> *) wX wY. Nonable p => p wX wY -> Non p wX
non RepoPatchV2 prim wZ wY
ny)
cx :: RepoPatchV2 prim wY wZ
cx = [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wY
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wY wZ
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 prim wZ wY -> FL prim wY wY -> FL prim wZ wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (RepoPatchV2 prim wZ wX -> Non (RepoPatchV2 prim) wZ
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) =
[Non (RepoPatchV2 prim) wY]
-> FL prim wY wX
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim 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 FL prim wY wX
yyx Non (RepoPatchV2 prim) wY
y RepoPatchV2 prim wX wY
-> RepoPatchV2 prim wY wY
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: [Non (RepoPatchV2 prim) wY]
-> FL prim wY wY
-> Non (RepoPatchV2 prim) wY
-> RepoPatchV2 prim wY 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 Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
iy [Non (RepoPatchV2 prim) wY]
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. [a] -> [a] -> [a]
++ [Non (RepoPatchV2 prim) wY]
nyy) FL prim wY wY
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 FL prim wY wZ -> FL prim wZ wX -> FL prim wY wX
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ prim wZ wX
x prim wZ wX -> FL prim wX wX -> FL prim wZ wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
(Non (RepoPatchV2 prim) wY
x' : [Non (RepoPatchV2 prim) wY]
nyy) = [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. [a] -> [a]
reverse ([Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY])
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wY]
-> FL prim wY wX -> [Non (RepoPatchV2 prim) wY]
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
_) = (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX 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 RL prim wX wZ -> RL prim wY wZ -> CommonRL prim wX wY wZ
forall (p :: * -> * -> *) wX wO wY.
(Commute p, Eq2 p) =>
RL p wX wO -> RL p wY wO -> CommonRL p wX wY wO
pullCommonRL (FL prim wX wZ -> RL prim wX wZ
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL prim wX wZ
xx) (FL prim wY wZ -> RL prim wY wZ
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 (:>) (RL prim) (FL prim) wY wX
-> Maybe ((:>) (FL prim) (RL prim) wY wX)
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 RL prim wY wI -> FL prim wI wX -> (:>) (RL prim) (FL prim) wY wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RL prim wX wI -> FL prim wI wX
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' = FL prim wY wZ -> FL prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL prim wY wZ
ixx'
yy' :: FL prim wZ wX
yy' = RL prim wZ wX -> FL prim wZ wX
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' =
(Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wZ)
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wZ]
forall a b. (a -> b) -> [a] -> [b]
map (FL (PrimOf (RepoPatchV2 prim)) wZ wY
-> Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wZ
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
FL (PrimOf (RepoPatchV2 prim)) wZ wY
xx') (Non (RepoPatchV2 prim) wY
y Non (RepoPatchV2 prim) wY
-> [Non (RepoPatchV2 prim) wY] -> [Non (RepoPatchV2 prim) wY]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wY]
iy)
Non (RepoPatchV2 prim) wZ
x' : [Non (RepoPatchV2 prim) wZ]
ix' =
(Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wZ)
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wZ]
forall a b. (a -> b) -> [a] -> [b]
map (RL (PrimOf (RepoPatchV2 prim)) wZ wX
-> Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wZ
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
RL (PrimOf (RepoPatchV2 prim)) wZ wX
ryy') (Non (RepoPatchV2 prim) wX
x Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wX]
ix)
nyy' :: [Non (RepoPatchV2 prim) wZ]
nyy' = [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wX -> [Non (RepoPatchV2 prim) wZ]
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' = [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wY -> [Non (RepoPatchV2 prim) wZ]
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 = Int -> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a. Int -> [a] -> [a]
drop (RL prim wX wI -> Int
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> Int
lengthRL RL prim wX wI
rxx1) ([Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX])
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a b. (a -> b) -> a -> b
$
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wZ -> [Non (RepoPatchV2 prim) wX]
forall (prim :: * -> * -> *) wX wY.
PrimPatch prim =>
[Non (RepoPatchV2 prim) wX]
-> FL prim wX wY -> [Non (RepoPatchV2 prim) wX]
xx2nons [Non (RepoPatchV2 prim) wX]
ix (RL prim wX wZ -> FL prim wX wZ
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL prim wX wZ -> FL prim wX wZ) -> RL prim wX wZ -> FL prim wX wZ
forall a b. (a -> b) -> a -> b
$ RL prim wX wI
rxx1 RL prim wX wI -> RL prim wI wZ -> RL prim wX wZ
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' = (Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wZ)
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wZ]
forall a b. (a -> b) -> [a] -> [b]
map (RL (PrimOf (RepoPatchV2 prim)) wZ wX
-> Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wZ
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
RL (PrimOf (RepoPatchV2 prim)) wZ wX
ryy') [Non (RepoPatchV2 prim) wX]
icx
ixy' :: [Non (RepoPatchV2 prim) wZ]
ixy' = [Non (RepoPatchV2 prim) wZ]
ic' [Non (RepoPatchV2 prim) wZ]
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. [a] -> [a] -> [a]
++ ([Non (RepoPatchV2 prim) wZ]
iy' [Non (RepoPatchV2 prim) wZ]
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. Eq a => [a] -> [a] -> [a]
+++ [Non (RepoPatchV2 prim) wZ]
ix')
c1 :: RepoPatchV2 prim wX wZ
c1 = [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wX
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wX wZ
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' Non (RepoPatchV2 prim) wZ
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wZ]
ixy' [Non (RepoPatchV2 prim) wZ]
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
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 = [Non (RepoPatchV2 prim) wZ]
-> FL prim wZ wY
-> Non (RepoPatchV2 prim) wZ
-> RepoPatchV2 prim wY wZ
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' Non (RepoPatchV2 prim) wZ
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wZ]
ixy' [Non (RepoPatchV2 prim) wZ]
-> [Non (RepoPatchV2 prim) wZ] -> [Non (RepoPatchV2 prim) wZ]
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 RepoPatchV2 prim wX wZ
-> RepoPatchV2 prim wY wZ
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
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 -> String -> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. HasCallStack => String -> a
error String
"impossible case"
instance PatchInspect prim => PatchInspect (RepoPatchV2 prim) where
listTouchedFiles :: RepoPatchV2 prim wX wY -> [AnchoredPath]
listTouchedFiles (Duplicate Non (RepoPatchV2 prim) wX
p) = Non (RepoPatchV2 prim) wX -> [AnchoredPath]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches Non (RepoPatchV2 prim) wX
p
listTouchedFiles (Etacilpud Non (RepoPatchV2 prim) wX
p) = Non (RepoPatchV2 prim) wX -> [AnchoredPath]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches Non (RepoPatchV2 prim) wX
p
listTouchedFiles (Normal prim wX wY
p) = prim wX wY -> [AnchoredPath]
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) =
[AnchoredPath] -> [AnchoredPath]
forall a. Ord a => [a] -> [a]
nubSort ([AnchoredPath] -> [AnchoredPath])
-> [AnchoredPath] -> [AnchoredPath]
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wY -> [AnchoredPath])
-> [Non (RepoPatchV2 prim) wY] -> [AnchoredPath]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Non (RepoPatchV2 prim) wY -> [AnchoredPath]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches [Non (RepoPatchV2 prim) wY]
x [AnchoredPath] -> [AnchoredPath] -> [AnchoredPath]
forall a. [a] -> [a] -> [a]
++ FL prim wY wX -> [AnchoredPath]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [AnchoredPath]
listTouchedFiles FL prim wY wX
c [AnchoredPath] -> [AnchoredPath] -> [AnchoredPath]
forall a. [a] -> [a] -> [a]
++ Non (RepoPatchV2 prim) wY -> [AnchoredPath]
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) =
[AnchoredPath] -> [AnchoredPath]
forall a. Ord a => [a] -> [a]
nubSort ([AnchoredPath] -> [AnchoredPath])
-> [AnchoredPath] -> [AnchoredPath]
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wX -> [AnchoredPath])
-> [Non (RepoPatchV2 prim) wX] -> [AnchoredPath]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Non (RepoPatchV2 prim) wX -> [AnchoredPath]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches [Non (RepoPatchV2 prim) wX]
x [AnchoredPath] -> [AnchoredPath] -> [AnchoredPath]
forall a. [a] -> [a] -> [a]
++ FL prim wX wY -> [AnchoredPath]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [AnchoredPath]
listTouchedFiles FL prim wX wY
c [AnchoredPath] -> [AnchoredPath] -> [AnchoredPath]
forall a. [a] -> [a] -> [a]
++ Non (RepoPatchV2 prim) wX -> [AnchoredPath]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [AnchoredPath]
nonTouches Non (RepoPatchV2 prim) wX
p
hunkMatches :: (ByteString -> Bool) -> RepoPatchV2 prim wX wY -> Bool
hunkMatches ByteString -> Bool
f (Duplicate Non (RepoPatchV2 prim) wX
p) = (ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
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) = (ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
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) = (ByteString -> Bool) -> prim wX wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f prim wX wY
p
hunkMatches ByteString -> Bool
f (Conflictor [Non (RepoPatchV2 prim) wY]
x FL prim wY wX
c Non (RepoPatchV2 prim) wY
p) =
(Non (RepoPatchV2 prim) wY -> Bool)
-> [Non (RepoPatchV2 prim) wY] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any ((ByteString -> Bool) -> Non (RepoPatchV2 prim) wY -> Bool
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f) [Non (RepoPatchV2 prim) wY]
x Bool -> Bool -> Bool
|| (ByteString -> Bool) -> FL prim wY wX -> 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
|| (ByteString -> Bool) -> Non (RepoPatchV2 prim) wY -> 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) =
(Non (RepoPatchV2 prim) wX -> Bool)
-> [Non (RepoPatchV2 prim) wX] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any ((ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
(ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> Bool
nonHunkMatches ByteString -> Bool
f) [Non (RepoPatchV2 prim) wX]
x Bool -> Bool -> Bool
|| (ByteString -> Bool) -> FL prim wX wY -> 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
|| (ByteString -> Bool) -> Non (RepoPatchV2 prim) wX -> 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 :: 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 = ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
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 (([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX]))
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wX -> Bool)
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
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 Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX]
-> ([Non (RepoPatchV2 prim) wX], [Non (RepoPatchV2 prim) wX])
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 Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wX]
c1 [Non (RepoPatchV2 prim) wX]
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
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 :: 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 Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
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 Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX -> Bool
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 FL (RepoPatchV2 prim) wX wY
-> Non (RepoPatchV2 prim) wX -> Maybe (Non (RepoPatchV2 prim) wY)
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 = prim wZ wY -> RepoPatchV2 prim wZ wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal (prim wZ wY -> RepoPatchV2 prim wZ wY)
-> prim wZ wY -> RepoPatchV2 prim wZ wY
forall a b. (a -> b) -> a -> b
$ prim wY wZ -> prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
y in
case (:>) (RepoPatchV2 prim) (FL (RepoPatchV2 prim)) wZ wZ
-> Maybe ((:>) (FL (RepoPatchV2 prim)) (RepoPatchV2 prim) wZ wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Maybe ((:>) (FL p) p wX wY)
commuteFL (RepoPatchV2 prim wZ wY
iy RepoPatchV2 prim wZ wY
-> FL (RepoPatchV2 prim) wY wZ
-> (:>) (RepoPatchV2 prim) (FL (RepoPatchV2 prim)) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV2 prim) wY wY
cx' FL (RepoPatchV2 prim) wY wY
-> FL (RepoPatchV2 prim) wY wZ -> FL (RepoPatchV2 prim) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ prim wY wZ -> RepoPatchV2 prim wY wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
x' RepoPatchV2 prim wY wZ
-> FL (RepoPatchV2 prim) wZ wZ -> FL (RepoPatchV2 prim) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wZ 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 :: 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 FL (RepoPatchV2 prim) wX wZ
-> FL (RepoPatchV2 prim) wX wY
-> Maybe (FL (RepoPatchV2 prim) wZ wY)
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 FL (RepoPatchV2 prim) wX wY
-> FL (RepoPatchV2 prim) wY wZ -> FL (RepoPatchV2 prim) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ prim wY wZ -> RepoPatchV2 prim wY wZ
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal prim wY wZ
PrimOf (RepoPatchV2 prim) wY wZ
y RepoPatchV2 prim wY wZ
-> FL (RepoPatchV2 prim) wZ wZ -> FL (RepoPatchV2 prim) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RepoPatchV2 prim) wZ 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]
[] +++ :: [a] -> [a] -> [a]
+++ [a]
x = [a]
x
[a]
x +++ [] = [a]
x
(a
x:[a]
xs) +++ [a]
xys | Just [a]
ys <- a -> [a] -> Maybe [a]
forall a. Eq a => a -> [a] -> Maybe [a]
remove1 a
x [a]
xys = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: ([a]
xs [a] -> [a] -> [a]
forall a. Eq a => [a] -> [a] -> [a]
+++ [a]
ys)
| Bool
otherwise = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: ([a]
xs [a] -> [a] -> [a]
forall a. Eq a => [a] -> [a] -> [a]
+++ [a]
xys)
invertCommuteC :: PrimPatch prim => CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
invertCommuteC :: CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
invertCommuteC = CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
-> CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
forall (p :: * -> * -> *) (q :: * -> * -> *).
(Invert p, Invert q) =>
CommuteFn p q -> CommuteFn q p
invertCommuter CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
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 :: CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
invertCommuteNC = CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
-> CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
forall (p :: * -> * -> *) (q :: * -> * -> *).
(Invert p, Invert q) =>
CommuteFn p q -> CommuteFn q p
invertCommuter CommuteFn (RepoPatchV2 prim) (RepoPatchV2 prim)
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 :: FL p wO wX -> FL p wO wY -> Common p wO wX wY
pullCommon FL p wO wX
NilFL FL p wO wY
ys = FL p wO wO
-> FL p wO wO -> FL p wO wY -> Fork (FL p) (FL p) (FL p) wO wO wY
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 wO
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL p wO wO
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL p wO wY
ys
pullCommon FL p wO wX
xs FL p wO wY
NilFL = FL p wO wO
-> FL p wO wX -> FL p wO wO -> Fork (FL p) (FL p) (FL p) wO wX wO
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 wO
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL p wO wX
xs FL p wO wO
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 <- p wO wY -> FL p wO wY -> Maybe (FL p wY wY)
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 FL p wY wX -> FL p wY wY -> Common p wY wX wY
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' -> FL p wO wU -> FL p wU wX -> FL p wU wY -> Common p wO wX wY
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 p wO wY -> FL p wY wU -> FL p wO wU
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY 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 (:>) p (FL p) wO wX -> (:>) (FL p) (p :> FL p) wO wX
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> (:>) (FL p) (p :> FL p) wX wY
commuteWhatWeCanFL (p wO wY
x p wO wY -> FL p wY wX -> (:>) p (FL p) wO wX
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 FL p wO wZ -> FL p wO wY -> Common p wO wZ wY
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' -> FL p wO wU -> FL p wU wX -> FL p wU wY -> Common p wO wX wY
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' FL p wU wZ -> FL p wZ wX -> FL p wU wX
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ p wZ wZ
x' p wZ wZ -> FL p wZ wX -> FL p wZ wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY 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 :: RL p wX wO -> RL p wY wO -> CommonRL p wX wY wO
pullCommonRL RL p wX wO
NilRL RL p wY wO
ys = RL p wO wO -> RL p wY wO -> RL p wO wO -> CommonRL p wO wY wO
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 wO wO
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL RL p wY wO
ys RL p wO wO
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
pullCommonRL RL p wX wO
xs RL p wY wO
NilRL = RL p wX wO -> RL p wO wO -> RL p wO wO -> CommonRL p wX wO wO
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 RL p wO wO
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL RL p wO wO
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 <- p wY wO -> RL p wY wO -> Maybe (RL p wY wY)
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 RL p wX wY -> RL p wY wY -> CommonRL p wX wY wY
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 -> RL p wX wI -> RL p wY wI -> RL p wI wO -> CommonRL p wX wY wO
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 RL p wI wY -> p wY wO -> RL p wI wO
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY 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 (:>) (RL p) p wX wO -> (:>) (RL p) (p :> RL p) wX wO
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) (RL p) p wX wY -> (:>) (RL p) (p :> RL p) wX wY
commuteWhatWeCanRL (RL p wX wY
xs RL p wX wY -> p wY wO -> (:>) (RL p) p wX wO
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 RL p wZ wO -> RL p wY wO -> CommonRL p wZ wY wO
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 -> RL p wX wI -> RL p wY wI -> RL p wI wO -> CommonRL p wX wY wO
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 RL p wX wZ -> p wZ wZ -> RL p wX wZ
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: p wZ wZ
x' RL p wX wZ -> RL p wZ wI -> RL p wX wI
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 :: RepoPatchV2 prim wX wY -> m ()
apply RepoPatchV2 prim wX wY
p = FL prim wX wY -> m ()
forall (prim :: * -> * -> *) (m :: * -> *) wX wY.
(PrimApply prim, ApplyMonad (ApplyState prim) m) =>
FL prim wX wY -> m ()
applyPrimFL (RepoPatchV2 prim wX wY -> FL (PrimOf (RepoPatchV2 prim)) wX wY
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 :: RepoPatchV2 prim wX wY
-> m (Maybe (String, FL (RepoPatchV2 prim) wX wY))
applyAndTryToFixFL (Normal prim wX wY
p) =
(FL prim wX wY -> FL (RepoPatchV2 prim) wX wY)
-> Maybe (String, FL prim wX wY)
-> Maybe (String, FL (RepoPatchV2 prim) wX wY)
forall a b c. (a -> b) -> Maybe (c, a) -> Maybe (c, b)
mapMaybeSnd ((forall wW wY. prim wW wY -> RepoPatchV2 prim wW wY)
-> FL prim wX wY -> FL (RepoPatchV2 prim) 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 wW wY. prim wW wY -> RepoPatchV2 prim wW wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal) (Maybe (String, FL prim wX wY)
-> Maybe (String, FL (RepoPatchV2 prim) wX wY))
-> m (Maybe (String, FL prim wX wY))
-> m (Maybe (String, FL (RepoPatchV2 prim) wX wY))
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` prim wX wY -> m (Maybe (String, FL prim wX wY))
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 RepoPatchV2 prim wX wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply RepoPatchV2 prim wX wY
x; Maybe (String, FL (RepoPatchV2 prim) wX wY)
-> m (Maybe (String, FL (RepoPatchV2 prim) wX wY))
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (String, FL (RepoPatchV2 prim) wX wY)
forall a. Maybe a
Nothing
instance PatchListFormat (RepoPatchV2 prim) where
patchListFormat :: ListFormat (RepoPatchV2 prim)
patchListFormat = ListFormat (RepoPatchV2 prim)
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 :: ShowPatchFor -> RepoPatchV2 prim wX wY -> Doc
showPatch ShowPatchFor
f (Duplicate Non (RepoPatchV2 prim) wX
d) = String -> Doc
blueText String
duplicate Doc -> Doc -> Doc
$$ ShowPatchFor -> Non (RepoPatchV2 prim) wX -> 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
$$ ShowPatchFor -> Non (RepoPatchV2 prim) wX -> 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) = ShowPatchFor -> prim wX wY -> Doc
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
<+> ShowPatchFor -> [Non (RepoPatchV2 prim) wY] -> 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
$$ ShowPatchFor -> Non (RepoPatchV2 prim) wY -> 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
<+> ShowPatchFor -> [Non (RepoPatchV2 prim) wY] -> 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
$$
ShowPatchFor -> FL prim wY wX -> 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
$$
ShowPatchFor -> Non (RepoPatchV2 prim) wY -> 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
<+> ShowPatchFor -> [Non (RepoPatchV2 prim) wX] -> 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
$$ ShowPatchFor -> Non (RepoPatchV2 prim) wX -> 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
<+> ShowPatchFor -> [Non (RepoPatchV2 prim) wX] -> 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
$$
ShowPatchFor -> FL prim wX wY -> 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
$$
ShowPatchFor -> Non (RepoPatchV2 prim) wX -> 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 :: ShowPatchFor -> RepoPatchV2 prim wX wY -> m Doc
showContextPatch ShowPatchFor
f (Normal prim wX wY
p) = ShowPatchFor -> prim wX wY -> m Doc
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 = Doc -> m Doc
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> m Doc) -> Doc -> m Doc
forall a b. (a -> b) -> a -> b
$ ShowPatchFor -> RepoPatchV2 prim wX wY -> Doc
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 :: RepoPatchV2 prim wX wY -> Doc
summary = RepoPatchV2 prim wX wY -> Doc
forall (e :: * -> * -> *) wX wY.
(Summary e, PrimDetails (PrimOf e)) =>
e wX wY -> Doc
plainSummary
summaryFL :: FL (RepoPatchV2 prim) wX wY -> Doc
summaryFL = FL (RepoPatchV2 prim) wX wY -> Doc
forall (e :: * -> * -> *) wX wY.
(Summary e, PrimDetails (PrimOf e)) =>
e wX wY -> Doc
plainSummary
thing :: RepoPatchV2 prim wX wY -> String
thing RepoPatchV2 prim wX wY
_ = String
"change"
instance PrimPatch prim => ReadPatch (RepoPatchV2 prim) where
readPatch' :: Parser (Sealed (RepoPatchV2 prim wX))
readPatch' = do
Parser ()
skipSpace
let str :: String -> Parser ()
str = ByteString -> Parser ()
string (ByteString -> Parser ())
-> (String -> ByteString) -> String -> Parser ()
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 <- Parser [Non (RepoPatchV2 prim) wX]
forall (p :: * -> * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p) =>
Parser [Non p wX]
readNons
Sealed (FL prim wX)
ps <- (forall wY. Parser (Sealed (prim wY)))
-> Char -> Char -> Parser (Sealed (FL prim wX))
forall (p :: * -> * -> *) wX.
(forall wY. Parser (Sealed (p wY)))
-> Char -> Char -> Parser (Sealed (FL p wX))
bracketedFL forall wY. Parser (Sealed (prim wY))
forall (p :: * -> * -> *) wX. ReadPatch p => Parser (Sealed (p wX))
readPatch' Char
'[' Char
']'
Non (RepoPatchV2 prim) wX
p <- Parser (Non (RepoPatchV2 prim) wX)
forall (p :: * -> * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p) =>
Parser (Non p wX)
readNon
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
-> Parser
ByteString
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Non (RepoPatchV2 prim) wX]
i, Sealed (FL prim wX)
ps, Non (RepoPatchV2 prim) wX
p)
[Parser (Sealed (RepoPatchV2 prim wX))]
-> Parser (Sealed (RepoPatchV2 prim wX))
forall (f :: * -> *) a. Alternative f => [f a] -> f a
choice [ do String -> Parser ()
str String
duplicate
Non (RepoPatchV2 prim) wX
p <- Parser (Non (RepoPatchV2 prim) wX)
forall (p :: * -> * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p) =>
Parser (Non p wX)
readNon
Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall a b. (a -> b) -> a -> b
$ RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX))
-> RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX)
forall a b. (a -> b) -> a -> b
$ Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
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 <- Parser (Non (RepoPatchV2 prim) wX)
forall (p :: * -> * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p) =>
Parser (Non p wX)
readNon
Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall a b. (a -> b) -> a -> b
$ RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX))
-> RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX)
forall a b. (a -> b) -> a -> b
$ Non (RepoPatchV2 prim) wX -> RepoPatchV2 prim wX wX
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) <- Parser
ByteString
([Non (RepoPatchV2 prim) Any], Sealed (FL prim Any),
Non (RepoPatchV2 prim) Any)
forall wX wX wX.
Parser
ByteString
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
readConflictorPs
Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall a b. (a -> b) -> a -> b
$ RepoPatchV2 prim wX Any -> Sealed (RepoPatchV2 prim wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RepoPatchV2 prim wX Any -> Sealed (RepoPatchV2 prim wX))
-> RepoPatchV2 prim wX Any -> Sealed (RepoPatchV2 prim wX)
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) Any]
-> FL prim Any wX
-> Non (RepoPatchV2 prim) Any
-> RepoPatchV2 prim wX Any
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 (FL prim Any wX -> FL prim Any wX
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) <- Parser
ByteString
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
forall wX wX wX.
Parser
ByteString
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
readConflictorPs
Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall a b. (a -> b) -> a -> b
$ RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX))
-> RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX)
forall a b. (a -> b) -> a -> b
$ [Non (RepoPatchV2 prim) wX]
-> FL prim wX wX
-> Non (RepoPatchV2 prim) wX
-> RepoPatchV2 prim wX wX
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 <- Parser (Sealed (prim wX))
forall (p :: * -> * -> *) wX. ReadPatch p => Parser (Sealed (p wX))
readPatch'
Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX)
-> Parser (Sealed (RepoPatchV2 prim wX))
forall a b. (a -> b) -> a -> b
$ RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX))
-> RepoPatchV2 prim wX wX -> Sealed (RepoPatchV2 prim wX)
forall a b. (a -> b) -> a -> b
$ prim wX wX -> RepoPatchV2 prim wX wX
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 -> String -> String
showsPrec Int
d (Normal prim wX wY
prim) =
Bool -> (String -> String) -> String -> String
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
appPrec) ((String -> String) -> String -> String)
-> (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> String -> String
showString String
"Normal " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> prim wX wY -> String -> String
forall (a :: * -> * -> *) wX wY.
Show2 a =>
Int -> a wX wY -> String -> String
showsPrec2 (Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) prim wX wY
prim
showsPrec Int
d (Duplicate Non (RepoPatchV2 prim) wX
x) =
Bool -> (String -> String) -> String -> String
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
appPrec) ((String -> String) -> String -> String)
-> (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> String -> String
showString String
"Duplicate " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Non (RepoPatchV2 prim) wX -> String -> String
forall a. Show a => Int -> a -> String -> String
showsPrec (Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Non (RepoPatchV2 prim) wX
x
showsPrec Int
d (Etacilpud Non (RepoPatchV2 prim) wX
x) =
Bool -> (String -> String) -> String -> String
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
appPrec) ((String -> String) -> String -> String)
-> (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> String -> String
showString String
"Etacilpud " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Non (RepoPatchV2 prim) wX -> String -> String
forall a. Show a => Int -> a -> String -> String
showsPrec (Int
appPrec Int -> Int -> Int
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 -> (String -> String) -> String -> String
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
appPrec) ((String -> String) -> String -> String)
-> (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$
String -> String -> String
showString String
"Conflictor " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Non (RepoPatchV2 prim) wY] -> String -> String
forall a. Show a => Int -> a -> String -> String
showsPrec (Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Non (RepoPatchV2 prim) wY]
ix (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> String -> String
showString String
" " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> FL prim wY wX -> String -> String
forall a. Show a => Int -> a -> String -> String
showsPrec (Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) FL prim wY wX
xx (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> String -> String
showString String
" " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Non (RepoPatchV2 prim) wY -> String -> String
forall a. Show a => Int -> a -> String -> String
showsPrec (Int
appPrec Int -> Int -> Int
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 -> (String -> String) -> String -> String
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
appPrec) ((String -> String) -> String -> String)
-> (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$
String -> String -> String
showString String
"InvConflictor " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Non (RepoPatchV2 prim) wX] -> String -> String
forall a. Show a => Int -> a -> String -> String
showsPrec (Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Non (RepoPatchV2 prim) wX]
ix (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> String -> String
showString String
" " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> FL prim wX wY -> String -> String
forall a. Show a => Int -> a -> String -> String
showsPrec (Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) FL prim wX wY
xx (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> String -> String
showString String
" " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Non (RepoPatchV2 prim) wX -> String -> String
forall a. Show a => Int -> a -> String -> String
showsPrec (Int
appPrec Int -> Int -> Int
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 :: 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) = Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX
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) = FL (RepoPatchV2 prim) wX wX
-> PrimOf (RepoPatchV2 prim) wX wY -> Non (RepoPatchV2 prim) wX
forall (p :: * -> * -> *) wX wY wZ.
FL p wX wY -> PrimOf p wY wZ -> Non p wX
Non FL (RepoPatchV2 prim) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL prim wX wY
PrimOf (RepoPatchV2 prim) wX wY
p
non (Conflictor [Non (RepoPatchV2 prim) wY]
_ FL prim wY wX
xx Non (RepoPatchV2 prim) wY
x) = RL (PrimOf (RepoPatchV2 prim)) wX wY
-> Non (RepoPatchV2 prim) wY -> Non (RepoPatchV2 prim) wX
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 wX -> RL prim wX wY
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) = Non (RepoPatchV2 prim) wX -> Non (RepoPatchV2 prim) wX
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 :: RepoPatchV2 prim wX wY -> FL (PrimOf (RepoPatchV2 prim)) wX wY
effect (Duplicate Non (RepoPatchV2 prim) wX
_) = FL (PrimOf (RepoPatchV2 prim)) wX wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Etacilpud Non (RepoPatchV2 prim) wX
_) = FL (PrimOf (RepoPatchV2 prim)) wX wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Normal prim wX wY
p) = prim wX wY
p prim wX wY -> FL prim wY wY -> FL prim wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Conflictor [Non (RepoPatchV2 prim) wY]
_ FL prim wY wX
e Non (RepoPatchV2 prim) wY
_) = FL prim wY wX -> FL prim wX 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
FL (PrimOf (RepoPatchV2 prim)) wX wY
e
instance IsHunk prim => IsHunk (RepoPatchV2 prim) where
isHunk :: RepoPatchV2 prim wX wY -> Maybe (FileHunk wX wY)
isHunk RepoPatchV2 prim wX wY
rp = do Normal prim wX wY
p <- RepoPatchV2 prim wX wY -> Maybe (RepoPatchV2 prim wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return RepoPatchV2 prim wX wY
rp
prim wX wY -> Maybe (FileHunk wX wY)
forall (p :: * -> * -> *) wX wY.
IsHunk p =>
p wX wY -> Maybe (FileHunk wX wY)
isHunk prim wX wY
p
displayNons :: (PatchListFormat p, ShowPatchBasic p, PrimPatchBase p) =>
[Non p wX] -> Doc
displayNons :: [Non p wX] -> Doc
displayNons [Non p wX]
p = ShowPatchFor -> [Non p wX] -> Doc
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 :: ShowPatchFor -> FL p wX wY -> Doc
showFL ShowPatchFor
f = [Doc] -> Doc
vcat ([Doc] -> Doc) -> (FL p wX wY -> [Doc]) -> FL p wX wY -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall wW wZ. p wW wZ -> Doc) -> FL p wX wY -> [Doc]
forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (ShowPatchFor -> p wW wZ -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f)