{-# LANGUAGE UndecidableInstances #-}
module Darcs.Patch.Rebase.Item
    ( RebaseItem(..)
    , simplifyPush, simplifyPushes
    , countToEdit
    ) where

import Prelude ()
import Darcs.Prelude

import Darcs.Patch.Commute ( selfCommuter )
import Darcs.Patch.Conflict ( Conflict(..), CommuteNoConflicts(..) )
import Darcs.Patch.Effect ( Effect(..) )
import Darcs.Patch.FileHunk ( IsHunk(..) )
import Darcs.Patch.Format ( PatchListFormat(..) )
import Darcs.Patch.Named ( Named(..), commuterIdNamed )
import Darcs.Patch.Apply ( Apply(..) )
import Darcs.Patch.Commute ( Commute(..) )
import Darcs.Patch.Invert ( Invert(..) )
import Darcs.Patch.Inspect ( PatchInspect(..) )
import Darcs.Patch.Read ( ReadPatch(..) )
import Darcs.Patch.Show ( ShowPatch(..) )
import Darcs.Patch.Prim
    ( PrimPatchBase, PrimOf, FromPrim(..), FromPrim(..), canonizeFL )
import Darcs.Patch.Rebase.Fixup ( RebaseFixup(..) )
import Darcs.Patch.Rebase.Name
    ( RebaseName(..)
    , commutePrimName, commuteNamePrim
    , canonizeNamePair
    )
import Darcs.Patch.Repair ( Check(..) )
import Darcs.Patch.Show ( ShowPatchBasic(..) )
import Darcs.Patch.Summary ( plainSummaryPrim )
import Darcs.Patch.ReadMonads ( ParserM, lexString )
import Darcs.Patch.Witnesses.Eq
import Darcs.Patch.Witnesses.Ordered
import Darcs.Patch.Witnesses.Sealed
import Darcs.Patch.Witnesses.Show
    ( Show1(..), Show2(..), showsPrec2
    , ShowDict(ShowDictClass), appPrec
    )
import Darcs.Patch.Witnesses.Unsafe ( unsafeCoerceP )
import qualified Darcs.Util.Diff as D ( DiffAlgorithm )
import Darcs.Util.Printer ( vcat, blueText, ($$), (<+>) )

import Control.Applicative ( (<|>) )
import qualified Data.ByteString as B ( ByteString )
import qualified Data.ByteString.Char8 as BC ( pack )

-- |A single item in the rebase state consists of either
-- a patch that is being edited, or a fixup that adjusts
-- the context so that a subsequent patch that is being edited
-- \"makes sense\".
--
-- @ToEdit@ holds a patch that is being edited. The name ('PatchInfo') of
-- the patch will typically be the name the patch had before
-- it was added to the rebase state; if it is moved back
-- into the repository it must be given a fresh name to account
-- for the fact that it will not necessarily have the same
-- dependencies as the original patch. This is typically
-- done by changing the @Ignore-This@ junk.
--
-- @Fixup@ adjusts the context so that a subsequent @ToEdit@ patch
-- is correct. Where possible, @Fixup@ changes are commuted
-- as far as possible into the rebase state, so any remaining
-- ones will typically cause a conflict when the @ToEdit@ patch
-- is moved back into the repository.
data RebaseItem p wX wY where
    ToEdit :: Named p wX wY -> RebaseItem p wX wY
    Fixup :: RebaseFixup p wX wY -> RebaseItem p wX wY

instance (Show2 p, Show2 (PrimOf p)) => Show (RebaseItem p wX wY) where
    showsPrec :: Int -> RebaseItem p wX wY -> ShowS
showsPrec d :: Int
d (ToEdit p :: Named p wX wY
p) =
        Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
appPrec) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString "ToEdit " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Named p wX wY -> ShowS
forall (a :: * -> * -> *) wX wY. Show2 a => Int -> a wX wY -> ShowS
showsPrec2 (Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1) Named p wX wY
p
    showsPrec d :: Int
d (Fixup p :: RebaseFixup p wX wY
p) =
        Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
appPrec) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString "Fixup " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> RebaseFixup p wX wY -> ShowS
forall (a :: * -> * -> *) wX wY. Show2 a => Int -> a wX wY -> ShowS
showsPrec2 (Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1) RebaseFixup p wX wY
p

