{-# OPTIONS_GHC -fno-warn-orphans #-}
module Darcs.Patch.V3.Resolution () where
import Data.Maybe ( catMaybes )
import qualified Data.Map as M
import qualified Data.Set as S
import qualified Data.Vector as V
import Darcs.Prelude
import Darcs.Patch.Commute ( commuteFL )
import Darcs.Patch.Conflict ( Conflict(..), ConflictDetails(..), mangleOrFail )
import Darcs.Patch.Ident
( Ident(..)
, SignedId(..)
, StorableId(..)
, findCommonFL
)
import Darcs.Patch.Merge ( CleanMerge(..) )
import Darcs.Patch.Prim ( PrimPatch )
import Darcs.Patch.Prim.WithName ( PrimWithName, wnPatch )
import Darcs.Patch.Show hiding ( displayPatch )
import Darcs.Patch.V3.Contexted
( Contexted
, ctxId
, ctxNoConflict
, ctxToFL
)
import Darcs.Patch.V3.Core ( RepoPatchV3(..), (-|) )
import Darcs.Patch.Witnesses.Ordered
( (:/\:)(..)
, (:>)(..)
, (:\/:)(..)
, FL(..)
, Fork(..)
, RL(..)
, (+>+)
, mapFL_FL
)
import Darcs.Patch.Witnesses.Sealed ( Sealed(..), mapSeal )
import Darcs.Patch.Witnesses.Show ( Show2 )
import Darcs.Util.Graph ( Vertex, components, ltmis )
import Darcs.Util.Printer
( Doc
, ($$)
, redText
, renderString
)
instance (SignedId name, StorableId name, PrimPatch prim) =>
Conflict (RepoPatchV3 name prim) where
resolveConflicts :: forall wO wX wY.
RL (RepoPatchV3 name prim) wO wX
-> RL (RepoPatchV3 name prim) wX wY
-> [ConflictDetails (PrimOf (RepoPatchV3 name prim)) wY]
resolveConflicts RL (RepoPatchV3 name prim) wO wX
context =
forall wX. [Node name prim wX] -> [ConflictDetails prim wX]
resolveComponents forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall name (prim :: * -> * -> *) wY.
(SignedId name, PrimPatch prim) =>
[Contexted (PrimWithName name prim) wY] -> [Node name prim wY]
findEdges forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall name (prim :: * -> * -> *) wO wX wY.
(SignedId name, StorableId name, PrimPatch prim) =>
RL (RepoPatchV3 name prim) wO wX
-> RL (RepoPatchV3 name prim) wX wY
-> [Contexted (PrimWithName name prim) wY]
findVertices RL (RepoPatchV3 name prim) wO wX
context
where
resolveComponents :: [Node name prim wX] -> [ConflictDetails prim wX]
resolveComponents :: forall wX. [Node name prim wX] -> [ConflictDetails prim wX]
resolveComponents = forall a b. (a -> b) -> [a] -> [b]
map (forall (prim :: * -> * -> *) wX.
PrimMangleUnravelled prim =>
Unravelled prim wX -> ConflictDetails prim wX
mangleOrFail forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall wX.
[Contexted (PrimWithName name prim) wX] -> Sealed (FL prim wX)
mergeThem) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall name (prim :: * -> * -> *) wX.
SignedId name =>
[Node name prim wX] -> [[[Contexted (PrimWithName name prim) wX]]]
alternatives
mergeThem :: [Contexted (PrimWithName name prim) wX] -> Sealed (FL prim wX)
mergeThem :: forall wX.
[Contexted (PrimWithName name prim) wX] -> Sealed (FL prim wX)
mergeThem = forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (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 name (p :: * -> * -> *) wX wY.
PrimWithName name p wX wY -> p wX wY
wnPatch) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall name (p :: * -> * -> *) wX.
(SignedId name, StorableId name, PrimPatch p) =>
[Sealed (FL (PrimWithName name p) wX)]
-> Sealed (FL (PrimWithName name p) wX)
mergeList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (p :: * -> * -> *) wX. Contexted p wX -> Sealed (FL p wX)
ctxToFL
data Node name prim wY = Node
{ forall name (prim :: * -> * -> *) wY.
Node name prim wY -> Contexted (PrimWithName name prim) wY
self :: Contexted (PrimWithName name prim) wY
, forall name (prim :: * -> * -> *) wY.
Node name prim wY -> Set (Contexted (PrimWithName name prim) wY)
neighbors :: S.Set (Contexted (PrimWithName name prim) wY)
}
deriving instance (Show name, Show2 prim) => Show (Node name prim wY)
findVertices
:: forall name prim wO wX wY
. (SignedId name, StorableId name, PrimPatch prim)
=> RL (RepoPatchV3 name prim) wO wX
-> RL (RepoPatchV3 name prim) wX wY
-> [Contexted (PrimWithName name prim) wY]
findVertices :: forall name (prim :: * -> * -> *) wO wX wY.
(SignedId name, StorableId name, PrimPatch prim) =>
RL (RepoPatchV3 name prim) wO wX
-> RL (RepoPatchV3 name prim) wX wY
-> [Contexted (PrimWithName name prim) wY]
findVertices RL (RepoPatchV3 name prim) wO wX
context RL (RepoPatchV3 name prim) wX wY
patches = forall wA wB.
Set name
-> [Contexted (PrimWithName name prim) wY]
-> RL (RepoPatchV3 name prim) wO wA
-> RL (RepoPatchV3 name prim) wA wB
-> FL (RepoPatchV3 name prim) wB wY
-> [Contexted (PrimWithName name prim) wY]
go forall a. Set a
S.empty [] RL (RepoPatchV3 name prim) wO wX
context RL (RepoPatchV3 name prim) wX wY
patches forall (a :: * -> * -> *) wX. FL a wX wX
NilFL where
go :: S.Set name
-> [Contexted (PrimWithName name prim) wY]
-> RL (RepoPatchV3 name prim) wO wA
-> RL (RepoPatchV3 name prim) wA wB
-> FL (RepoPatchV3 name prim) wB wY
-> [Contexted (PrimWithName name prim) wY]
go :: forall wA wB.
Set name
-> [Contexted (PrimWithName name prim) wY]
-> RL (RepoPatchV3 name prim) wO wA
-> RL (RepoPatchV3 name prim) wA wB
-> FL (RepoPatchV3 name prim) wB wY
-> [Contexted (PrimWithName name prim) wY]
go Set name
check [Contexted (PrimWithName name prim) wY]
done RL (RepoPatchV3 name prim) wO wA
cs (RL (RepoPatchV3 name prim) wA wY
ps :<: RepoPatchV3 name prim wY wB
p) FL (RepoPatchV3 name prim) wB wY
passedby
| forall {name} {prim :: * -> * -> *} {wX} {wY}.
RepoPatchV3 name prim wX wY -> Bool
isConflicted RepoPatchV3 name prim wY wB
p Bool -> Bool -> Bool
|| forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident RepoPatchV3 name prim wY wB
p forall a. Ord a => a -> Set a -> Bool
`S.member` Set name
check
, Just (FL (RepoPatchV3 name prim) wY wZ
_ :> Conflictor FL (PrimWithName name prim) wZ wY
_ Set (Contexted (PrimWithName name prim) wY)
_ Contexted (PrimWithName name prim) wY
cp) <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Maybe ((:>) (FL p) p wX wY)
commuteFL (RepoPatchV3 name prim wY wB
p forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV3 name prim) wB wY
passedby) =
forall wA wB.
Set name
-> [Contexted (PrimWithName name prim) wY]
-> RL (RepoPatchV3 name prim) wO wA
-> RL (RepoPatchV3 name prim) wA wB
-> FL (RepoPatchV3 name prim) wB wY
-> [Contexted (PrimWithName name prim) wY]
go (forall {b} {prim :: * -> * -> *} {wX} {wX}.
SignedId b =>
RepoPatchV3 b prim wX wX -> Set b
conflicts RepoPatchV3 name prim wY wB
p forall a. Semigroup a => a -> a -> a
<> forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident RepoPatchV3 name prim wY wB
p forall a. Ord a => a -> Set a -> Set a
-| Set name
check) (Contexted (PrimWithName name prim) wY
cp forall a. a -> [a] -> [a]
: [Contexted (PrimWithName name prim) wY]
done) RL (RepoPatchV3 name prim) wO wA
cs RL (RepoPatchV3 name prim) wA wY
ps (RepoPatchV3 name prim wY wB
p forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL (RepoPatchV3 name prim) wB wY
passedby)
| Bool
otherwise =
forall wA wB.
Set name
-> [Contexted (PrimWithName name prim) wY]
-> RL (RepoPatchV3 name prim) wO wA
-> RL (RepoPatchV3 name prim) wA wB
-> FL (RepoPatchV3 name prim) wB wY
-> [Contexted (PrimWithName name prim) wY]
go (forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident RepoPatchV3 name prim wY wB
p forall a. Ord a => a -> Set a -> Set a
-| Set name
check) [Contexted (PrimWithName name prim) wY]
done RL (RepoPatchV3 name prim) wO wA
cs RL (RepoPatchV3 name prim) wA wY
ps (RepoPatchV3 name prim wY wB
p forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL (RepoPatchV3 name prim) wB wY
passedby)
go Set name
check [Contexted (PrimWithName name prim) wY]
done RL (RepoPatchV3 name prim) wO wA
_ RL (RepoPatchV3 name prim) wA wB
NilRL FL (RepoPatchV3 name prim) wB wY
_
| forall a. Set a -> Bool
S.null Set name
check = [Contexted (PrimWithName name prim) wY]
done
go Set name
check [Contexted (PrimWithName name prim) wY]
done (RL (RepoPatchV3 name prim) wO wY
cs :<: RepoPatchV3 name prim wY wA
p) RL (RepoPatchV3 name prim) wA wB
NilRL FL (RepoPatchV3 name prim) wB wY
passedby
| forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident RepoPatchV3 name prim wY wA
p forall a. Ord a => a -> Set a -> Bool
`S.member` Set name
check
, Just (FL (RepoPatchV3 name prim) wY wZ
_ :> Conflictor FL (PrimWithName name prim) wZ wY
_ Set (Contexted (PrimWithName name prim) wY)
_ Contexted (PrimWithName name prim) wY
cp) <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p (FL p) wX wY -> Maybe ((:>) (FL p) p wX wY)
commuteFL (RepoPatchV3 name prim wY wA
p forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RepoPatchV3 name prim) wB wY
passedby) =
forall wA wB.
Set name
-> [Contexted (PrimWithName name prim) wY]
-> RL (RepoPatchV3 name prim) wO wA
-> RL (RepoPatchV3 name prim) wA wB
-> FL (RepoPatchV3 name prim) wB wY
-> [Contexted (PrimWithName name prim) wY]
go (forall {b} {prim :: * -> * -> *} {wX} {wX}.
SignedId b =>
RepoPatchV3 b prim wX wX -> Set b
conflicts RepoPatchV3 name prim wY wA
p forall a. Semigroup a => a -> a -> a
<> forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident RepoPatchV3 name prim wY wA
p forall a. Ord a => a -> Set a -> Set a
-| Set name
check) (Contexted (PrimWithName name prim) wY
cp forall a. a -> [a] -> [a]
: [Contexted (PrimWithName name prim) wY]
done) RL (RepoPatchV3 name prim) wO wY
cs forall (a :: * -> * -> *) wX. RL a wX wX
NilRL (RepoPatchV3 name prim wY wA
p forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL (RepoPatchV3 name prim) wB wY
passedby)
| Bool
otherwise =
forall wA wB.
Set name
-> [Contexted (PrimWithName name prim) wY]
-> RL (RepoPatchV3 name prim) wO wA
-> RL (RepoPatchV3 name prim) wA wB
-> FL (RepoPatchV3 name prim) wB wY
-> [Contexted (PrimWithName name prim) wY]
go (forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident RepoPatchV3 name prim wY wA
p forall a. Ord a => a -> Set a -> Set a
-| Set name
check) [Contexted (PrimWithName name prim) wY]
done RL (RepoPatchV3 name prim) wO wY
cs forall (a :: * -> * -> *) wX. RL a wX wX
NilRL (RepoPatchV3 name prim wY wA
p forall (a :: * -> * -> *) wX wX wZ.
a wX wX -> FL a wX wZ -> FL a wX wZ
:>: FL (RepoPatchV3 name prim) wB wY
passedby)
go Set name
_ [Contexted (PrimWithName name prim) wY]
_ RL (RepoPatchV3 name prim) wO wA
NilRL RL (RepoPatchV3 name prim) wA wB
NilRL FL (RepoPatchV3 name prim) wB wY
_ = forall a. HasCallStack => String -> a
error String
"autsch, hit the bottom"
isConflicted :: RepoPatchV3 name prim wX wY -> Bool
isConflicted Conflictor{} = Bool
True
isConflicted Prim{} = Bool
False
conflicts :: RepoPatchV3 b prim wX wX -> Set b
conflicts (Conflictor FL (PrimWithName b prim) wX wX
_ Set (Contexted (PrimWithName b prim) wX)
x Contexted (PrimWithName b prim) wX
_) = forall b a. Ord b => (a -> b) -> Set a -> Set b
S.map forall (p :: * -> * -> *) wX.
Ident p =>
Contexted p wX -> PatchId p
ctxId Set (Contexted (PrimWithName b prim) wX)
x
conflicts RepoPatchV3 b prim wX wX
_ = forall a. Set a
S.empty
conflictsWith
:: (SignedId name, PrimPatch prim)
=> Contexted (PrimWithName name prim) wX
-> Contexted (PrimWithName name prim) wX
-> Bool
conflictsWith :: forall name (prim :: * -> * -> *) wX.
(SignedId name, PrimPatch prim) =>
Contexted (PrimWithName name prim) wX
-> Contexted (PrimWithName name prim) wX -> Bool
conflictsWith Contexted (PrimWithName name prim) wX
cp Contexted (PrimWithName name prim) wX
cq = Bool -> Bool
not (forall (p :: * -> * -> *) wX.
(CleanMerge p, Commute p, Ident p) =>
Contexted p wX -> Contexted p wX -> Bool
ctxNoConflict Contexted (PrimWithName name prim) wX
cp Contexted (PrimWithName name prim) wX
cq)
findEdges
:: (SignedId name, PrimPatch prim)
=> [Contexted (PrimWithName name prim) wY] -> [Node name prim wY]
findEdges :: forall name (prim :: * -> * -> *) wY.
(SignedId name, PrimPatch prim) =>
[Contexted (PrimWithName name prim) wY] -> [Node name prim wY]
findEdges = forall {name} {prim :: * -> * -> *} {wY}.
(SignedId name, CleanMerge prim, Commute prim, Invert prim,
Eq2 prim, IsHunk prim, PatchInspect prim, RepairToFL prim,
Show2 prim, PrimConstruct prim, PrimCanonize prim,
PrimClassify prim, PrimDetails prim, PrimApply prim, PrimSift prim,
PrimMangleUnravelled prim, ReadPatch prim, ShowPatch prim,
ShowContextPatch prim, PatchListFormat prim) =>
Set (Contexted (PrimWithName name prim) wY) -> [Node name prim wY]
fromVertexSet forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => [a] -> Set a
S.fromList
where
fromVertexSet :: Set (Contexted (PrimWithName name prim) wY) -> [Node name prim wY]
fromVertexSet Set (Contexted (PrimWithName name prim) wY)
vs = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Contexted (PrimWithName name prim) wY
-> [Node name prim wY] -> [Node name prim wY]
go [] Set (Contexted (PrimWithName name prim) wY)
vs
where
go :: Contexted (PrimWithName name prim) wY
-> [Node name prim wY] -> [Node name prim wY]
go Contexted (PrimWithName name prim) wY
cp [Node name prim wY]
ns = forall name (prim :: * -> * -> *) wY.
Contexted (PrimWithName name prim) wY
-> Set (Contexted (PrimWithName name prim) wY) -> Node name prim wY
Node Contexted (PrimWithName name prim) wY
cp (forall a. (a -> Bool) -> Set a -> Set a
S.filter (forall name (prim :: * -> * -> *) wX.
(SignedId name, PrimPatch prim) =>
Contexted (PrimWithName name prim) wX
-> Contexted (PrimWithName name prim) wX -> Bool
conflictsWith Contexted (PrimWithName name prim) wY
cp) Set (Contexted (PrimWithName name prim) wY)
vs) forall a. a -> [a] -> [a]
: [Node name prim wY]
ns
alternatives
:: SignedId name
=> [Node name prim wX]
-> [[[Contexted (PrimWithName name prim) wX]]]
alternatives :: forall name (prim :: * -> * -> *) wX.
SignedId name =>
[Node name prim wX] -> [[[Contexted (PrimWithName name prim) wX]]]
alternatives [Node name prim wX]
nodes =
forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (a -> b) -> [a] -> [b]
map [Int] -> [Contexted (PrimWithName name prim) wX]
fromVertexSet forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Bool, Bool) -> Component -> [[Int]]
ltmis (Bool
True, Bool
True)) forall a b. (a -> b) -> a -> b
$ Graph -> [Component]
components Graph
graph
where
from_index :: Vector (Contexted (PrimWithName name prim) wX)
from_index = forall a. [a] -> Vector a
V.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall name (prim :: * -> * -> *) wY.
Node name prim wY -> Contexted (PrimWithName name prim) wY
self [Node name prim wX]
nodes
to_index :: Map name Int
to_index = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> [b] -> [(a, b)]
zip (forall a b. (a -> b) -> [a] -> [b]
map (forall (p :: * -> * -> *) wX.
Ident p =>
Contexted p wX -> PatchId p
ctxId forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall name (prim :: * -> * -> *) wY.
Node name prim wY -> Contexted (PrimWithName name prim) wY
self) [Node name prim wX]
nodes) [(Int
0::Vertex) ..]
graph :: Graph
graph = forall a. [a] -> Vector a
V.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall {prim :: * -> * -> *} {wX}. Node name prim wX -> [Int]
adj_list [Node name prim wX]
nodes
adj_list :: Node name prim wX -> [Int]
adj_list =
forall a. [Maybe a] -> [a]
catMaybes forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Map name Int
to_index forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (p :: * -> * -> *) wX.
Ident p =>
Contexted p wX -> PatchId p
ctxId) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Set a -> [a]
S.toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall name (prim :: * -> * -> *) wY.
Node name prim wY -> Set (Contexted (PrimWithName name prim) wY)
neighbors
fromVertexSet :: [Int] -> [Contexted (PrimWithName name prim) wX]
fromVertexSet = forall a b. (a -> b) -> [a] -> [b]
map (Vector (Contexted (PrimWithName name prim) wX)
from_index forall a. Vector a -> Int -> a
V.!)
mergeList
:: (SignedId name, StorableId name, PrimPatch p)
=> [Sealed (FL (PrimWithName name p) wX)] -> Sealed (FL (PrimWithName name p) wX)
mergeList :: forall name (p :: * -> * -> *) wX.
(SignedId name, StorableId name, PrimPatch p) =>
[Sealed (FL (PrimWithName name p) wX)]
-> Sealed (FL (PrimWithName name p) wX)
mergeList = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall {p :: * -> * -> *} {wX}.
(Commute p, Ident p, CleanMerge p, PatchListFormat p,
ShowPatchBasic p) =>
Sealed (FL p wX) -> Sealed (FL p wX) -> Sealed (FL p wX)
mergeTwo (forall (a :: * -> *) wX. a wX -> Sealed a
Sealed forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
where
mergeTwo :: Sealed (FL p wX) -> Sealed (FL p wX) -> Sealed (FL p wX)
mergeTwo (Sealed FL p wX wX
ps) (Sealed FL p wX wX
qs) =
case forall (p :: * -> * -> *) wX wY wZ.
(Commute p, Ident p) =>
FL p wX wY -> FL p wX wZ -> Fork (FL p) (FL p) (FL p) wX wY wZ
findCommonFL FL p wX wX
ps FL p wX wX
qs of
Fork FL p wX wU
com FL p wU wX
ps' FL p wU wX
qs' ->
case forall (p :: * -> * -> *) wX wY.
CleanMerge p =>
(:\/:) p p wX wY -> Maybe ((:/\:) p p wX wY)
cleanMerge (FL p wU wX
ps' forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: FL p wU wX
qs') of
Just (FL p wX wZ
qs'' :/\: FL p wX wZ
_) -> forall (a :: * -> *) wX. a wX -> Sealed a
Sealed forall a b. (a -> b) -> a -> b
$ FL p wX wU
com forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL p wU wX
ps' forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL p wX wZ
qs''
Maybe ((:/\:) (FL p) (FL p) wX wX)
Nothing ->
forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ Doc -> String
renderString
forall a b. (a -> b) -> a -> b
$ String -> Doc
redText String
"resolutions conflict:"
Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch FL p wX wX
ps
Doc -> Doc -> Doc
$$ String -> Doc
redText String
"conflicts with"
Doc -> Doc -> Doc
$$ forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch FL p wX wX
qs
displayPatch :: ShowPatchBasic p => p wX wY -> Doc
displayPatch :: forall (p :: * -> * -> *) wX wY. ShowPatchBasic p => p wX wY -> Doc
displayPatch p wX wY
p = forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForStorage p wX wY
p