{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-name-shadowing #-}
module Darcs.Patch.V2.RepoPatch
( RepoPatchV2(..)
, isConsistent
, isForward
, isDuplicate
, mergeUnravelled
) where
import Prelude ()
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.Annotate ( Annotate(..) )
import Darcs.Patch.Commute ( commuteFL, commuteFLorComplain, commuteRL
, commuteRLFL, Commute(..) )
import Darcs.Patch.Conflict ( Conflict(..), CommuteNoConflicts(..)
, IsConflictedPrim(..), ConflictState(..)
, mangleUnravelled )
import Darcs.Patch.Debug
import Darcs.Patch.Effect ( Effect(..) )
import Darcs.Patch.FileHunk ( IsHunk(..) )
import Darcs.Patch.Format ( PatchListFormat(..), ListFormat(ListFormatV2) )
import Darcs.Patch.Invert ( invertFL, invertRL, Invert(..) )
import Darcs.Patch.Merge ( Merge(..), naturalMerge )
import Darcs.Patch.Prim ( FromPrim(..), ToFromPrim(..)
, PrimPatchBase(..), PrimPatch )
import Darcs.Patch.Read ( bracketedFL, ReadPatch(..) )
import Darcs.Patch.ReadMonads ( 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 ( plainSummary )
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(..), (:>)(..), (+>+), (+<+)
, 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(..), ShowDict(..)
, showsPrec2, appPrec
)
import Darcs.Util.Printer.Color ( errorDoc, assertDoc )
import Darcs.Util.Printer ( Doc, 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 _) = Bool
True
isDuplicate (Etacilpud _) = Bool
True
isDuplicate _ = Bool
False
isForward :: PrimPatch prim => RepoPatchV2 prim wS wY -> Maybe Doc
isForward :: RepoPatchV2 prim wS wY -> Maybe Doc
isForward p :: 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 "An inverse conflictor" RepoPatchV2 prim wS wY
p
p :: RepoPatchV2 prim wS wY
p@(Etacilpud _) -> String -> RepoPatchV2 prim wS wY -> Maybe Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
String -> p wX wY -> Maybe Doc
justRedP "An inverse duplicate" RepoPatchV2 prim wS wY
p
_ -> Maybe Doc
forall a. Maybe a
Nothing
where
justRedP :: String -> p wX wY -> Maybe Doc
justRedP msg :: String
msg p :: 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 [_] = Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a. Maybe a
Nothing
mergeUnravelled ws :: [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
Nothing -> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a. Maybe a
Nothing
Just NilRL -> String -> Maybe (FlippedSeal (RepoPatchV2 prim) wX)
forall a. String -> a
bug "found no patches in mergeUnravelled"
Just (_ :<: z :: 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 NilFL) = Bool
False
notNullS _ = 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 xs :: [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 xs :: 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
ys :: RL prim wX wY
ys :<: y :: 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 (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim (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
NilRL -> String -> Non (RepoPatchV2 prim) wX
forall a. String -> a
bug "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 ns :: [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 p :: 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
NilFL -> FL (RepoPatchV2 prim) wX wX -> Maybe (FL (RepoPatchV2 prim) wX wX)
forall a. a -> Maybe a
Just FL (RepoPatchV2 prim) wX wX
p
_ -> Maybe (FL (RepoPatchV2 prim) wX wX)
forall a. Maybe a
Nothing
mcn (Sealed p1 :: FL (RepoPatchV2 prim) wX wX
p1:Sealed p2 :: FL (RepoPatchV2 prim) wX wX
p2:zs :: [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
Common c :: FL (RepoPatchV2 prim) wX wI
c ps :: FL (RepoPatchV2 prim) wI wX
ps qs :: FL (RepoPatchV2 prim) wI 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) wI wX
ps FL (RepoPatchV2 prim) wI wX
-> FL (RepoPatchV2 prim) wI 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) wI wX
qs) of
qs' :: FL (RepoPatchV2 prim) wX wZ
qs' :/\: _ -> [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 wI
c FL (RepoPatchV2 prim) wX wI
-> FL (RepoPatchV2 prim) wI 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) wI wX
ps FL (RepoPatchV2 prim) wI wX
-> FL (RepoPatchV2 prim) wX wZ -> FL (RepoPatchV2 prim) wI 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 NilFL = FL (PrimOf p) wA wB
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
joinInverses (p :: PrimOf p wA wY
p :>: ps :: 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 x :: RepoPatchV2 prim wX wY
x = (Maybe Doc -> RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY)
-> RepoPatchV2 prim wX wY -> Maybe Doc -> RepoPatchV2 prim wX wY
forall a b c. (a -> b -> c) -> b -> a -> c
flip Maybe Doc -> RepoPatchV2 prim wX wY -> RepoPatchV2 prim wX wY
forall a. Maybe Doc -> a -> a
assertDoc RepoPatchV2 prim wX wY
x (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 "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 xxx :: FL (RepoPatchV2 prim) wX wX
xxx yyy :: 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 NilRL xs :: FL prim wY wZ
xs goneby :: 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
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)
_ -> Maybe (FL (RepoPatchV2 prim) wX wX, FL (RepoPatchV2 prim) wX wA)
forall a. Maybe a
Nothing
mac (ps :: RL (RepoPatchV2 prim) wX wY
ps :<: p :: RepoPatchV2 prim wY wY
p) xs :: FL prim wY wZ
xs goneby :: FL (RepoPatchV2 prim) wZ wA
goneby =
case (:>) (RepoPatchV2 prim) (FL (RepoPatchV2 prim)) wY wZ
-> Either
(Sealed2 (RepoPatchV2 prim))
((:>) (FL (RepoPatchV2 prim)) (RepoPatchV2 prim) wY wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Either (Sealed2 p) ((:>) (FL p) p wX wY)
commuteFLorComplain (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
Left _ ->
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
a :: RL (RepoPatchV2 prim) wX wZ
a :> p' :: RepoPatchV2 prim wZ wZ
p' :> b :: RL (RepoPatchV2 prim) wZ wY
b ->
do (b' :: FL (RepoPatchV2 prim) wZ wZ
b', xs' :: 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)
Right (l :: FL (RepoPatchV2 prim) wY wZ
l :> p'' :: 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 xs'' :: 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)
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
a :: RL (RepoPatchV2 prim) wX wZ
a :> p' :: RepoPatchV2 prim wZ wZ
p' :> b :: RL (RepoPatchV2 prim) wZ wY
b ->
do (b' :: FL (RepoPatchV2 prim) wZ wZ
b', xs' :: 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 _ NilFL = ([], FL (RepoPatchV2 prim) wX wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
geteff ix :: [Non (RepoPatchV2 prim) wX]
ix (x :: prim wX wY
x :>: xs :: FL prim wY wY
xs) | Just ix' :: [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
(ns :: [Non (RepoPatchV2 prim) wY]
ns, xs' :: 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 ix :: [Non (RepoPatchV2 prim) wX]
ix xx :: 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
Nothing -> Doc -> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
forall a. Doc -> a
errorDoc (Doc -> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY))
-> Doc
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
forall a b. (a -> b) -> a -> b
$
String -> Doc
redText "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 "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 rix :: 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 (a :: FL (RepoPatchV2 prim) wX wX
a, x :: 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)
Nothing ->
Doc -> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
forall a. Doc -> a
errorDoc (Doc -> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY))
-> Doc
-> ([Non (RepoPatchV2 prim) wX], FL (RepoPatchV2 prim) wX wY)
forall a b. (a -> b) -> a -> b
$
String -> Doc
redText "mergeAfterConflicting failed in geteff" Doc -> Doc -> Doc
$$
String -> Doc
redText "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 "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 "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 ix :: [Non (RepoPatchV2 prim) wX]
ix xx :: 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 ix :: [Non (RepoPatchV2 prim) wX]
ix xx :: 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 x :: prim wX wY
x :>: xs :: 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 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 _ = 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 _) = Maybe Doc
forall a. Maybe a
Nothing
isConsistent (Duplicate _) = Maybe Doc
forall a. Maybe a
Nothing
isConsistent (Etacilpud _) = 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 im :: [Non (RepoPatchV2 prim) wY]
im mm :: FL prim wY wX
mm m :: Non (RepoPatchV2 prim) wY
m@(Non deps :: FL (RepoPatchV2 prim) wY wY
deps _))
| 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 "Someone doesn't conflict in im in isConsistent"
| Just _ <- 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, _ :>: _ <- 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 "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 (\x :: 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 "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 "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 "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
(im1 :: [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
(_, imnc :: [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 ("m doesn't conflict with im in "
String -> String -> String
forall a. [a] -> [a] -> [a]
++ "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 (nmm :: [Non (RepoPatchV2 prim) wY]
nmm, rmm :: 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 (x :: Non (RepoPatchV2 prim) wX
x : xs :: [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
([], _) -> Bool
False
(_, xs' :: [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 p :: 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 p :: Non (RepoPatchV2 prim) wX
p xs :: [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.
PrimPatch 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 (\x :: 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 x :: 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 x :: FL (RepoPatchV2 prim) wX wX
x : Sealed y :: FL (RepoPatchV2 prim) wX wX
y : rest :: [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
y' :: FL (RepoPatchV2 prim) wX wZ
y' :/\: _ -> [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 (q :: Non (RepoPatchV2 prim) wX
q : qs :: [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
q Non (RepoPatchV2 prim) wX
-> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
forall a. a -> [a] -> [a]
: [Non (RepoPatchV2 prim) wX]
qs
(_, nc :: [Non (RepoPatchV2 prim) wX]
nc) -> [Non (RepoPatchV2 prim) wX] -> [Non (RepoPatchV2 prim) wX]
unconflicting_of [Non (RepoPatchV2 prim) wX]
nc
instance PrimPatch prim => Conflict (RepoPatchV2 prim) where
conflictedEffect :: RepoPatchV2 prim wX wY
-> [IsConflictedPrim (PrimOf (RepoPatchV2 prim))]
conflictedEffect (Duplicate (Non _ x :: 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 _) = [IsConflictedPrim (PrimOf (RepoPatchV2 prim))]
forall a. a
impossible
conflictedEffect (Conflictor _ _ (Non _ x :: 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{}) = [IsConflictedPrim (PrimOf (RepoPatchV2 prim))]
forall a. a
impossible
conflictedEffect (Normal x :: 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]
resolveConflicts :: RepoPatchV2 prim wX wY
-> [[Sealed (FL (PrimOf (RepoPatchV2 prim)) wY)]]
resolveConflicts (Conflictor ix :: [Non (RepoPatchV2 prim) wY]
ix xx :: FL prim wY wX
xx x :: Non (RepoPatchV2 prim) wY
x) = [Sealed (FL prim wY)
mangledUnravelled Sealed (FL prim wY)
-> [Sealed (FL prim wY)] -> [Sealed (FL prim wY)]
forall a. a -> [a] -> [a]
: [Sealed (FL prim wY)]
unravelled]
where
mangledUnravelled :: Sealed (FL prim wY)
mangledUnravelled = [Sealed (FL prim wY)] -> Sealed (FL prim wY)
forall (prim :: * -> * -> *) wX.
PrimPatch prim =>
[Sealed (FL prim wX)] -> Sealed (FL prim wX)
mangleUnravelled [Sealed (FL prim wY)]
unravelled
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)
nonxx_ :: RL (RepoPatchV2 prim) wX wY -> [Non (RepoPatchV2 prim) wX]
nonxx_ :: RL (RepoPatchV2 prim) wX wY -> [Non (RepoPatchV2 prim) wX]
nonxx_ (qs :: RL (RepoPatchV2 prim) wX wY
qs :<: Normal q :: 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_ _ = []
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)
resolveConflicts _ = []
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 _) :> d2 :: RepoPatchV2 prim wZ wY
d2@(Duplicate _)) = (:>) (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 _) :> d :: RepoPatchV2 prim wZ wY
d@(Duplicate _)) = (:>) (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 _) :> e :: RepoPatchV2 prim wZ wY
e@(Etacilpud _)) = (:>) (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 _) :> e2 :: RepoPatchV2 prim wZ wY
e2@(Etacilpud _)) = (:>) (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@(x :: RepoPatchV2 prim wX wZ
x :> Duplicate d :: 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 d :: Non (RepoPatchV2 prim) wX
d :> x :: 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 _ :> _) = (:>) (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@(_ :> Etacilpud _) = (:>) (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 x :: prim wX wZ
x :> Normal y :: prim wZ wY
y) = do
y' :: prim wX wZ
y' :> x' :: 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 x :: prim wX wZ
x :> Conflictor iy :: [Non (RepoPatchV2 prim) wY]
iy yy :: FL prim wY wZ
yy y :: Non (RepoPatchV2 prim) wY
y) = do
iyy' :: FL prim wX wZ
iyy' :> x' :: 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)
y' :: Non (RepoPatchV2 prim) wZ
y' : iy' :: [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 _) = (:>) (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 iy :: [Non (RepoPatchV2 prim) wZ]
iy yy :: FL prim wZ wX
yy y :: Non (RepoPatchV2 prim) wZ
y :> Normal x :: prim wZ wY
x) = do
y' :: Non (RepoPatchV2 prim) wY
y' : iy' :: [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)
x' :: prim wX wZ
x' :> iyy' :: 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 _ :> 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 ix :: [Non (RepoPatchV2 prim) wZ]
ix xx :: FL prim wZ wX
xx x :: Non (RepoPatchV2 prim) wZ
x :> Conflictor iy :: [Non (RepoPatchV2 prim) wY]
iy yy :: FL prim wY wZ
yy y :: Non (RepoPatchV2 prim) wY
y) = do
xx' :: FL prim wY wZ
xx' :> yy' :: 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)
x' :: Non (RepoPatchV2 prim) wY
x':ix' :: [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)
y' :: Non (RepoPatchV2 prim) wZ
y':iy' :: [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 ix :: [Non (RepoPatchV2 prim) wX]
ix xx :: FL prim wX wZ
xx x :: Non (RepoPatchV2 prim) wX
x :> Conflictor iy :: [Non (RepoPatchV2 prim) wY]
iy yy :: FL prim wY wZ
yy y :: Non (RepoPatchV2 prim) wY
y) = do
iyy' :: FL prim wX wZ
iyy' :> xx' :: 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)
y' :: Non (RepoPatchV2 prim) wZ
y':iy' :: [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)
x' :: Non (RepoPatchV2 prim) wZ
x':ix' :: [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 iy' :: [Non (RepoPatchV2 prim) wZ]
iy' yy' :: FL prim wZ wX
yy' y' :: Non (RepoPatchV2 prim) wZ
y' :> InvConflictor ix' :: [Non (RepoPatchV2 prim) wZ]
ix' xx' :: FL prim wZ wY
xx' x' :: Non (RepoPatchV2 prim) wZ
x') = do
xx :: FL prim wX wZ
xx :> iyy :: 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')
y :: Non (RepoPatchV2 prim) wY
y:iy :: [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')
x :: Non (RepoPatchV2 prim) wX
x:ix :: [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
instance FromPrim (RepoPatchV2 prim) where
fromPrim :: PrimOf (RepoPatchV2 prim) wX wY -> RepoPatchV2 prim wX wY
fromPrim = PrimOf (RepoPatchV2 prim) wX wY -> RepoPatchV2 prim wX wY
forall (prim :: * -> * -> *) wX wY.
prim wX wY -> RepoPatchV2 prim wX wY
Normal
instance ToFromPrim (RepoPatchV2 prim) where
toPrim :: RepoPatchV2 prim wX wY -> Maybe (PrimOf (RepoPatchV2 prim) wX wY)
toPrim (Normal p :: prim wX wY
p) = prim wX wY -> Maybe (prim wX wY)
forall a. a -> Maybe a
Just prim wX wY
p
toPrim _ = Maybe (PrimOf (RepoPatchV2 prim) wX wY)
forall a. Maybe a
Nothing
instance PrimPatch prim => Eq2 (RepoPatchV2 prim) where
(Duplicate x :: Non (RepoPatchV2 prim) wA
x) =\/= :: RepoPatchV2 prim wA wB -> RepoPatchV2 prim wA wC -> EqCheck wB wC
=\/= (Duplicate y :: 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 x :: Non (RepoPatchV2 prim) wA
x) =\/= (Etacilpud y :: 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 x :: prim wA wB
x) =\/= (Normal y :: 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 cx :: [Non (RepoPatchV2 prim) wB]
cx xx :: FL prim wB wA
xx x :: Non (RepoPatchV2 prim) wB
x) =\/= (Conflictor cy :: [Non (RepoPatchV2 prim) wC]
cy yy :: FL prim wC wA
yy y :: 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 cx :: [Non (RepoPatchV2 prim) wA]
cx xx :: FL prim wA wB
xx x :: Non (RepoPatchV2 prim) wA
x) =\/= (InvConflictor cy :: [Non (RepoPatchV2 prim) wA]
cy yy :: FL prim wA wC
yy y :: 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
_ =\/= _ = EqCheck wB wC
forall wA wB. EqCheck wA wB
NotEq
eqSet :: Eq a => [a] -> [a] -> Bool
eqSet :: [a] -> [a] -> Bool
eqSet [] [] = Bool
True
eqSet (x :: a
x:xs :: [a]
xs) xys :: [a]
xys | Just ys :: [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 _ _ = Bool
False
remove1 :: Eq a => a -> [a] -> Maybe [a]
remove1 :: a -> [a] -> Maybe [a]
remove1 x :: a
x (y :: a
y : ys :: [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 _ [] = Maybe [a]
forall a. Maybe a
Nothing
minus :: Eq a => [a] -> [a] -> Maybe [a]
minus :: [a] -> [a] -> Maybe [a]
minus xs :: [a]
xs [] = [a] -> Maybe [a]
forall a. a -> Maybe a
Just [a]
xs
minus xs :: [a]
xs (y :: a
y:ys :: [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 c :: FL (RepoPatchV2 prim) wX wY
c x :: PrimOf (RepoPatchV2 prim) wY wZ
x)
| Just rc' :: 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 -> [FilePath]
nonTouches :: Non (RepoPatchV2 prim) wX -> [String]
nonTouches (Non c :: FL (RepoPatchV2 prim) wX wY
c x :: PrimOf (RepoPatchV2 prim) wY wZ
x) = FL (RepoPatchV2 prim) wX wZ -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
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
+>+ PrimOf (RepoPatchV2 prim) wY wZ -> RepoPatchV2 prim wY wZ
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim 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 f :: ByteString -> Bool
f (Non c :: FL (RepoPatchV2 prim) wX wY
c x :: 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 xs :: 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 xxx :: (:>) 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
deps :: RL p wX wZ
deps :> p :: p wZ wZ
p :> _ ->
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 NilFL pp :: 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 ds :: FL p wZ wY
ds pp :: PrimOf p wY wZ
pp ->
Doc -> Non p wX
forall a. Doc -> a
errorDoc (Doc -> Non p wX) -> Doc -> Non p wX
forall a b. (a -> b) -> a -> b
$ String -> Doc
redText "Weird case in toNons" Doc -> Doc -> Doc
$$
String -> Doc
redText "please report this bug!" Doc -> Doc -> Doc
$$
(case (:>) p (FL p) wX wX
xxx of
z :: p wX wZ
z :> zs :: 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 "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 "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 :: p wX wZ
p :> ps :: 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 rs :: RL p wA wB
rs l :: p wB wC
l 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 rs :: RL p wA wB
rs x :: p wB wC
x (y :: p wC wY
y :>: ys :: 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 _ 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 n :: Non (RepoPatchV2 prim) wX
n (p :: prim wX wY
p :>: ps :: FL prim wY wY
ps)
| Just n' :: 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 (PrimOf (RepoPatchV2 prim) wX wY -> RepoPatchV2 prim wX wY
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim prim wX wY
PrimOf (RepoPatchV2 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
p1 :: FL prim wY wZ
p1 :> p2 :: 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
p1 :: FL prim wX wZ
p1 :> p' :: prim wZ wZ
p' :> p2 :: 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
p1a :: FL prim wX wZ
p1a :> p1b :: 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 d :: 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 d :: 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 p :: 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 x :: [Non (RepoPatchV2 prim) wY]
x c :: FL prim wY wX
c p :: 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 x :: [Non (RepoPatchV2 prim) wX]
x c :: FL prim wX wY
c p :: 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
instance PrimPatch prim => Commute (RepoPatchV2 prim) where
commute :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
commute (x :: RepoPatchV2 prim wX wZ
x :> y :: RepoPatchV2 prim wZ wY
y) | Just (y' :: RepoPatchV2 prim wX wZ
y' :> x' :: RepoPatchV2 prim wZ wY
x') <-
(:>) (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) =
(:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. a -> Maybe a
Just (RepoPatchV2 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
:> RepoPatchV2 prim wZ wY
x')
commute (Normal x :: prim wX wZ
x :> Conflictor a1'nop2 :: [Non (RepoPatchV2 prim) wY]
a1'nop2 n1'x :: FL prim wY wZ
n1'x p1' :: Non (RepoPatchV2 prim) wY
p1')
| Just rn1' :: 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 p2 :: Non (RepoPatchV2 prim) wY
p2 : n1nons :: [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
([], NilFL, Non c :: FL (RepoPatchV2 prim) wY wY
c y :: 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)
(a1 :: [Non (RepoPatchV2 prim) wY]
a1, n1 :: FL prim wY wX
n1, _) ->
(:>) (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)
commute c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(InvConflictor{} :> Normal _) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (p :: * -> * -> *) wX wY.
(Invert p, Commute p) =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
invertCommute (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commute (Conflictor a1 :: [Non (RepoPatchV2 prim) wZ]
a1 n1 :: FL prim wZ wX
n1 p1 :: Non (RepoPatchV2 prim) wZ
p1 :> Conflictor a2 :: [Non (RepoPatchV2 prim) wY]
a2 n2 :: FL prim wY wZ
n2 p2 :: Non (RepoPatchV2 prim) wY
p2)
| Just a2_minus_p1 :: [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 a2_minus_p1n1 :: [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
n1' :: FL prim wY wZ
n1' :> n2' :: 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 a1'nop2 :: [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 a2'o :: [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 a2' :: [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 p2' :: 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
([], NilFL, Non c :: FL (RepoPatchV2 prim) wZ wY
c x :: 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
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')
_ -> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. a
impossible
_ -> (:>) (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 (_, rpn2 :: 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
commute c :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c@(InvConflictor{} :> InvConflictor{}) = (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (p :: * -> * -> *) wX wY.
(Invert p, Commute p) =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
invertCommute (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
c
commute _ = Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall a. Maybe a
Nothing
instance PrimPatch prim => Merge (RepoPatchV2 prim) where
merge :: (:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
merge (InvConflictor{} :\/: _) = (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. a
impossible
merge (_ :\/: InvConflictor{}) = (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. a
impossible
merge (Etacilpud _ :\/: _) = (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. a
impossible
merge (_ :\/: Etacilpud _) = (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. a
impossible
merge (Duplicate a :: Non (RepoPatchV2 prim) wZ
a :\/: Duplicate b :: 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 a :: Non (RepoPatchV2 prim) wZ
a :\/: b :: 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@(_ :\/: Duplicate _) = (:\/:) (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 (x :: RepoPatchV2 prim wZ wX
x :\/: y :: RepoPatchV2 prim wZ wY
y)
| Just (y' :: RepoPatchV2 prim wX wZ
y' :/\: x' :: RepoPatchV2 prim wY wZ
x') <-
(:\/:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (p :: * -> * -> *) wX wY.
(Invert p, Commute p) =>
(:\/:) p p wX wY -> Maybe ((:/\:) p p wX wY)
naturalMerge ((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 x :: prim wZ wX
x) :\/: ny :: RepoPatchV2 prim wZ wY
ny@(Normal y :: 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 x :: prim wZ wX
x :\/: Conflictor iy :: [Non (RepoPatchV2 prim) wY]
iy yy :: FL prim wY wZ
yy y :: 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
(x' :: Non (RepoPatchV2 prim) wY
x' : nyy :: [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 _) = (:\/:) (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 ix :: [Non (RepoPatchV2 prim) wX]
ix xx :: FL prim wX wZ
xx x :: Non (RepoPatchV2 prim) wX
x :\/: Conflictor iy :: [Non (RepoPatchV2 prim) wY]
iy yy :: FL prim wY wZ
yy y :: 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 rxx1 :: RL prim wX wI
rxx1 ryy1 :: RL prim wY wI
ryy1 c :: 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 (ixx' :: FL prim wY wZ
ixx' :> ryy' :: 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'
y' :: Non (RepoPatchV2 prim) wZ
y' : iy' :: [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)
x' :: Non (RepoPatchV2 prim) wZ
x' : ix' :: [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
Nothing -> (:/\:) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
forall a. a
impossible
instance PatchInspect prim => PatchInspect (RepoPatchV2 prim) where
listTouchedFiles :: RepoPatchV2 prim wX wY -> [String]
listTouchedFiles (Duplicate p :: Non (RepoPatchV2 prim) wX
p) = Non (RepoPatchV2 prim) wX -> [String]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [String]
nonTouches Non (RepoPatchV2 prim) wX
p
listTouchedFiles (Etacilpud p :: Non (RepoPatchV2 prim) wX
p) = Non (RepoPatchV2 prim) wX -> [String]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [String]
nonTouches Non (RepoPatchV2 prim) wX
p
listTouchedFiles (Normal p :: prim wX wY
p) = prim wX wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles prim wX wY
p
listTouchedFiles (Conflictor x :: [Non (RepoPatchV2 prim) wY]
x c :: FL prim wY wX
c p :: Non (RepoPatchV2 prim) wY
p) =
[String] -> [String]
forall a. Ord a => [a] -> [a]
nubSort ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wY -> [String])
-> [Non (RepoPatchV2 prim) wY] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Non (RepoPatchV2 prim) wY -> [String]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [String]
nonTouches [Non (RepoPatchV2 prim) wY]
x [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ FL prim wY wX -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles FL prim wY wX
c [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Non (RepoPatchV2 prim) wY -> [String]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [String]
nonTouches Non (RepoPatchV2 prim) wY
p
listTouchedFiles (InvConflictor x :: [Non (RepoPatchV2 prim) wX]
x c :: FL prim wX wY
c p :: Non (RepoPatchV2 prim) wX
p) =
[String] -> [String]
forall a. Ord a => [a] -> [a]
nubSort ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ (Non (RepoPatchV2 prim) wX -> [String])
-> [Non (RepoPatchV2 prim) wX] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Non (RepoPatchV2 prim) wX -> [String]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [String]
nonTouches [Non (RepoPatchV2 prim) wX]
x [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ FL prim wX wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles FL prim wX wY
c [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Non (RepoPatchV2 prim) wX -> [String]
forall (prim :: * -> * -> *) wX.
PatchInspect prim =>
Non (RepoPatchV2 prim) wX -> [String]
nonTouches Non (RepoPatchV2 prim) wX
p
hunkMatches :: (ByteString -> Bool) -> RepoPatchV2 prim wX wY -> Bool
hunkMatches f :: ByteString -> Bool
f (Duplicate p :: 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 f :: ByteString -> Bool
f (Etacilpud p :: 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 f :: ByteString -> Bool
f (Normal p :: prim wX wY
p) = (ByteString -> Bool) -> prim wX wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f prim wX wY
p
hunkMatches f :: ByteString -> Bool
f (Conflictor x :: [Non (RepoPatchV2 prim) wY]
x c :: FL prim wY wX
c p :: 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 f :: ByteString -> Bool
f (InvConflictor x :: [Non (RepoPatchV2 prim) wX]
x c :: FL prim wX wY
c p :: 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 x :: Non (RepoPatchV2 prim) wX
x ys :: [Non (RepoPatchV2 prim) wX]
ys = ([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])
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 ([], nc :: [Non (RepoPatchV2 prim) wX]
nc) = ([], [Non (RepoPatchV2 prim) wX]
nc)
acw (c :: Non (RepoPatchV2 prim) wX
c:cs :: [Non (RepoPatchV2 prim) wX]
cs, nc :: [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
(c1 :: [Non (RepoPatchV2 prim) wX]
c1, nc1 :: [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
(xs' :: [Non (RepoPatchV2 prim) wX]
xs', nc' :: [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 x :: Non (RepoPatchV2 prim) wX
x y :: 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 x :: Non (RepoPatchV2 prim) wX
x (Non cy :: FL (RepoPatchV2 prim) wX wY
cy y :: 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 cx' :: FL (RepoPatchV2 prim) wY wY
cx' x' :: PrimOf (RepoPatchV2 prim) wY wZ
x') ->
let iy :: RepoPatchV2 prim wZ wY
iy = PrimOf (RepoPatchV2 prim) wZ wY -> RepoPatchV2 prim wZ wY
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim (PrimOf (RepoPatchV2 prim) wZ wY -> RepoPatchV2 prim wZ wY)
-> PrimOf (RepoPatchV2 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
-> Either
(Sealed2 (RepoPatchV2 prim))
((:>) (FL (RepoPatchV2 prim)) (RepoPatchV2 prim) wZ wZ)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Either (Sealed2 p) ((:>) (FL p) p wX wY)
commuteFLorComplain (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
+>+ PrimOf (RepoPatchV2 prim) wY wZ -> RepoPatchV2 prim wY wZ
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim 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
Right _ -> Bool
False
Left _ -> Bool
True
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 xs :: FL (RepoPatchV2 prim) wX wY
xs _) (Non ys :: FL (RepoPatchV2 prim) wX wY
ys y :: 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
+>+ PrimOf (RepoPatchV2 prim) wY wZ -> RepoPatchV2 prim wY wZ
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim 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 _ -> Bool
True
Nothing -> Bool
False
(+++) :: Eq a => [a] -> [a] -> [a]
[] +++ :: [a] -> [a] -> [a]
+++ x :: [a]
x = [a]
x
x :: [a]
x +++ [] = [a]
x
(x :: a
x:xs :: [a]
xs) +++ xys :: [a]
xys | Just ys :: [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)
swapMerge :: Merge p => (p :\/: p) wX wY
-> (p :/\: p) wX wY
swapMerge :: (:\/:) p p wX wY -> (:/\:) p p wX wY
swapMerge (x :: p wZ wX
x :\/: y :: p wZ wY
y) = case (:\/:) p p wY wX -> (:/\:) p p wY wX
forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
merge (p wZ wY
y p wZ wY -> p wZ wX -> (:\/:) p p wY wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: p wZ wX
x) of x' :: p wY wZ
x' :/\: y' :: p wX wZ
y' -> p wX wZ
y' p wX wZ -> p wY wZ -> (:/\:) p p wX wY
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: p wY wZ
x'
invertCommute :: (Invert p, Commute p) => (p :> p) wX wY
-> Maybe ((p :> p) wX wY)
invertCommute :: (:>) p p wX wY -> Maybe ((:>) p p wX wY)
invertCommute (x :: p wX wZ
x :> y :: p wZ wY
y) = do ix' :: p wY wZ
ix' :> iy' :: p wZ wX
iy' <- (:>) p p wY wX -> Maybe ((:>) p p wY wX)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (p wZ wY -> p wY wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert p wZ wY
y p wY wZ -> p wZ wX -> (:>) p p wY wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> p wX wZ -> p wZ wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert p wX wZ
x)
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (p wZ wX -> p wX wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert p wZ wX
iy' p wX wZ -> p wZ wY -> (:>) p p wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> p wY wZ -> p wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert p wY wZ
ix')
invertCommuteNC :: PrimPatch prim => (RepoPatchV2 prim :> RepoPatchV2 prim) wX wY
-> Maybe ((RepoPatchV2 prim :> RepoPatchV2 prim) wX wY)
invertCommuteNC :: (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
invertCommuteNC (x :: RepoPatchV2 prim wX wZ
x :> y :: RepoPatchV2 prim wZ wY
y) = do
ix' :: RepoPatchV2 prim wY wZ
ix' :> iy' :: RepoPatchV2 prim wZ wX
iy' <- (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wY wX
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wY wX)
forall (p :: * -> * -> *) wX wY.
CommuteNoConflicts p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commuteNoConflicts (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
y RepoPatchV2 prim wY wZ
-> RepoPatchV2 prim wZ wX
-> (:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wY wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> 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) (RepoPatchV2 prim) wX wY
-> Maybe ((:>) (RepoPatchV2 prim) (RepoPatchV2 prim) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (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
iy' 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 wY wZ -> RepoPatchV2 prim wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RepoPatchV2 prim wY wZ
ix')
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 NilFL ys :: FL p wO wY
ys = FL p wO wO -> FL p wO wO -> FL p wO wY -> Common p wO wO wY
forall (p :: * -> * -> *) wO wI wX wY.
FL p wO wI -> FL p wI wX -> FL p wI wY -> Common p wO wX wY
Common 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 xs :: FL p wO wX
xs NilFL = FL p wO wO -> FL p wO wX -> FL p wO wO -> Common p wO wX wO
forall (p :: * -> * -> *) wO wI wX wY.
FL p wO wI -> FL p wI wX -> FL p wI wY -> Common p wO wX wY
Common 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 (x :: p wO wY
x :>: xs :: FL p wY wX
xs) xys :: FL p wO wY
xys | Just ys :: 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
Common c :: FL p wY wI
c xs' :: FL p wI wX
xs' ys' :: FL p wI wY
ys' -> FL p wO wI -> FL p wI wX -> FL p wI wY -> Common p wO wX wY
forall (p :: * -> * -> *) wO wI wX wY.
FL p wO wI -> FL p wI wX -> FL p wI wY -> Common p wO wX wY
Common (p wO wY
x p wO wY -> FL p wY wI -> FL p wO wI
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL p wY wI
c) FL p wI wX
xs' FL p wI wY
ys'
pullCommon (x :: p wO wY
x :>: xs :: FL p wY wX
xs) ys :: 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
xs1 :: FL p wO wZ
xs1 :> x' :: p wZ wZ
x' :> xs2 :: 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
Common c :: FL p wO wI
c xs1' :: FL p wI wZ
xs1' ys' :: FL p wI wY
ys' -> FL p wO wI -> FL p wI wX -> FL p wI wY -> Common p wO wX wY
forall (p :: * -> * -> *) wO wI wX wY.
FL p wO wI -> FL p wI wX -> FL p wI wY -> Common p wO wX wY
Common FL p wO wI
c (FL p wI wZ
xs1' FL p wI wZ -> FL p wZ wX -> FL p wI 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 wI wY
ys'
data Common p wO wX wY where
Common :: FL p wO wI -> FL p wI wX -> FL p wI wY -> Common 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 NilRL ys :: 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 xs :: RL p wX wO
xs 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 (xs :: RL p wX wY
xs :<: x :: p wY wO
x) xys :: RL p wY wO
xys | Just ys :: 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 xs' :: RL p wX wI
xs' ys' :: RL p wY wI
ys' c :: 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 (xs :: RL p wX wY
xs :<: x :: p wY wO
x) ys :: 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
xs1 :: RL p wX wZ
xs1 :> x' :: p wZ wZ
x' :> xs2 :: 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 xs2' :: RL p wZ wI
xs2' ys' :: RL p wY wI
ys' c :: 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 p :: RepoPatchV2 prim wX wY
p = FL prim wX wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply (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 p :: 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 x :: 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 (PrimPatch prim, Annotate prim) => Annotate (RepoPatchV2 prim) where
annotate :: RepoPatchV2 prim wX wY -> AnnotatedM ()
annotate = FL prim wX wY -> AnnotatedM ()
forall (p :: * -> * -> *) wX wY.
Annotate p =>
p wX wY -> AnnotatedM ()
annotate (FL prim wX wY -> AnnotatedM ())
-> (RepoPatchV2 prim wX wY -> FL prim wX wY)
-> RepoPatchV2 prim wX wY
-> AnnotatedM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RepoPatchV2 prim wX wY -> FL prim wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect
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 = "duplicate"
etacilpud :: String
etacilpud = "etacilpud"
conflictor :: String
conflictor = "conflictor"
rotcilfnoc :: String
rotcilfnoc = "rotcilfnoc"
instance PrimPatch prim => ShowPatchBasic (RepoPatchV2 prim) where
showPatch :: ShowPatchFor -> RepoPatchV2 prim wX wY -> Doc
showPatch f :: ShowPatchFor
f (Duplicate d :: 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 f :: ShowPatchFor
f (Etacilpud d :: 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 f :: ShowPatchFor
f (Normal p :: 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 f :: ShowPatchFor
f (Conflictor i :: [Non (RepoPatchV2 prim) wY]
i NilFL p :: 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 "[]" 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 f :: ShowPatchFor
f (Conflictor i :: [Non (RepoPatchV2 prim) wY]
i cs :: FL prim wY wX
cs p :: 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 "[" 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 "]" 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 f :: ShowPatchFor
f (InvConflictor i :: [Non (RepoPatchV2 prim) wX]
i NilFL p :: 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 "[]" 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 f :: ShowPatchFor
f (InvConflictor i :: [Non (RepoPatchV2 prim) wX]
i cs :: FL prim wX wY
cs p :: 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 "[" 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 "]" 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 f :: ShowPatchFor
f (Normal p :: 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 f :: ShowPatchFor
f p :: 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.
(Conflict e, PrimPatchBase e) =>
e wX wY -> Doc
plainSummary
summaryFL :: FL (RepoPatchV2 prim) wX wY -> Doc
summaryFL = FL (RepoPatchV2 prim) wX wY -> Doc
forall (e :: * -> * -> *) wX wY.
(Conflict e, PrimPatchBase e) =>
e wX wY -> Doc
plainSummary
thing :: RepoPatchV2 prim wX wY -> String
thing _ = "change"
instance PrimPatch prim => ReadPatch (RepoPatchV2 prim) where
readPatch' :: m (Sealed (RepoPatchV2 prim wX))
readPatch' = do
m ()
forall (m :: * -> *). ParserM m => m ()
skipSpace
let str :: String -> m ()
str = ByteString -> m ()
forall (m :: * -> *). ParserM m => ByteString -> m ()
string (ByteString -> m ()) -> (String -> ByteString) -> String -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BC.pack
readConflictorPs :: m ([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
readConflictorPs = do
[Non (RepoPatchV2 prim) wX]
i <- m [Non (RepoPatchV2 prim) wX]
forall (p :: * -> * -> *) (m :: * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p, ParserM m) =>
m [Non p wX]
readNons
Sealed (FL prim wX)
ps <- (forall wY. m (Sealed (prim wY)))
-> Char -> Char -> m (Sealed (FL prim wX))
forall (p :: * -> * -> *) (m :: * -> *) wX.
ParserM m =>
(forall wY. m (Sealed (p wY)))
-> Char -> Char -> m (Sealed (FL p wX))
bracketedFL forall wY. m (Sealed (prim wY))
forall (p :: * -> * -> *) (m :: * -> *) wX.
(ReadPatch p, ParserM m) =>
m (Sealed (p wX))
readPatch' '[' ']'
Non (RepoPatchV2 prim) wX
p <- m (Non (RepoPatchV2 prim) wX)
forall (p :: * -> * -> *) (m :: * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p, ParserM m) =>
m (Non p wX)
readNon
([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
-> m ([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)
[m (Sealed (RepoPatchV2 prim wX))]
-> m (Sealed (RepoPatchV2 prim wX))
forall (f :: * -> *) a. Alternative f => [f a] -> f a
choice [ do String -> m ()
str String
duplicate
Non (RepoPatchV2 prim) wX
p <- m (Non (RepoPatchV2 prim) wX)
forall (p :: * -> * -> *) (m :: * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p, ParserM m) =>
m (Non p wX)
readNon
Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX) -> m (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 -> m ()
str String
etacilpud
Non (RepoPatchV2 prim) wX
p <- m (Non (RepoPatchV2 prim) wX)
forall (p :: * -> * -> *) (m :: * -> *) wX.
(ReadPatch p, PatchListFormat p, PrimPatchBase p, ParserM m) =>
m (Non p wX)
readNon
Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX) -> m (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 -> m ()
str String
conflictor
(i :: [Non (RepoPatchV2 prim) Any]
i, Sealed ps :: FL prim Any wX
ps, p :: Non (RepoPatchV2 prim) Any
p) <- m ([Non (RepoPatchV2 prim) Any], Sealed (FL prim Any),
Non (RepoPatchV2 prim) Any)
forall wX wX wX.
m ([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
readConflictorPs
Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX) -> m (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 -> m ()
str String
rotcilfnoc
(i :: [Non (RepoPatchV2 prim) wX]
i, Sealed ps :: FL prim wX wX
ps, p :: Non (RepoPatchV2 prim) wX
p) <- m ([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
forall wX wX wX.
m ([Non (RepoPatchV2 prim) wX], Sealed (FL prim wX),
Non (RepoPatchV2 prim) wX)
readConflictorPs
Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX) -> m (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 p :: prim wX wX
p <- m (Sealed (prim wX))
forall (p :: * -> * -> *) (m :: * -> *) wX.
(ReadPatch p, ParserM m) =>
m (Sealed (p wX))
readPatch'
Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (RepoPatchV2 prim wX) -> m (Sealed (RepoPatchV2 prim wX)))
-> Sealed (RepoPatchV2 prim wX) -> m (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 d :: Int
d (Normal prim :: 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 "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
+ 1) prim wX wY
prim
showsPrec d :: Int
d (Duplicate x :: 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 "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
+ 1) Non (RepoPatchV2 prim) wX
x
showsPrec d :: Int
d (Etacilpud x :: 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 "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
+ 1) Non (RepoPatchV2 prim) wX
x
showsPrec d :: Int
d (Conflictor ix :: [Non (RepoPatchV2 prim) wY]
ix xx :: FL prim wY wX
xx x :: 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 "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
+ 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
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
+ 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
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
+ 1) Non (RepoPatchV2 prim) wY
x
showsPrec d :: Int
d (InvConflictor ix :: [Non (RepoPatchV2 prim) wX]
ix xx :: FL prim wX wY
xx x :: 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 "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
+ 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
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
+ 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
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
+ 1) Non (RepoPatchV2 prim) wX
x
instance Show2 prim => Show1 (RepoPatchV2 prim wX) where
showDict1 :: ShowDict (RepoPatchV2 prim wX wX)
showDict1 = ShowDict (RepoPatchV2 prim wX wX)
forall a. Show a => ShowDict a
ShowDictClass
instance Show2 prim => Show2 (RepoPatchV2 prim) where
showDict2 :: ShowDict (RepoPatchV2 prim wX wY)
showDict2 = ShowDict (RepoPatchV2 prim wX wY)
forall a. Show a => ShowDict a
ShowDictClass
instance PrimPatch prim => Nonable (RepoPatchV2 prim) where
non :: RepoPatchV2 prim wX wY -> Non (RepoPatchV2 prim) wX
non (Duplicate d :: Non (RepoPatchV2 prim) wX
d) = Non (RepoPatchV2 prim) wX
d
non (Etacilpud d :: 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 p :: 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 _ xx :: FL prim wY wX
xx x :: 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 _ _ n :: 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 _) = FL (PrimOf (RepoPatchV2 prim)) wX wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Etacilpud _) = FL (PrimOf (RepoPatchV2 prim)) wX wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Normal p :: prim wX wY
p) = prim wX wY
p prim wX wY -> FL prim wY wY -> FL prim wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL prim wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
effect (Conflictor _ e :: FL prim wY wX
e _) = 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 _ e :: FL prim wX wY
e _) = FL prim wX wY
FL (PrimOf (RepoPatchV2 prim)) wX wY
e
effectRL :: RepoPatchV2 prim wX wY -> RL (PrimOf (RepoPatchV2 prim)) wX wY
effectRL (Duplicate _) = RL (PrimOf (RepoPatchV2 prim)) wX wY
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
effectRL (Etacilpud _) = RL (PrimOf (RepoPatchV2 prim)) wX wY
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL
effectRL (Normal p :: prim wX wY
p) = RL prim wX wX
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL RL prim wX wX -> prim wX wY -> RL prim wX wY
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: prim wX wY
p
effectRL (Conflictor _ e :: FL prim wY wX
e _) = 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
e
effectRL (InvConflictor _ e :: FL prim wX wY
e _) = FL prim wX wY -> RL prim wX wY
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL prim wX wY
e
instance IsHunk prim => IsHunk (RepoPatchV2 prim) where
isHunk :: RepoPatchV2 prim wX wY -> Maybe (FileHunk wX wY)
isHunk rp :: RepoPatchV2 prim wX wY
rp = do Normal p :: 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 p :: [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 f :: 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)