instance (Show2 p, Show2 (PrimOf p)) => Show1 (RebaseItem p wX) where
    showDict1 :: ShowDict (RebaseItem p wX wX)
showDict1 = ShowDict (RebaseItem p wX wX)
forall a. Show a => ShowDict a
ShowDictClass

instance (Show2 p, Show2 (PrimOf p)) => Show2 (RebaseItem p) where
    showDict2 :: ShowDict (RebaseItem p wX wY)
showDict2 = ShowDict (RebaseItem p wX wY)
forall a. Show a => ShowDict a
ShowDictClass

countToEdit :: FL (RebaseItem p) wX wY -> Int
countToEdit :: FL (RebaseItem p) wX wY -> Int
countToEdit NilFL = 0
countToEdit (ToEdit _ :>: ps :: FL (RebaseItem p) wY wY
ps) = 1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ FL (RebaseItem p) wY wY -> Int
forall (p :: * -> * -> *) wX wY. FL (RebaseItem p) wX wY -> Int
countToEdit FL (RebaseItem p) wY wY
ps
countToEdit (_ :>: ps :: FL (RebaseItem p) wY wY
ps) = FL (RebaseItem p) wY wY -> Int
forall (p :: * -> * -> *) wX wY. FL (RebaseItem p) wX wY -> Int
countToEdit FL (RebaseItem p) wY wY
ps

-- |Given a list of rebase items, try to push a new fixup as far as possible into
-- the list as possible, using both commutation and coalescing. If the fixup
-- commutes past all the 'ToEdit' patches then it is dropped entirely.
simplifyPush :: (PrimPatchBase p, Commute p, FromPrim p, Effect p)
             => D.DiffAlgorithm -> RebaseFixup p wX wY -> FL (RebaseItem p) wY wZ -> Sealed (FL (RebaseItem p) wX)

simplifyPush :: DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush _ _f :: RebaseFixup p wX wY
_f NilFL = FL (RebaseItem p) wX wX -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL

simplifyPush da :: DiffAlgorithm
da (PrimFixup f1 :: PrimOf p wX wY
f1) (Fixup (PrimFixup f2 :: PrimOf p wY wY
f2) :>: ps :: FL (RebaseItem p) wY wZ
ps)
 | EqCheck wX wY
IsEq <- EqCheck wX wY
isInverse = FL (RebaseItem p) wY wZ -> Sealed (FL (RebaseItem p) wY)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed FL (RebaseItem p) wY wZ
ps
 | Bool
otherwise
   = case (:>) (PrimOf p) (PrimOf p) wX wY
-> Maybe ((:>) (PrimOf p) (PrimOf p) wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (PrimOf p wX wY
f1 PrimOf p wX wY
-> PrimOf p wY wY -> (:>) (PrimOf p) (PrimOf p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> PrimOf p wY wY
f2) of
       Nothing -> FL (RebaseItem p) wX wZ -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed ((forall wW wY. PrimOf p wW wY -> RebaseItem p wW wY)
-> FL (PrimOf p) wX wY -> FL (RebaseItem p) 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 (RebaseFixup p wW wY -> RebaseItem p wW wY
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (RebaseFixup p wW wY -> RebaseItem p wW wY)
-> (PrimOf p wW wY -> RebaseFixup p wW wY)
-> PrimOf p wW wY
-> RebaseItem p wW wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimOf p wW wY -> RebaseFixup p wW wY
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup) (DiffAlgorithm -> FL (PrimOf p) wX wY -> FL (PrimOf p) wX wY
forall (prim :: * -> * -> *) wX wY.
PrimCanonize prim =>
DiffAlgorithm -> FL prim wX wY -> FL prim wX wY
canonizeFL DiffAlgorithm
da (PrimOf p wX wY
f1 PrimOf p wX wY -> FL (PrimOf p) wY wY -> FL (PrimOf p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: PrimOf p wY wY
f2 PrimOf p wY wY -> FL (PrimOf p) wY wY -> FL (PrimOf p) wY wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (PrimOf p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)) FL (RebaseItem p) wX wY
-> FL (RebaseItem p) wY wZ -> FL (RebaseItem p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RebaseItem p) wY wZ
ps)
       Just (f2' :: PrimOf p wX wZ
f2' :> f1' :: PrimOf p wZ wY
f1') -> (forall wX. FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) wZ) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseFixup p wX wZ -> RebaseItem p wX wZ
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (PrimOf p wX wZ -> RebaseFixup p wX wZ
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup PrimOf p wX wZ
f2') RebaseItem p wX wZ
-> FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> RebaseFixup p wZ wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wZ)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da (PrimOf p wZ wY -> RebaseFixup p wZ wY
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup PrimOf p wZ wY
f1') FL (RebaseItem p) wY wZ
ps)
  where isInverse :: EqCheck wX wY
isInverse = PrimOf p wX wY -> PrimOf p wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert PrimOf p wX wY
f1 PrimOf p wY wX -> PrimOf p wY wY -> EqCheck wX wY
forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= PrimOf p wY wY
f2

simplifyPush da :: DiffAlgorithm
da (PrimFixup f :: PrimOf p wX wY
f) (Fixup (NameFixup n :: RebaseName p wY wY
n) :>: ps :: FL (RebaseItem p) wY wZ
ps)
    = case (:>) (PrimOf p) (RebaseName p) wX wY
-> (:>) (RebaseName p) (PrimOf p) wX wY
forall (p :: * -> * -> *) wX wY.
(:>) (PrimOf p) (RebaseName p) wX wY
-> (:>) (RebaseName p) (PrimOf p) wX wY
commutePrimName (PrimOf p wX wY
f PrimOf p wX wY
-> RebaseName p wY wY -> (:>) (PrimOf p) (RebaseName p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RebaseName p wY wY
n) of
        n' :: RebaseName p wX wZ
n' :> f' :: PrimOf p wZ wY
f' -> (forall wX. FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) wZ) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseFixup p wX wZ -> RebaseItem p wX wZ
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (RebaseName p wX wZ -> RebaseFixup p wX wZ
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup RebaseName p wX wZ
n') RebaseItem p wX wZ
-> FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> RebaseFixup p wZ wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wZ)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da (PrimOf p wZ wY -> RebaseFixup p wZ wY
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup PrimOf p wZ wY
f') FL (RebaseItem p) wY wZ
ps)

simplifyPush da :: DiffAlgorithm
da (PrimFixup f :: PrimOf p wX wY
f) (ToEdit e :: Named p wY wY
e :>: ps :: FL (RebaseItem p) wY wZ
ps)
   = case CommuteFn p p
-> (:>) p (Named p) wX wY -> Maybe ((:>) (Named p) p wX wY)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn p1 (Named p2)
commuterIdNamed CommuteFn p p
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (PrimOf p wX wY -> p wX wY
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim PrimOf p wX wY
f p wX wY -> Named p wY wY -> (:>) p (Named p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> Named p wY wY
e) of
       Nothing -> FL (RebaseItem p) wX wZ -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RebaseFixup p wX wY -> RebaseItem p wX wY
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (PrimOf p wX wY -> RebaseFixup p wX wY
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup PrimOf p wX wY
f) RebaseItem p wX wY
-> FL (RebaseItem p) wY wZ -> FL (RebaseItem p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: Named p wY wY -> RebaseItem p wY wY
forall (p :: * -> * -> *) wX wY.
Named p wX wY -> RebaseItem p wX wY
ToEdit Named p wY wY
e RebaseItem p wY wY
-> FL (RebaseItem p) wY wZ -> FL (RebaseItem p) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseItem p) wY wZ
ps)
       Just (e' :: Named p wX wZ
e' :> f' :: p wZ wY
f') -> (forall wX. FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) wZ) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (Named p wX wZ -> RebaseItem p wX wZ
forall (p :: * -> * -> *) wX wY.
Named p wX wY -> RebaseItem p wX wY
ToEdit Named p wX wZ
e' RebaseItem p wX wZ
-> FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> FL (RebaseFixup p) wZ wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wZ)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> FL (RebaseFixup p) wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPushes DiffAlgorithm
da ((forall wW wY. PrimOf p wW wY -> RebaseFixup p wW wY)
-> FL (PrimOf p) wZ wY -> FL (RebaseFixup p) wZ 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. PrimOf p wW wY -> RebaseFixup p wW wY
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup (p wZ wY -> FL (PrimOf p) wZ wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect p wZ wY
f')) FL (RebaseItem p) wY wZ
ps)

simplifyPush da :: DiffAlgorithm
da (NameFixup n1 :: RebaseName p wX wY
n1) (Fixup (NameFixup n2 :: RebaseName p wY wY
n2) :>: ps :: FL (RebaseItem p) wY wZ
ps)
 | EqCheck wX wY
IsEq <- EqCheck wX wY
isInverse = FL (RebaseItem p) wY wZ -> Sealed (FL (RebaseItem p) wY)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed FL (RebaseItem p) wY wZ
ps
 | Bool
otherwise
   = case (:>) (RebaseName p) (RebaseName p) wX wY
-> Maybe ((:>) (RebaseName p) (RebaseName p) wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (RebaseName p wX wY
n1 RebaseName p wX wY
-> RebaseName p wY wY -> (:>) (RebaseName p) (RebaseName p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RebaseName p wY wY
n2) of
       Nothing -> FL (RebaseItem p) wX wZ -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed ((forall wW wY. RebaseName p wW wY -> RebaseItem p wW wY)
-> FL (RebaseName p) wX wY -> FL (RebaseItem p) 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 (RebaseFixup p wW wY -> RebaseItem p wW wY
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (RebaseFixup p wW wY -> RebaseItem p wW wY)
-> (RebaseName p wW wY -> RebaseFixup p wW wY)
-> RebaseName p wW wY
-> RebaseItem p wW wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RebaseName p wW wY -> RebaseFixup p wW wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup) ((:>) (RebaseName p) (RebaseName p) wX wY -> FL (RebaseName p) wX wY
forall (p :: * -> * -> *) wX wY.
(:>) (RebaseName p) (RebaseName p) wX wY -> FL (RebaseName p) wX wY
canonizeNamePair (RebaseName p wX wY
n1 RebaseName p wX wY
-> RebaseName p wY wY -> (:>) (RebaseName p) (RebaseName p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RebaseName p wY wY
n2)) FL (RebaseItem p) wX wY
-> FL (RebaseItem p) wY wZ -> FL (RebaseItem p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RebaseItem p) wY wZ
ps)
       Just (n2' :: RebaseName p wX wZ
n2' :> n1' :: RebaseName p wZ wY
n1') -> (forall wX. FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) wZ) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseFixup p wX wZ -> RebaseItem p wX wZ
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (RebaseName p wX wZ -> RebaseFixup p wX wZ
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup RebaseName p wX wZ
n2') RebaseItem p wX wZ
-> FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> RebaseFixup p wZ wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wZ)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da (RebaseName p wZ wY -> RebaseFixup p wZ wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup RebaseName p wZ wY
n1') FL (RebaseItem p) wY wZ
ps)
  where isInverse :: EqCheck wX wY
isInverse = RebaseName p wX wY -> RebaseName p wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert RebaseName p wX wY
n1 RebaseName p wY wX -> RebaseName p wY wY -> EqCheck wX wY
forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= RebaseName p wY wY
n2

simplifyPush da :: DiffAlgorithm
da (NameFixup n :: RebaseName p wX wY
n) (Fixup (PrimFixup f :: PrimOf p wY wY
f) :>: ps :: FL (RebaseItem p) wY wZ
ps) =
    case (:>) (RebaseName p) (PrimOf p) wX wY
-> (:>) (PrimOf p) (RebaseName p) wX wY
forall (p :: * -> * -> *) wX wY.
(:>) (RebaseName p) (PrimOf p) wX wY
-> (:>) (PrimOf p) (RebaseName p) wX wY
commuteNamePrim (RebaseName p wX wY
n RebaseName p wX wY
-> PrimOf p wY wY -> (:>) (RebaseName p) (PrimOf p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> PrimOf p wY wY
f) of
      f' :: PrimOf p wX wZ
f' :> n' :: RebaseName p wZ wY
n' -> (forall wX. FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) wZ) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseFixup p wX wZ -> RebaseItem p wX wZ
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (PrimOf p wX wZ -> RebaseFixup p wX wZ
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup PrimOf p wX wZ
f') RebaseItem p wX wZ
-> FL (RebaseItem p) wZ wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> RebaseFixup p wZ wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wZ)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da (RebaseName p wZ wY -> RebaseFixup p wZ wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup RebaseName p wZ wY
n') FL (RebaseItem p) wY wZ
ps)

simplifyPush da :: DiffAlgorithm
da (NameFixup (AddName an :: PatchInfo
an)) (p :: RebaseItem p wY wY
p@(ToEdit (NamedP pn :: PatchInfo
pn deps :: [PatchInfo]
deps _)) :>: ps :: FL (RebaseItem p) wY wZ
ps)
  | PatchInfo
an PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
pn = Sealed (FL (RebaseItem p) wX)
forall a. a
impossible
  | PatchInfo
an PatchInfo -> [PatchInfo] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PatchInfo]
deps = FL (RebaseItem p) wX wZ -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RebaseFixup p wX wY -> RebaseItem p wX wY
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (RebaseName p wX wY -> RebaseFixup p wX wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup (PatchInfo -> RebaseName p wX wY
forall (p :: * -> * -> *) wX wY. PatchInfo -> RebaseName p wX wY
AddName PatchInfo
an)) RebaseItem p wX wY
-> FL (RebaseItem p) wY wZ -> FL (RebaseItem p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: RebaseItem p wY wY
p RebaseItem p wY wY
-> FL (RebaseItem p) wY wZ -> FL (RebaseItem p) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseItem p) wY wZ
ps)
  | Bool
otherwise = (forall wX. FL (RebaseItem p) Any wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) Any) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseItem p wY wY -> RebaseItem p wX Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RebaseItem p wY wY
p RebaseItem p wX Any
-> FL (RebaseItem p) Any wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> RebaseFixup p Any wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) Any)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da (RebaseName p Any wY -> RebaseFixup p Any wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup (PatchInfo -> RebaseName p Any wY
forall (p :: * -> * -> *) wX wY. PatchInfo -> RebaseName p wX wY
AddName PatchInfo
an)) FL (RebaseItem p) wY wZ
ps)
simplifyPush da :: DiffAlgorithm
da (NameFixup (DelName dn :: PatchInfo
dn)) (p :: RebaseItem p wY wY
p@(ToEdit (NamedP pn :: PatchInfo
pn deps :: [PatchInfo]
deps _)) :>: ps :: FL (RebaseItem p) wY wZ
ps)
  -- this case can arise if a patch is suspended then a fresh copy is pulled from another repo
  | PatchInfo
dn PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
pn = FL (RebaseItem p) wX wZ -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (RebaseFixup p wX wY -> RebaseItem p wX wY
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (RebaseName p wX wY -> RebaseFixup p wX wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup (PatchInfo -> RebaseName p wX wY
forall (p :: * -> * -> *) wX wY. PatchInfo -> RebaseName p wX wY
DelName PatchInfo
dn)) RebaseItem p wX wY
-> FL (RebaseItem p) wY wZ -> FL (RebaseItem p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: RebaseItem p wY wY
p RebaseItem p wY wY
-> FL (RebaseItem p) wY wZ -> FL (RebaseItem p) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseItem p) wY wZ
ps)
  | PatchInfo
dn PatchInfo -> [PatchInfo] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PatchInfo]
deps = Sealed (FL (RebaseItem p) wX)
forall a. a
impossible
  | Bool
otherwise = (forall wX. FL (RebaseItem p) Any wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) Any) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseItem p wY wY -> RebaseItem p wX Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RebaseItem p wY wY
p RebaseItem p wX Any
-> FL (RebaseItem p) Any wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> RebaseFixup p Any wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) Any)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da (RebaseName p Any wY -> RebaseFixup p Any wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup (PatchInfo -> RebaseName p Any wY
forall (p :: * -> * -> *) wX wY. PatchInfo -> RebaseName p wX wY
DelName PatchInfo
dn)) FL (RebaseItem p) wY wZ
ps)
simplifyPush da :: DiffAlgorithm
da (NameFixup (Rename old :: PatchInfo
old new :: PatchInfo
new)) (p :: RebaseItem p wY wY
p@(ToEdit (NamedP pn :: PatchInfo
pn deps :: [PatchInfo]
deps body :: FL p wY wY
body)) :>: ps :: FL (RebaseItem p) wY wZ
ps)
  | PatchInfo
old PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
pn = Sealed (FL (RebaseItem p) wX)
forall a. a
impossible
  | PatchInfo
new PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
pn = Sealed (FL (RebaseItem p) wX)
forall a. a
impossible
  | PatchInfo
old PatchInfo -> [PatchInfo] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PatchInfo]
deps = Sealed (FL (RebaseItem p) wX)
forall a. a
impossible
  | PatchInfo
new PatchInfo -> [PatchInfo] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PatchInfo]
deps =
      let newdeps :: [PatchInfo]
newdeps = (PatchInfo -> PatchInfo) -> [PatchInfo] -> [PatchInfo]
forall a b. (a -> b) -> [a] -> [b]
map (\dep :: PatchInfo
dep -> if PatchInfo
new PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
dep then PatchInfo
old else PatchInfo
dep) [PatchInfo]
deps
      in (forall wX. FL (RebaseItem p) Any wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) Any) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (Named p wX Any -> RebaseItem p wX Any
forall (p :: * -> * -> *) wX wY.
Named p wX wY -> RebaseItem p wX wY
ToEdit (PatchInfo -> [PatchInfo] -> FL p wX Any -> Named p wX Any
forall (p :: * -> * -> *) wX wY.
PatchInfo -> [PatchInfo] -> FL p wX wY -> Named p wX wY
NamedP PatchInfo
pn [PatchInfo]
newdeps (FL p wY wY -> FL p wX Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP FL p wY wY
body)) RebaseItem p wX Any
-> FL (RebaseItem p) Any wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> RebaseFixup p Any wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) Any)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da (RebaseName p Any wY -> RebaseFixup p Any wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup (PatchInfo -> PatchInfo -> RebaseName p Any wY
forall (p :: * -> * -> *) wX wY.
PatchInfo -> PatchInfo -> RebaseName p wX wY
Rename PatchInfo
old PatchInfo
new)) FL (RebaseItem p) wY wZ
ps)
  | Bool
otherwise = (forall wX. FL (RebaseItem p) Any wX -> FL (RebaseItem p) wX wX)
-> Sealed (FL (RebaseItem p) Any) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseItem p wY wY -> RebaseItem p wX Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP RebaseItem p wY wY
p RebaseItem p wX Any
-> FL (RebaseItem p) Any wX -> FL (RebaseItem p) wX wX
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>:) (DiffAlgorithm
-> RebaseFixup p Any wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) Any)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da (RebaseName p Any wY -> RebaseFixup p Any wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup (PatchInfo -> PatchInfo -> RebaseName p Any wY
forall (p :: * -> * -> *) wX wY.
PatchInfo -> PatchInfo -> RebaseName p wX wY
Rename PatchInfo
old PatchInfo
new)) FL (RebaseItem p) wY wZ
ps)

-- |Like 'simplifyPush' but for a list of fixups.
simplifyPushes :: (PrimPatchBase p, Commute p, FromPrim p, Effect p)
               => D.DiffAlgorithm -> FL (RebaseFixup p) wX wY -> FL (RebaseItem p) wY wZ -> Sealed (FL (RebaseItem p) wX)
simplifyPushes :: DiffAlgorithm
-> FL (RebaseFixup p) wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPushes _ NilFL ps :: FL (RebaseItem p) wY wZ
ps = FL (RebaseItem p) wY wZ -> Sealed (FL (RebaseItem p) wY)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed FL (RebaseItem p) wY wZ
ps
simplifyPushes da :: DiffAlgorithm
da (f :: RebaseFixup p wX wY
f :>: fs :: FL (RebaseFixup p) wY wY
fs) ps :: FL (RebaseItem p) wY wZ
ps = (forall wX.
 FL (RebaseItem p) wY wX -> Sealed (FL (RebaseItem p) wX))
-> Sealed (FL (RebaseItem p) wY) -> Sealed (FL (RebaseItem p) wX)
forall (a :: * -> *) b. (forall wX. a wX -> b) -> Sealed a -> b
unseal (DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wX
-> Sealed (FL (RebaseItem p) wX)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> RebaseFixup p wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPush DiffAlgorithm
da RebaseFixup p wX wY
f) (DiffAlgorithm
-> FL (RebaseFixup p) wY wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wY)
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, Commute p, FromPrim p, Effect p) =>
DiffAlgorithm
-> FL (RebaseFixup p) wX wY
-> FL (RebaseItem p) wY wZ
-> Sealed (FL (RebaseItem p) wX)
simplifyPushes DiffAlgorithm
da FL (RebaseFixup p) wY wY
fs FL (RebaseItem p) wY wZ
ps)

instance (PrimPatchBase p, PatchListFormat p, ShowPatchBasic p) => ShowPatchBasic (RebaseItem p) where
   showPatch :: ShowPatchFor -> RebaseItem p wX wY -> Doc
showPatch f :: ShowPatchFor
f (ToEdit p :: Named p wX wY
p) = String -> Doc
blueText "rebase-toedit" Doc -> Doc -> Doc
<+> String -> Doc
blueText "(" Doc -> Doc -> Doc
$$ ShowPatchFor -> Named p wX wY -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f Named p wX wY
p Doc -> Doc -> Doc
$$ String -> Doc
blueText ")"
   showPatch f :: ShowPatchFor
f (Fixup (PrimFixup p :: PrimOf p wX wY
p)) = String -> Doc
blueText "rebase-fixup" Doc -> Doc -> Doc
<+> String -> Doc
blueText "(" Doc -> Doc -> Doc
$$ ShowPatchFor -> PrimOf p wX wY -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f PrimOf p wX wY
p Doc -> Doc -> Doc
$$ String -> Doc
blueText ")" where
   showPatch f :: ShowPatchFor
f (Fixup (NameFixup p :: RebaseName p wX wY
p)) = String -> Doc
blueText "rebase-name" Doc -> Doc -> Doc
<+> String -> Doc
blueText "(" Doc -> Doc -> Doc
$$ ShowPatchFor -> RebaseName p wX wY -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f RebaseName p wX wY
p Doc -> Doc -> Doc
$$ String -> Doc
blueText ")"

instance (PrimPatchBase p, PatchListFormat p, Apply p, CommuteNoConflicts p, Conflict p, IsHunk p, ShowPatch p)
    => ShowPatch (RebaseItem p) where

   summary :: RebaseItem p wX wY -> Doc
summary (ToEdit p :: Named p wX wY
p) = Named p wX wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
summary Named p wX wY
p
   summary (Fixup (PrimFixup p :: PrimOf p wX wY
p)) = PrimOf p wX wY -> Doc
forall (prim :: * -> * -> *) wX wY.
PrimDetails prim =>
prim wX wY -> Doc
plainSummaryPrim PrimOf p wX wY
p
   summary (Fixup (NameFixup n :: RebaseName p wX wY
n)) = RebaseName p wX wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
summary RebaseName p wX wY
n
   summaryFL :: FL (RebaseItem p) wX wY -> Doc
summaryFL ps :: FL (RebaseItem p) wX wY
ps = [Doc] -> Doc
vcat ((forall wX wY. RebaseItem p wX wY -> Doc)
-> FL (RebaseItem p) wX wY -> [Doc]
forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL forall wX wY. RebaseItem p wX wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
summary FL (RebaseItem p) wX wY
ps) -- TODO sort out summaries properly, considering expected conflicts


instance (PrimPatchBase p, PatchListFormat p, ReadPatch p) => ReadPatch (RebaseItem p) where
   readPatch' :: m (Sealed (RebaseItem p wX))
readPatch' = (forall wX. Named p wX wX -> RebaseItem p wX wX)
-> Sealed (Named p wX) -> Sealed (RebaseItem p wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal forall wX. Named p wX wX -> RebaseItem p wX wX
forall (p :: * -> * -> *) wX wY.
Named p wX wY -> RebaseItem p wX wY
ToEdit              (Sealed (Named p wX) -> Sealed (RebaseItem p wX))
-> m (Sealed (Named p wX)) -> m (Sealed (RebaseItem p wX))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteString -> m (Sealed (Named p wX))
forall (m :: * -> *) (q :: * -> * -> *) wX.
(ParserM m, ReadPatch q) =>
ByteString -> m (Sealed (q wX))
readWith (String -> ByteString
BC.pack "rebase-toedit") m (Sealed (RebaseItem p wX))
-> m (Sealed (RebaseItem p wX)) -> m (Sealed (RebaseItem p wX))
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
                (forall wX. PrimOf p wX wX -> RebaseItem p wX wX)
-> Sealed (PrimOf p wX) -> Sealed (RebaseItem p wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseFixup p wX wX -> RebaseItem p wX wX
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (RebaseFixup p wX wX -> RebaseItem p wX wX)
-> (PrimOf p wX wX -> RebaseFixup p wX wX)
-> PrimOf p wX wX
-> RebaseItem p wX wX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimOf p wX wX -> RebaseFixup p wX wX
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup) (Sealed (PrimOf p wX) -> Sealed (RebaseItem p wX))
-> m (Sealed (PrimOf p wX)) -> m (Sealed (RebaseItem p wX))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteString -> m (Sealed (PrimOf p wX))
forall (m :: * -> *) (q :: * -> * -> *) wX.
(ParserM m, ReadPatch q) =>
ByteString -> m (Sealed (q wX))
readWith (String -> ByteString
BC.pack "rebase-fixup" ) m (Sealed (RebaseItem p wX))
-> m (Sealed (RebaseItem p wX)) -> m (Sealed (RebaseItem p wX))
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
                (forall wX. RebaseName p wX wX -> RebaseItem p wX wX)
-> Sealed (RebaseName p wX) -> Sealed (RebaseItem p wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (RebaseFixup p wX wX -> RebaseItem p wX wX
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup (RebaseFixup p wX wX -> RebaseItem p wX wX)
-> (RebaseName p wX wX -> RebaseFixup p wX wX)
-> RebaseName p wX wX
-> RebaseItem p wX wX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RebaseName p wX wX -> RebaseFixup p wX wX
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup) (Sealed (RebaseName p wX) -> Sealed (RebaseItem p wX))
-> m (Sealed (RebaseName p wX)) -> m (Sealed (RebaseItem p wX))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteString -> m (Sealed (RebaseName p wX))
forall (m :: * -> *) (q :: * -> * -> *) wX.
(ParserM m, ReadPatch q) =>
ByteString -> m (Sealed (q wX))
readWith (String -> ByteString
BC.pack "rebase-name"  )
     where readWith :: forall m q wX . (ParserM m, ReadPatch q) => B.ByteString -> m (Sealed (q wX))
           readWith :: ByteString -> m (Sealed (q wX))
readWith str :: ByteString
str = do ByteString -> m ()
forall (m :: * -> *). ParserM m => ByteString -> m ()
lexString ByteString
str
                             ByteString -> m ()
forall (m :: * -> *). ParserM m => ByteString -> m ()
lexString (String -> ByteString
BC.pack "(")
                             Sealed (q wX)
res <- m (Sealed (q wX))
forall (p :: * -> * -> *) (m :: * -> *) wX.
(ReadPatch p, ParserM m) =>
m (Sealed (p wX))
readPatch'
                             ByteString -> m ()
forall (m :: * -> *). ParserM m => ByteString -> m ()
lexString (String -> ByteString
BC.pack ")")
                             Sealed (q wX) -> m (Sealed (q wX))
forall (m :: * -> *) a. Monad m => a -> m a
return Sealed (q wX)
res

instance Check p => Check (RebaseItem p) where
   isInconsistent :: RebaseItem p wX wY -> Maybe Doc
isInconsistent (Fixup _) = Maybe Doc
forall a. Maybe a
Nothing
   isInconsistent (ToEdit p :: Named p wX wY
p) = Named p wX wY -> Maybe Doc
forall (p :: * -> * -> *) wX wY. Check p => p wX wY -> Maybe Doc
isInconsistent Named p wX wY
p

instance (PrimPatchBase p, PatchInspect p) => PatchInspect (RebaseItem p) where
   listTouchedFiles :: RebaseItem p wX wY -> [String]
listTouchedFiles (ToEdit p :: Named p wX wY
p) = Named p wX wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles Named p wX wY
p
   listTouchedFiles (Fixup p :: RebaseFixup p wX wY
p) = RebaseFixup p wX wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles RebaseFixup p wX wY
p

   hunkMatches :: (ByteString -> Bool) -> RebaseItem p wX wY -> Bool
hunkMatches f :: ByteString -> Bool
f (ToEdit p :: Named p wX wY
p) = (ByteString -> Bool) -> Named p wX wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f Named p wX wY
p
   hunkMatches f :: ByteString -> Bool
f (Fixup p :: RebaseFixup p wX wY
p) = (ByteString -> Bool) -> RebaseFixup p wX wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f RebaseFixup p wX wY
p