--  Copyright (C) 2009 Ganesh Sittampalam
--
--  BSD3
{-# LANGUAGE UndecidableInstances #-}
module Darcs.Patch.Rebase.Viewing
    ( RebaseSelect(..)
    , toRebaseSelect, fromRebaseSelect, extractRebaseSelect, reifyRebaseSelect
    , partitionUnconflicted
    , rsToPia
    , WithDroppedDeps(..), WDDNamed, commuterIdWDD
    , RebaseChange(..), toRebaseChanges
    ) where

import Prelude ()
import Darcs.Prelude

import Darcs.Patch.Commute ( selfCommuter )
import Darcs.Patch.CommuteFn ( CommuteFn, commuterIdFL, commuterRLId, MergeFn
                             , totalCommuterIdFL
                             )
import Darcs.Patch.Conflict
    ( Conflict(..), CommuteNoConflicts(..)
    , IsConflictedPrim
    )
import Darcs.Patch.Debug ( PatchDebug(..) )
import Darcs.Patch.Effect ( Effect(..) )
import Darcs.Patch.FileHunk ( IsHunk(..) )
import Darcs.Patch.Format ( PatchListFormat(..) )
import Darcs.Patch.Info ( PatchInfo )
import Darcs.Patch.Invert ( invertFL, invertRL )
import Darcs.Patch.Matchable ( Matchable )
import Darcs.Patch.Merge ( Merge(..), selfMerger )
import Darcs.Patch.Named
    ( Named(..), namepatch, infopatch
    , mergerIdNamed
    , getdeps
    , patch2patchinfo, patchcontents
    )
import Darcs.Patch.Named.Wrapped
    ( WrappedNamed(..)
    )
import qualified Darcs.Patch.Named.Wrapped as Wrapped
    ( infopatch, adddeps
    )

import Darcs.Patch.PatchInfoAnd ( PatchInfoAnd, n2pia )
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
    ( PrimPatch, PrimPatchBase(..), FromPrim(..), FromPrims(..)
    )
import Darcs.Patch.Rebase.Container ( Suspended(..) )
import Darcs.Patch.Rebase.Fixup
    ( RebaseFixup(..)
    , commuteFixupNamed, commuteNamedFixups
    , flToNamesPrims
    )
import Darcs.Patch.Rebase.Item ( RebaseItem(..) )
import Darcs.Patch.Rebase.Name ( RebaseName(..) )
import Darcs.Patch.RepoType ( RepoType(..), RebaseType(..) )
import Darcs.Patch.Show ( ShowPatchBasic(..), ShowPatchFor(..), ShowContextPatch(..) )
import Darcs.Patch.Summary ( plainSummary )
import Darcs.Patch.Witnesses.Eq
import Darcs.Patch.Witnesses.Ordered
import Darcs.Patch.Witnesses.Sealed
import Darcs.Patch.Witnesses.Show
    ( Show1(..), Show2(..), ShowDict(ShowDictClass)
    , showsPrec2
    )
import Darcs.Patch.Witnesses.Unsafe ( unsafeCoerceP, unsafeCoercePEnd )
import Darcs.Util.IsoDate ( getIsoDateTime )
import Darcs.Util.Printer ( ($$), redText, empty, vcat )
import Darcs.Util.Show ( appPrec )

import Data.List ( nub, (\\) )
import Data.Maybe ( fromMaybe )

-- |Encapsulate a single patch in the rebase state together with its fixups.
-- Used during interactive selection to make sure that each item presented
-- to the user corresponds to a patch.
data RebaseSelect p wX wY where
   -- The normal case for a RebaseSelect - a patch that points forwards.
   RSFwd :: FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
   -- We need an 'Invert' instance. We just represent inverses
   -- with a different constructor instead of trying to come up with some logical
   -- inversion of the individual components. Typically they get uninverted
   -- before anything significant is done with them, so a lot of code that
   -- processes 'RebaseSelect' patches just uses 'impossible' for 'RSRev'.
   RSRev :: FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wZ wX


instance (Show2 p, Show2 (PrimOf p)) => Show (RebaseSelect p wX wY) where
    showsPrec :: Int -> RebaseSelect p wX wY -> ShowS
showsPrec d :: Int
d (RSFwd fixups :: FL (RebaseFixup p) wX wY
fixups toedit :: Named p wY wY
toedit) =
        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 "RSFwd " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> FL (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) FL (RebaseFixup p) wX wY
fixups ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
            String -> ShowS
showString " " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Named p wY 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 wY wY
toedit
    showsPrec d :: Int
d (RSRev fixups :: FL (RebaseFixup p) wY wY
fixups toedit :: Named p wY wX
toedit) =
        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 "RSRev " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> FL (RebaseFixup p) wY 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) FL (RebaseFixup p) wY wY
fixups ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
            String -> ShowS
showString " " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Named p wY wX -> 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 wY wX
toedit

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

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

-- TODO: merge with RebaseSelect.
-- |Used for displaying during 'rebase changes'.
-- 'Named (RebaseChange p)' is very similar to 'RebaseSelect p' but slight
-- mismatches ('Named' embeds an 'FL') makes it not completely trivial to merge
-- them.
data RebaseChange p wX wY where
    RCFwd :: FL (RebaseFixup p) wX wY -> FL p wY wZ -> RebaseChange p wX wZ
    RCRev :: FL (RebaseFixup p) wX wY -> FL p wY wZ -> RebaseChange p wZ wX

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

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

instance (Show2 p, Show2 (PrimOf p)) => Show (RebaseChange p wX wY) where
    showsPrec :: Int -> RebaseChange p wX wY -> ShowS
showsPrec d :: Int
d (RCFwd fixups :: FL (RebaseFixup p) wX wY
fixups changes :: FL p wY wY
changes) =
        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 "RCFwd " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> FL (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) FL (RebaseFixup p) wX wY
fixups ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
            String -> ShowS
showString " " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> FL p wY 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) FL p wY wY
changes
    showsPrec d :: Int
d (RCRev fixups :: FL (RebaseFixup p) wY wY
fixups changes :: FL p wY wX
changes) =
        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 "RCRev " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> FL (RebaseFixup p) wY 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) FL (RebaseFixup p) wY wY
fixups ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
            String -> ShowS
showString " " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> FL p wY wX -> 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) FL p wY wX
changes

-- |Get hold of the 'PatchInfoAnd' patch inside a 'RebaseSelect'.
rsToPia :: RebaseSelect p wX wY -> Sealed2 (PatchInfoAnd ('RepoType 'NoRebase) p)
rsToPia :: RebaseSelect p wX wY
-> Sealed2 (PatchInfoAnd ('RepoType 'NoRebase) p)
rsToPia (RSFwd _ toEdit :: Named p wY wY
toEdit) = PatchInfoAnd ('RepoType 'NoRebase) p wY wY
-> Sealed2 (PatchInfoAnd ('RepoType 'NoRebase) p)
forall (a :: * -> * -> *) wX wY. a wX wY -> Sealed2 a
Sealed2 (WrappedNamed ('RepoType 'NoRebase) p wY wY
-> PatchInfoAnd ('RepoType 'NoRebase) p wY wY
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
n2pia (Named p wY wY -> WrappedNamed ('RepoType 'NoRebase) p wY wY
forall (p :: * -> * -> *) wX wY (rt :: RepoType).
Named p wX wY -> WrappedNamed rt p wX wY
NormalP Named p wY wY
toEdit))
rsToPia (RSRev _ toEdit :: Named p wY wX
toEdit) = PatchInfoAnd ('RepoType 'NoRebase) p wY wX
-> Sealed2 (PatchInfoAnd ('RepoType 'NoRebase) p)
forall (a :: * -> * -> *) wX wY. a wX wY -> Sealed2 a
Sealed2 (WrappedNamed ('RepoType 'NoRebase) p wY wX
-> PatchInfoAnd ('RepoType 'NoRebase) p wY wX
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
n2pia (Named p wY wX -> WrappedNamed ('RepoType 'NoRebase) p wY wX
forall (p :: * -> * -> *) wX wY (rt :: RepoType).
Named p wX wY -> WrappedNamed rt p wX wY
NormalP Named p wY wX
toEdit))

instance PrimPatchBase p => PrimPatchBase (RebaseSelect p) where
   type PrimOf (RebaseSelect p) = PrimOf p

instance PatchDebug p => PatchDebug (RebaseSelect p)

instance PatchDebug p => PatchDebug (RebaseChange p)

instance (PrimPatchBase p, Invert p, Apply p, ApplyState p ~ ApplyState (PrimOf p)) => Apply (RebaseSelect p) where
   type ApplyState (RebaseSelect p) = ApplyState p
   apply :: RebaseSelect p wX wY -> m ()
apply (RSFwd fixups :: FL (RebaseFixup p) wX wY
fixups toedit :: Named p wY wY
toedit) = FL (RebaseFixup p) wX wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply FL (RebaseFixup p) wX wY
fixups m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Named p wY wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply Named p wY wY
toedit
   apply (RSRev fixups :: FL (RebaseFixup p) wY wY
fixups toedit :: Named p wY wX
toedit) = Named p wX wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply (Named p wY wX -> Named p wX wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert Named p wY wX
toedit) m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> RL (RebaseFixup p) wY wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply (FL (RebaseFixup p) wY wY -> RL (RebaseFixup p) wY wY
forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL (RebaseFixup p) wY wY
fixups)

instance ( PrimPatchBase p, Invert p, Apply p
         , ApplyState p ~ ApplyState (PrimOf p)
         )
        => Apply (RebaseChange p) where

    type ApplyState (RebaseChange p) = ApplyState p
    apply :: RebaseChange p wX wY -> m ()
apply (RCFwd fixups :: FL (RebaseFixup p) wX wY
fixups contents :: FL p wY wY
contents) = FL (RebaseFixup p) wX wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply FL (RebaseFixup p) wX wY
fixups m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> FL p wY wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply FL p wY wY
contents
    apply (RCRev fixups :: FL (RebaseFixup p) wY wY
fixups contents :: FL p wY wX
contents) = FL p wX wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply (FL p wY wX -> FL p wX wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert FL p wY wX
contents) m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> RL (RebaseFixup p) wY wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply (FL (RebaseFixup p) wY wY -> RL (RebaseFixup p) wY wY
forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL (RebaseFixup p) wY wY
fixups)

instance (PrimPatchBase p, Conflict p, CommuteNoConflicts p, Invert p) => Conflict (RebaseSelect p) where
   resolveConflicts :: RebaseSelect p wX wY
-> [[Sealed (FL (PrimOf (RebaseSelect p)) wY)]]
resolveConflicts (RSFwd _ toedit :: Named p wY wY
toedit) = Named p wY wY -> [[Sealed (FL (PrimOf (Named p)) wY)]]
forall (p :: * -> * -> *) wX wY.
Conflict p =>
p wX wY -> [[Sealed (FL (PrimOf p) wY)]]
resolveConflicts Named p wY wY
toedit
   resolveConflicts (RSRev{}) = [[Sealed (FL (PrimOf (RebaseSelect p)) wY)]]
forall a. a
impossible

   conflictedEffect :: RebaseSelect p wX wY
-> [IsConflictedPrim (PrimOf (RebaseSelect p))]
conflictedEffect (RSFwd _ toedit :: Named p wY wY
toedit) = Named p wY wY -> [IsConflictedPrim (PrimOf (Named p))]
forall (p :: * -> * -> *) wX wY.
Conflict p =>
p wX wY -> [IsConflictedPrim (PrimOf p)]
conflictedEffect Named p wY wY
toedit
   conflictedEffect (RSRev{}) = [IsConflictedPrim (PrimOf (RebaseSelect p))]
forall a. a
impossible

-- newtypes to help the type-checker with the 'changeAsMerge' abstraction
newtype ResolveConflictsResult p wY =
    ResolveConflictsResult {
        ResolveConflictsResult p wY -> [[Sealed (FL (PrimOf p) wY)]]
getResolveConflictsResult :: [[Sealed (FL (PrimOf p) wY)]]
    }

newtype ConflictedEffectResult p wY =
    ConflictedEffectResult {
        ConflictedEffectResult p wY -> [IsConflictedPrim (PrimOf p)]
getConflictedEffectResult :: [IsConflictedPrim (PrimOf p)]
    }

changeAsMerge
    :: (PrimPatchBase p, Invert p, FromPrim p, Merge p)
    => (forall wX' . FL p wX' wY -> result p wY)
    -> RebaseChange p wX wY
    -> result p wY
changeAsMerge :: (forall wX'. FL p wX' wY -> result p wY)
-> RebaseChange p wX wY -> result p wY
changeAsMerge f :: forall wX'. FL p wX' wY -> result p wY
f (RCFwd fixups :: FL (RebaseFixup p) wX wY
fixups changes :: FL p wY wY
changes) =
    case FL (RebaseFixup p) wX wY
-> (:>) (FL (RebaseName p)) (FL (PrimOf p)) wX wY
forall (p :: * -> * -> *) wX wY.
PrimPatchBase p =>
FL (RebaseFixup p) wX wY
-> (:>) (FL (RebaseName p)) (FL (PrimOf p)) wX wY
flToNamesPrims FL (RebaseFixup p) wX wY
fixups of
        _names :: FL (RebaseName p) wX wZ
_names :> prims :: FL (PrimOf p) wZ wY
prims ->
            case (:\/:) (FL p) (FL p) wZ wY -> (:/\:) (FL p) (FL p) wZ wY
forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
merge (FL p wZ wY -> FL p wY wZ
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (FL (PrimOf (FL p)) wZ wY -> FL p wZ wY
forall (p :: * -> * -> *) wX wY.
FromPrims p =>
FL (PrimOf p) wX wY -> p wX wY
fromPrims FL (PrimOf p) wZ wY
FL (PrimOf (FL p)) wZ wY
prims) FL p wY wZ -> FL p wY wY -> (:\/:) (FL p) (FL p) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: FL p wY wY
changes) of
                changes' :: FL p wZ wZ
changes' :/\: _ifixups' :: FL p wY wZ
_ifixups' ->
                    -- it might make sense to pass
                    -- (changes' +>+ invert _ifixups') to resolveConflicts,
                    -- but this isn't actually treated as a conflict by
                    -- either V1 or V2 patches (not quite sure why)
                    FL p wZ wY -> result p wY
forall wX'. FL p wX' wY -> result p wY
f (FL p wZ wZ -> FL p wZ wY
forall (a :: * -> * -> *) wX wY1 wY2. a wX wY1 -> a wX wY2
unsafeCoercePEnd FL p wZ wZ
changes')
changeAsMerge _ (RCRev _ _) = result p wY
forall a. a
impossible

instance
    ( PrimPatchBase p, Invert p, Effect p
    , FromPrim p, Merge p, Conflict p, CommuteNoConflicts p
    )
   => Conflict (RebaseChange p) where
    resolveConflicts :: RebaseChange p wX wY
-> [[Sealed (FL (PrimOf (RebaseChange p)) wY)]]
resolveConflicts =
        ResolveConflictsResult p wY -> [[Sealed (FL (PrimOf p) wY)]]
forall (p :: * -> * -> *) wY.
ResolveConflictsResult p wY -> [[Sealed (FL (PrimOf p) wY)]]
getResolveConflictsResult (ResolveConflictsResult p wY -> [[Sealed (FL (PrimOf p) wY)]])
-> (RebaseChange p wX wY -> ResolveConflictsResult p wY)
-> RebaseChange p wX wY
-> [[Sealed (FL (PrimOf p) wY)]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall wX'. FL p wX' wY -> ResolveConflictsResult p wY)
-> RebaseChange p wX wY -> ResolveConflictsResult p wY
forall (p :: * -> * -> *) wY (result :: (* -> * -> *) -> * -> *)
       wX.
(PrimPatchBase p, Invert p, FromPrim p, Merge p) =>
(forall wX'. FL p wX' wY -> result p wY)
-> RebaseChange p wX wY -> result p wY
changeAsMerge ([[Sealed (FL (PrimOf p) wY)]] -> ResolveConflictsResult p wY
forall (p :: * -> * -> *) wY.
[[Sealed (FL (PrimOf p) wY)]] -> ResolveConflictsResult p wY
ResolveConflictsResult ([[Sealed (FL (PrimOf p) wY)]] -> ResolveConflictsResult p wY)
-> (FL p wX' wY -> [[Sealed (FL (PrimOf p) wY)]])
-> FL p wX' wY
-> ResolveConflictsResult p wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL p wX' wY -> [[Sealed (FL (PrimOf p) wY)]]
forall (p :: * -> * -> *) wX wY.
Conflict p =>
p wX wY -> [[Sealed (FL (PrimOf p) wY)]]
resolveConflicts)


    conflictedEffect :: RebaseChange p wX wY
-> [IsConflictedPrim (PrimOf (RebaseChange p))]
conflictedEffect =
        ConflictedEffectResult p wY -> [IsConflictedPrim (PrimOf p)]
forall (p :: * -> * -> *) wY.
ConflictedEffectResult p wY -> [IsConflictedPrim (PrimOf p)]
getConflictedEffectResult (ConflictedEffectResult p wY -> [IsConflictedPrim (PrimOf p)])
-> (RebaseChange p wX wY -> ConflictedEffectResult p wY)
-> RebaseChange p wX wY
-> [IsConflictedPrim (PrimOf p)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall wX'. FL p wX' wY -> ConflictedEffectResult p wY)
-> RebaseChange p wX wY -> ConflictedEffectResult p wY
forall (p :: * -> * -> *) wY (result :: (* -> * -> *) -> * -> *)
       wX.
(PrimPatchBase p, Invert p, FromPrim p, Merge p) =>
(forall wX'. FL p wX' wY -> result p wY)
-> RebaseChange p wX wY -> result p wY
changeAsMerge ([IsConflictedPrim (PrimOf p)] -> ConflictedEffectResult p wY
forall (p :: * -> * -> *) wY.
[IsConflictedPrim (PrimOf p)] -> ConflictedEffectResult p wY
ConflictedEffectResult ([IsConflictedPrim (PrimOf p)] -> ConflictedEffectResult p wY)
-> (FL p wX' wY -> [IsConflictedPrim (PrimOf p)])
-> FL p wX' wY
-> ConflictedEffectResult p wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL p wX' wY -> [IsConflictedPrim (PrimOf p)]
forall (p :: * -> * -> *) wX wY.
Conflict p =>
p wX wY -> [IsConflictedPrim (PrimOf p)]
conflictedEffect)

instance (PrimPatchBase p, Invert p, Effect p) => Effect (RebaseSelect p) where
   effect :: RebaseSelect p wX wY -> FL (PrimOf (RebaseSelect p)) wX wY
effect (RSFwd fixups :: FL (RebaseFixup p) wX wY
fixups toedit :: Named p wY wY
toedit) =
        FL (FL (PrimOf p)) wX wY -> FL (PrimOf p) wX wY
forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL ((forall wW wY. RebaseFixup p wW wY -> FL (PrimOf p) wW wY)
-> FL (RebaseFixup p) wX wY -> FL (FL (PrimOf 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 forall wW wY. RebaseFixup p wW wY -> FL (PrimOf p) wW wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL (RebaseFixup p) wX wY
fixups) FL (PrimOf p) wX wY -> FL (PrimOf p) wY wY -> FL (PrimOf p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ Named p wY wY -> FL (PrimOf (Named p)) wY wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect Named p wY wY
toedit
   effect (RSRev fixups :: FL (RebaseFixup p) wY wY
fixups toedit :: Named p wY wX
toedit) = RL (PrimOf p) wY wX -> FL (PrimOf p) wX wY
forall (p :: * -> * -> *) wX wY.
Invert p =>
RL p wX wY -> FL p wY wX
invertRL (RL (PrimOf p) wY wX -> FL (PrimOf p) wX wY)
-> (RebaseSelect p wY wX -> RL (PrimOf p) wY wX)
-> RebaseSelect p wY wX
-> FL (PrimOf p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL (PrimOf p) wY wX -> RL (PrimOf p) wY wX
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL (FL (PrimOf p) wY wX -> RL (PrimOf p) wY wX)
-> (RebaseSelect p wY wX -> FL (PrimOf p) wY wX)
-> RebaseSelect p wY wX
-> RL (PrimOf p) wY wX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RebaseSelect p wY wX -> FL (PrimOf p) wY wX
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (RebaseSelect p wY wX -> FL (PrimOf (RebaseSelect p)) wX wY)
-> RebaseSelect p wY wX -> FL (PrimOf (RebaseSelect p)) wX wY
forall a b. (a -> b) -> a -> b
$ FL (RebaseFixup p) wY wY -> Named p wY wX -> RebaseSelect p wY wX
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
RSFwd FL (RebaseFixup p) wY wY
fixups Named p wY wX
toedit

instance (PrimPatchBase p, Invert p, Effect p) => Effect (RebaseChange p) where
    effect :: RebaseChange p wX wY -> FL (PrimOf (RebaseChange p)) wX wY
effect (RCFwd fixups :: FL (RebaseFixup p) wX wY
fixups changes :: FL p wY wY
changes) =
        FL (FL (PrimOf p)) wX wY -> FL (PrimOf p) wX wY
forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL ((forall wW wY. RebaseFixup p wW wY -> FL (PrimOf p) wW wY)
-> FL (RebaseFixup p) wX wY -> FL (FL (PrimOf 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 forall wW wY. RebaseFixup p wW wY -> FL (PrimOf p) wW wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL (RebaseFixup p) wX wY
fixups) FL (PrimOf p) wX wY -> FL (PrimOf p) wY wY -> FL (PrimOf p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL p wY wY -> FL (PrimOf (FL p)) wY wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL p wY wY
changes
    effect (RCRev fixups :: FL (RebaseFixup p) wY wY
fixups changes :: FL p wY wX
changes) =
        RL (PrimOf p) wY wX -> FL (PrimOf p) wX wY
forall (p :: * -> * -> *) wX wY.
Invert p =>
RL p wX wY -> FL p wY wX
invertRL (RL (PrimOf p) wY wX -> FL (PrimOf p) wX wY)
-> (RebaseChange p wY wX -> RL (PrimOf p) wY wX)
-> RebaseChange p wY wX
-> FL (PrimOf p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL (PrimOf p) wY wX -> RL (PrimOf p) wY wX
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL (FL (PrimOf p) wY wX -> RL (PrimOf p) wY wX)
-> (RebaseChange p wY wX -> FL (PrimOf p) wY wX)
-> RebaseChange p wY wX
-> RL (PrimOf p) wY wX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RebaseChange p wY wX -> FL (PrimOf p) wY wX
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (RebaseChange p wY wX -> FL (PrimOf (RebaseChange p)) wX wY)
-> RebaseChange p wY wX -> FL (PrimOf (RebaseChange p)) wX wY
forall a b. (a -> b) -> a -> b
$ FL (RebaseFixup p) wY wY -> FL p wY wX -> RebaseChange p wY wX
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> FL p wY wZ -> RebaseChange p wX wZ
RCFwd FL (RebaseFixup p) wY wY
fixups FL p wY wX
changes

instance (PrimPatchBase p, PatchListFormat p, ShowPatchBasic p) => ShowPatchBasic (RebaseSelect p) where
   showPatch :: ShowPatchFor -> RebaseSelect p wX wY -> Doc
showPatch f :: ShowPatchFor
f (RSFwd fixups :: FL (RebaseFixup p) wX wY
fixups toedit :: Named p wY wY
toedit) =
         ShowPatchFor -> Suspended p wX wX -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f (FL (RebaseItem p) wX wY -> Suspended p wX wX
forall (p :: * -> * -> *) wX wY.
FL (RebaseItem p) wX wY -> Suspended p wX wX
Items ((forall wW wY. RebaseFixup p wW wY -> RebaseItem p wW wY)
-> FL (RebaseFixup 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 forall wW wY. RebaseFixup p wW wY -> RebaseItem p wW wY
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup FL (RebaseFixup p) wX wY
fixups FL (RebaseItem p) wX wY
-> FL (RebaseItem p) wY wY -> FL (RebaseItem p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
FL 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
toedit RebaseItem p wY wY
-> FL (RebaseItem p) wY wY -> FL (RebaseItem p) wY wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseItem p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL))
   showPatch _ (RSRev {}) = Doc
forall a. a
impossible

-- TODO this is a dummy instance that does not actually show context
instance (PrimPatchBase p, PatchListFormat p, ShowPatchBasic p) => ShowContextPatch (RebaseSelect p) where
   showContextPatch :: ShowPatchFor -> RebaseSelect p wX wY -> m Doc
showContextPatch f :: ShowPatchFor
f p :: RebaseSelect p 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 -> RebaseSelect p wX wY -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f RebaseSelect p wX wY
p

instance (PrimPatchBase p, ShowPatchBasic p)
      => ShowPatchBasic (RebaseChange p) where
    showPatch :: ShowPatchFor -> RebaseChange p wX wY -> Doc
showPatch ForStorage _ = Doc
forall a. a
impossible
    showPatch ForDisplay (RCFwd fixups :: FL (RebaseFixup p) wX wY
fixups contents :: FL p wY wY
contents) =
        [Doc] -> Doc
vcat ((forall wW wZ. p wW wZ -> Doc) -> FL p wY 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
ForDisplay) FL p wY wY
contents) Doc -> Doc -> Doc
$$
        (if FL (RebaseFixup p) wX wY -> Bool
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> Bool
nullFL FL (RebaseFixup p) wX wY
fixups
            then Doc
empty
            else
                String -> Doc
redText "" Doc -> Doc -> Doc
$$
                String -> Doc
redText "conflicts:" Doc -> Doc -> Doc
$$
                String -> Doc
redText "" Doc -> Doc -> Doc
$$
                [Doc] -> Doc
vcat ((forall wW wZ. RebaseFixup p wW wZ -> Doc)
-> RL (RebaseFixup p) wY wX -> [Doc]
forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> RL a wX wY -> [b]
mapRL forall wW wZ. RebaseFixup p wW wZ -> Doc
forall (p :: * -> * -> *) wX wY. RebaseFixup p wX wY -> Doc
showFixup (FL (RebaseFixup p) wX wY -> RL (RebaseFixup p) wY wX
forall (p :: * -> * -> *) wX wY.
Invert p =>
FL p wX wY -> RL p wY wX
invertFL FL (RebaseFixup p) wX wY
fixups))
        )
        where
            showFixup :: RebaseFixup p wX wY -> Doc
showFixup (PrimFixup p :: PrimOf p wX wY
p) = ShowPatchFor -> PrimOf p wX wY -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForDisplay PrimOf p wX wY
p
            showFixup (NameFixup n :: RebaseName p wX wY
n) = ShowPatchFor -> RebaseName p wX wY -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForDisplay RebaseName p wX wY
n
    showPatch _ (RCRev {}) = Doc
forall a. a
impossible

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

   description :: RebaseSelect p wX wY -> Doc
description (RSFwd _ toedit :: Named p wY wY
toedit) = Named p wY wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
description Named p wY wY
toedit
   description (RSRev _  _toedit :: Named p wY wX
_toedit) = Doc
forall a. a
impossible

   summary :: RebaseSelect p wX wY -> Doc
summary = FL (RebaseItem p) wX wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => FL p wX wY -> Doc
summaryFL (FL (RebaseItem p) wX wY -> Doc)
-> (RebaseSelect p wX wY -> FL (RebaseItem p) wX wY)
-> RebaseSelect p wX wY
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY
forall (p :: * -> * -> *) wX wY.
FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY
fromRebaseSelect (FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY)
-> (RebaseSelect p wX wY -> FL (RebaseSelect p) wX wY)
-> RebaseSelect p wX wY
-> FL (RebaseItem p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RebaseSelect p wX wY
-> FL (RebaseSelect p) wY wY -> FL (RebaseSelect p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseSelect p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
   summaryFL :: FL (RebaseSelect p) wX wY -> Doc
summaryFL = FL (RebaseItem p) wX wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => FL p wX wY -> Doc
summaryFL (FL (RebaseItem p) wX wY -> Doc)
-> (FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY)
-> FL (RebaseSelect p) wX wY
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY
forall (p :: * -> * -> *) wX wY.
FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY
fromRebaseSelect

instance
    ( PrimPatchBase p, PatchListFormat p, ShowPatchBasic p
    , Invert p, Effect p, Merge p, FromPrim p
    , Conflict p, CommuteNoConflicts p
    )
   => ShowPatch (RebaseChange p) where

    summary :: RebaseChange p wX wY -> Doc
summary = RebaseChange p wX wY -> Doc
forall (e :: * -> * -> *) wX wY.
(Conflict e, PrimPatchBase e) =>
e wX wY -> Doc
plainSummary
    summaryFL :: FL (RebaseChange p) wX wY -> Doc
summaryFL = FL (RebaseChange p) wX wY -> Doc
forall (e :: * -> * -> *) wX wY.
(Conflict e, PrimPatchBase e) =>
e wX wY -> Doc
plainSummary

-- TODO this is a dummy instance that does not actually show context
instance
    ( PrimPatchBase p, ShowPatchBasic p)
   => ShowContextPatch (RebaseChange p) where

    showContextPatch :: ShowPatchFor -> RebaseChange p wX wY -> m Doc
showContextPatch f :: ShowPatchFor
f p :: RebaseChange p 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 -> RebaseChange p wX wY -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f RebaseChange p wX wY
p

instance ReadPatch (RebaseSelect p) where
   readPatch' :: m (Sealed (RebaseSelect p wX))
readPatch' = String -> m (Sealed (RebaseSelect p wX))
forall a. HasCallStack => String -> a
error "can't read RebaseSelect patches"

instance ReadPatch (RebaseChange p) where
   readPatch' :: m (Sealed (RebaseChange p wX))
readPatch' = String -> m (Sealed (RebaseChange p wX))
forall a. HasCallStack => String -> a
error "can't read RebaseChange patches"

-- |Turn a list of rebase items being rebased into a list suitable for use
-- by interactive selection. Each actual patch being rebased is grouped
-- together with any fixups needed.
toRebaseSelect :: PrimPatchBase p => FL (RebaseItem p) wX wY -> FL (RebaseSelect p) wX wY

-- |Turn a list of items back from the format used for interactive selection
-- into a normal list
fromRebaseSelect :: FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY

fromRebaseSelect :: FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY
fromRebaseSelect NilFL = FL (RebaseItem p) wX wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
fromRebaseSelect (RSFwd fixups :: FL (RebaseFixup p) wX wY
fixups toedit :: Named p wY wY
toedit :>: ps :: FL (RebaseSelect p) wY wY
ps)
    = (forall wW wY. RebaseFixup p wW wY -> RebaseItem p wW wY)
-> FL (RebaseFixup 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 forall wW wY. RebaseFixup p wW wY -> RebaseItem p wW wY
forall (p :: * -> * -> *) wX wY.
RebaseFixup p wX wY -> RebaseItem p wX wY
Fixup FL (RebaseFixup p) wX wY
fixups FL (RebaseItem p) wX wY
-> FL (RebaseItem p) wY wY -> FL (RebaseItem p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
FL 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
toedit RebaseItem p wY wY
-> FL (RebaseItem p) wY wY -> FL (RebaseItem p) wY wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseSelect p) wY wY -> FL (RebaseItem p) wY wY
forall (p :: * -> * -> *) wX wY.
FL (RebaseSelect p) wX wY -> FL (RebaseItem p) wX wY
fromRebaseSelect FL (RebaseSelect p) wY wY
ps
fromRebaseSelect (RSRev {} :>: _) = FL (RebaseItem p) wX wY
forall a. a
impossible

toRebaseSelect :: FL (RebaseItem p) wX wY -> FL (RebaseSelect p) wX wY
toRebaseSelect NilFL = FL (RebaseSelect p) wX wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
toRebaseSelect (Fixup f :: RebaseFixup p wX wY
f :>: ps :: FL (RebaseItem p) wY wY
ps) =
    case FL (RebaseItem p) wY wY -> FL (RebaseSelect p) wY wY
forall (p :: * -> * -> *) wX wY.
PrimPatchBase p =>
FL (RebaseItem p) wX wY -> FL (RebaseSelect p) wX wY
toRebaseSelect FL (RebaseItem p) wY wY
ps of
      RSFwd fixups :: FL (RebaseFixup p) wY wY
fixups toedit :: Named p wY wY
toedit :>: rest :: FL (RebaseSelect p) wY wY
rest -> FL (RebaseFixup p) wX wY -> Named p wY wY -> RebaseSelect p wX wY
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
RSFwd (RebaseFixup p wX wY
f RebaseFixup p wX wY
-> FL (RebaseFixup p) wY wY -> FL (RebaseFixup p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseFixup p) wY wY
fixups) Named p wY wY
toedit RebaseSelect p wX wY
-> FL (RebaseSelect p) wY wY -> FL (RebaseSelect p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseSelect p) wY wY
rest
      NilFL -> String -> FL (RebaseSelect p) wX wY
forall a. String -> a
bug "rebase chain with Fixup at end"
      _ -> FL (RebaseSelect p) wX wY
forall a. a
impossible
toRebaseSelect (ToEdit te :: Named p wX wY
te :>: ps :: FL (RebaseItem p) wY wY
ps) = FL (RebaseFixup p) wX wX -> Named p wX wY -> RebaseSelect p wX wY
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
RSFwd FL (RebaseFixup p) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL Named p wX wY
te RebaseSelect p wX wY
-> FL (RebaseSelect p) wY wY -> FL (RebaseSelect p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseItem p) wY wY -> FL (RebaseSelect p) wY wY
forall (p :: * -> * -> *) wX wY.
PrimPatchBase p =>
FL (RebaseItem p) wX wY -> FL (RebaseSelect p) wX wY
toRebaseSelect FL (RebaseItem p) wY wY
ps

toRebaseChanges
    :: PrimPatchBase p
    => FL (RebaseItem p) wX wY
    -> FL (PatchInfoAnd ('RepoType 'IsRebase) (RebaseChange p)) wX wY
toRebaseChanges :: FL (RebaseItem p) wX wY
-> FL (PatchInfoAnd ('RepoType 'IsRebase) (RebaseChange p)) wX wY
toRebaseChanges = (forall wW wY.
 RebaseSelect p wW wY
 -> PatchInfoAnd ('RepoType 'IsRebase) (RebaseChange p) wW wY)
-> FL (RebaseSelect p) wX wY
-> FL (PatchInfoAnd ('RepoType 'IsRebase) (RebaseChange 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 forall wW wY.
RebaseSelect p wW wY
-> PatchInfoAnd ('RepoType 'IsRebase) (RebaseChange p) wW wY
forall (p :: * -> * -> *) wX wY (rt :: RepoType).
RebaseSelect p wX wY -> PatchInfoAnd rt (RebaseChange p) wX wY
toChange (FL (RebaseSelect p) wX wY
 -> FL (PatchInfoAnd ('RepoType 'IsRebase) (RebaseChange p)) wX wY)
-> (FL (RebaseItem p) wX wY -> FL (RebaseSelect p) wX wY)
-> FL (RebaseItem p) wX wY
-> FL (PatchInfoAnd ('RepoType 'IsRebase) (RebaseChange p)) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FL (RebaseItem p) wX wY -> FL (RebaseSelect p) wX wY
forall (p :: * -> * -> *) wX wY.
PrimPatchBase p =>
FL (RebaseItem p) wX wY -> FL (RebaseSelect p) wX wY
toRebaseSelect

toChange :: RebaseSelect p wX wY -> PatchInfoAnd rt (RebaseChange p) wX wY
toChange :: RebaseSelect p wX wY -> PatchInfoAnd rt (RebaseChange p) wX wY
toChange (RSFwd fixups :: FL (RebaseFixup p) wX wY
fixups named :: Named p wY wY
named) =
    WrappedNamed rt (RebaseChange p) wX wY
-> PatchInfoAnd rt (RebaseChange p) wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
n2pia (WrappedNamed rt (RebaseChange p) wX wY
 -> PatchInfoAnd rt (RebaseChange p) wX wY)
-> WrappedNamed rt (RebaseChange p) wX wY
-> PatchInfoAnd rt (RebaseChange p) wX wY
forall a b. (a -> b) -> a -> b
$
    (WrappedNamed rt (RebaseChange p) wX wY
 -> [PatchInfo] -> WrappedNamed rt (RebaseChange p) wX wY)
-> [PatchInfo]
-> WrappedNamed rt (RebaseChange p) wX wY
-> WrappedNamed rt (RebaseChange p) wX wY
forall a b c. (a -> b -> c) -> b -> a -> c
flip WrappedNamed rt (RebaseChange p) wX wY
-> [PatchInfo] -> WrappedNamed rt (RebaseChange p) wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> [PatchInfo] -> WrappedNamed rt p wX wY
Wrapped.adddeps (Named p wY wY -> [PatchInfo]
forall (p :: * -> * -> *) wX wY. Named p wX wY -> [PatchInfo]
getdeps Named p wY wY
named) (WrappedNamed rt (RebaseChange p) wX wY
 -> WrappedNamed rt (RebaseChange p) wX wY)
-> WrappedNamed rt (RebaseChange p) wX wY
-> WrappedNamed rt (RebaseChange p) wX wY
forall a b. (a -> b) -> a -> b
$
    PatchInfo
-> FL (RebaseChange p) wX wY
-> WrappedNamed rt (RebaseChange p) wX wY
forall (p :: * -> * -> *) wX wY (rt :: RepoType).
PatchInfo -> FL p wX wY -> WrappedNamed rt p wX wY
Wrapped.infopatch (Named p wY wY -> PatchInfo
forall (p :: * -> * -> *) wX wY. Named p wX wY -> PatchInfo
patch2patchinfo Named p wY wY
named) (FL (RebaseChange p) wX wY
 -> WrappedNamed rt (RebaseChange p) wX wY)
-> FL (RebaseChange p) wX wY
-> WrappedNamed rt (RebaseChange p) wX wY
forall a b. (a -> b) -> a -> b
$
    (RebaseChange p wX wY
-> FL (RebaseChange p) wY wY -> FL (RebaseChange p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseChange p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (RebaseChange p wX wY -> FL (RebaseChange p) wX wY)
-> RebaseChange p wX wY -> FL (RebaseChange p) wX wY
forall a b. (a -> b) -> a -> b
$
    FL (RebaseFixup p) wX wY -> FL p wY wY -> RebaseChange p wX wY
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> FL p wY wZ -> RebaseChange p wX wZ
RCFwd FL (RebaseFixup p) wX wY
fixups (Named p wY wY -> FL p wY wY
forall (p :: * -> * -> *) wX wY. Named p wX wY -> FL p wX wY
patchcontents Named p wY wY
named)
toChange (RSRev fixups :: FL (RebaseFixup p) wY wY
fixups named :: Named p wY wX
named) =
    WrappedNamed rt (RebaseChange p) wX wY
-> PatchInfoAnd rt (RebaseChange p) wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
n2pia (WrappedNamed rt (RebaseChange p) wX wY
 -> PatchInfoAnd rt (RebaseChange p) wX wY)
-> WrappedNamed rt (RebaseChange p) wX wY
-> PatchInfoAnd rt (RebaseChange p) wX wY
forall a b. (a -> b) -> a -> b
$
    (WrappedNamed rt (RebaseChange p) wX wY
 -> [PatchInfo] -> WrappedNamed rt (RebaseChange p) wX wY)
-> [PatchInfo]
-> WrappedNamed rt (RebaseChange p) wX wY
-> WrappedNamed rt (RebaseChange p) wX wY
forall a b c. (a -> b -> c) -> b -> a -> c
flip WrappedNamed rt (RebaseChange p) wX wY
-> [PatchInfo] -> WrappedNamed rt (RebaseChange p) wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> [PatchInfo] -> WrappedNamed rt p wX wY
Wrapped.adddeps (Named p wY wX -> [PatchInfo]
forall (p :: * -> * -> *) wX wY. Named p wX wY -> [PatchInfo]
getdeps Named p wY wX
named) (WrappedNamed rt (RebaseChange p) wX wY
 -> WrappedNamed rt (RebaseChange p) wX wY)
-> WrappedNamed rt (RebaseChange p) wX wY
-> WrappedNamed rt (RebaseChange p) wX wY
forall a b. (a -> b) -> a -> b
$
    PatchInfo
-> FL (RebaseChange p) wX wY
-> WrappedNamed rt (RebaseChange p) wX wY
forall (p :: * -> * -> *) wX wY (rt :: RepoType).
PatchInfo -> FL p wX wY -> WrappedNamed rt p wX wY
Wrapped.infopatch (Named p wY wX -> PatchInfo
forall (p :: * -> * -> *) wX wY. Named p wX wY -> PatchInfo
patch2patchinfo Named p wY wX
named) (FL (RebaseChange p) wX wY
 -> WrappedNamed rt (RebaseChange p) wX wY)
-> FL (RebaseChange p) wX wY
-> WrappedNamed rt (RebaseChange p) wX wY
forall a b. (a -> b) -> a -> b
$
    (RebaseChange p wX wY
-> FL (RebaseChange p) wY wY -> FL (RebaseChange p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseChange p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL) (RebaseChange p wX wY -> FL (RebaseChange p) wX wY)
-> RebaseChange p wX wY -> FL (RebaseChange p) wX wY
forall a b. (a -> b) -> a -> b
$
    FL (RebaseFixup p) wY wY -> FL p wY wX -> RebaseChange p wX wY
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> FL p wY wZ -> RebaseChange p wZ wX
RCRev FL (RebaseFixup p) wY wY
fixups (Named p wY wX -> FL p wY wX
forall (p :: * -> * -> *) wX wY. Named p wX wY -> FL p wX wY
patchcontents Named p wY wX
named)

instance PrimPatch (PrimOf p) => PrimPatchBase (RebaseChange p) where
    type PrimOf (RebaseChange p) = PrimOf p


instance Invert (RebaseSelect p) where
   invert :: RebaseSelect p wX wY -> RebaseSelect p wY wX
invert (RSFwd fixups :: FL (RebaseFixup p) wX wY
fixups edit :: Named p wY wY
edit) = FL (RebaseFixup p) wX wY -> Named p wY wY -> RebaseSelect p wY wX
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wZ wX
RSRev FL (RebaseFixup p) wX wY
fixups Named p wY wY
edit
   invert (RSRev fixups :: FL (RebaseFixup p) wY wY
fixups edit :: Named p wY wX
edit) = FL (RebaseFixup p) wY wY -> Named p wY wX -> RebaseSelect p wY wX
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
RSFwd FL (RebaseFixup p) wY wY
fixups Named p wY wX
edit

instance Invert (RebaseChange p) where
   invert :: RebaseChange p wX wY -> RebaseChange p wY wX
invert (RCFwd fixups :: FL (RebaseFixup p) wX wY
fixups contents :: FL p wY wY
contents) = FL (RebaseFixup p) wX wY -> FL p wY wY -> RebaseChange p wY wX
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> FL p wY wZ -> RebaseChange p wZ wX
RCRev FL (RebaseFixup p) wX wY
fixups FL p wY wY
contents
   invert (RCRev fixups :: FL (RebaseFixup p) wY wY
fixups contents :: FL p wY wX
contents) = FL (RebaseFixup p) wY wY -> FL p wY wX -> RebaseChange p wY wX
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> FL p wY wZ -> RebaseChange p wX wZ
RCFwd FL (RebaseFixup p) wY wY
fixups FL p wY wX
contents

instance (PrimPatchBase p, Commute p, Eq2 p) => Eq2 (RebaseSelect p) where
   RSFwd fixups1 :: FL (RebaseFixup p) wA wY
fixups1 edit1 :: Named p wY wB
edit1 =\/= :: RebaseSelect p wA wB -> RebaseSelect p wA wC -> EqCheck wB wC
=\/= RSFwd fixups2 :: FL (RebaseFixup p) wA wY
fixups2 edit2 :: Named p wY wC
edit2
      | EqCheck wY wY
IsEq <- FL (RebaseFixup p) wA wY
fixups1 FL (RebaseFixup p) wA wY
-> FL (RebaseFixup p) wA wY -> EqCheck wY wY
forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= FL (RebaseFixup p) wA wY
fixups2, EqCheck wB wC
IsEq <- Named p wY wB
edit1 Named p wY wB -> Named p wY wC -> EqCheck wB wC
forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= Named p wY wC
Named p wY wC
edit2 = EqCheck wB wC
forall wA. EqCheck wA wA
IsEq
   RSRev fixups1 :: FL (RebaseFixup p) wB wY
fixups1 edit1 :: Named p wY wA
edit1 =\/= RSRev fixups2 :: FL (RebaseFixup p) wC wY
fixups2 edit2 :: Named p wY wA
edit2
      | EqCheck wY wY
IsEq <- Named p wY wA
edit1 Named p wY wA -> Named p wY wA -> EqCheck wY wY
forall (p :: * -> * -> *) wA wC wB.
Eq2 p =>
p wA wC -> p wB wC -> EqCheck wA wB
=/\= Named p wY wA
edit2, EqCheck wB wC
IsEq <- FL (RebaseFixup p) wB wY
fixups1 FL (RebaseFixup p) wB wY
-> FL (RebaseFixup p) wC wY -> EqCheck wB wC
forall (p :: * -> * -> *) wA wC wB.
Eq2 p =>
p wA wC -> p wB wC -> EqCheck wA wB
=/\= FL (RebaseFixup p) wC wY
FL (RebaseFixup p) wC wY
fixups2 = EqCheck wB wC
forall wA. EqCheck wA wA
IsEq

   _ =\/= _ = EqCheck wB wC
forall a. a
impossible

instance (PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p) => Commute (RebaseSelect p) where
   commute :: (:>) (RebaseSelect p) (RebaseSelect p) wX wY
-> Maybe ((:>) (RebaseSelect p) (RebaseSelect p) wX wY)
commute (RSFwd {} :> RSRev {}) = Maybe ((:>) (RebaseSelect p) (RebaseSelect p) wX wY)
forall a. a
impossible
   commute (RSRev {} :> RSFwd {}) = Maybe ((:>) (RebaseSelect p) (RebaseSelect p) wX wY)
forall a. a
impossible
   commute (RSRev fixups1 :: FL (RebaseFixup p) wZ wY
fixups1 edit1 :: Named p wY wX
edit1 :> RSRev fixups2 :: FL (RebaseFixup p) wY wY
fixups2 edit2 :: Named p wY wZ
edit2) =
      do RSFwd fixups1' :: FL (RebaseFixup p) wY wY
fixups1' edit1' :: Named p wY wZ
edit1' :> RSFwd fixups2' :: FL (RebaseFixup p) wZ wY
fixups2' edit2' :: Named p wY wX
edit2'
                   <- (:>) (RebaseSelect p) (RebaseSelect p) wY wX
-> Maybe ((:>) (RebaseSelect p) (RebaseSelect p) wY wX)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (FL (RebaseFixup p) wY wY -> Named p wY wZ -> RebaseSelect p wY wZ
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
RSFwd FL (RebaseFixup p) wY wY
fixups2 Named p wY wZ
edit2 RebaseSelect p wY wZ
-> RebaseSelect p wZ wX
-> (:>) (RebaseSelect p) (RebaseSelect p) wY wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wZ wY -> Named p wY wX -> RebaseSelect p wZ wX
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
RSFwd FL (RebaseFixup p) wZ wY
fixups1 Named p wY wX
edit1)
         (:>) (RebaseSelect p) (RebaseSelect p) wX wY
-> Maybe ((:>) (RebaseSelect p) (RebaseSelect p) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (FL (RebaseFixup p) wZ wY -> Named p wY wX -> RebaseSelect p wX wZ
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wZ wX
RSRev FL (RebaseFixup p) wZ wY
fixups2' Named p wY wX
edit2' RebaseSelect p wX wZ
-> RebaseSelect p wZ wY
-> (:>) (RebaseSelect p) (RebaseSelect p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wY wY -> Named p wY wZ -> RebaseSelect p wZ wY
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wZ wX
RSRev FL (RebaseFixup p) wY wY
fixups1' Named p wY wZ
edit1')

   commute (RSFwd fixups1 :: FL (RebaseFixup p) wX wY
fixups1 edit1 :: Named p wY wZ
edit1 :> RSFwd fixups2 :: FL (RebaseFixup p) wZ wY
fixups2 edit2 :: Named p wY wY
edit2)
    = do
         fixups2' :: FL (RebaseFixup p) wY wZ
fixups2' :> edit1' :: Named p wZ wY
edit1' <- (:>) (Named p) (FL (RebaseFixup p)) wY wY
-> Maybe ((:>) (FL (RebaseFixup p)) (Named p) wY wY)
forall (p :: * -> * -> *) wX wY.
(FromPrim p, Effect p, Commute p, Invert p) =>
(:>) (Named p) (FL (RebaseFixup p)) wX wY
-> Maybe ((:>) (FL (RebaseFixup p)) (Named p) wX wY)
commuteNamedFixups (Named p wY wZ
edit1 Named p wY wZ
-> FL (RebaseFixup p) wZ wY
-> (:>) (Named p) (FL (RebaseFixup p)) wY wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wZ wY
fixups2)
         edit2' :: Named p wZ wZ
edit2' :> edit1'' :: Named p wZ wY
edit1'' <- (:>) (Named p) (Named p) wZ wY
-> Maybe ((:>) (Named p) (Named p) wZ wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (Named p wZ wY
edit1' Named p wZ wY -> Named p wY wY -> (:>) (Named p) (Named p) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> Named p wY wY
edit2)
         fixupsS :: FL (RebaseFixup p) wX wZ
fixupsS :> (fixups2'' :: FL (RebaseFixup p) wZ wZ
fixups2'' :> edit2'' :: Named p wZ wZ
edit2'') :> fixups1' :: FL (RebaseFixup p) wZ wZ
fixups1' <- (:>)
  (FL (RebaseFixup p))
  ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
  wX
  wZ
-> Maybe
     ((:>)
        (FL (RebaseFixup p))
        ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
        wX
        wZ)
forall (m :: * -> *) a. Monad m => a -> m a
return ((:>)
   (FL (RebaseFixup p))
   ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
   wX
   wZ
 -> Maybe
      ((:>)
         (FL (RebaseFixup p))
         ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
         wX
         wZ))
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wZ
-> Maybe
     ((:>)
        (FL (RebaseFixup p))
        ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
        wX
        wZ)
forall a b. (a -> b) -> a -> b
$ (:>) (FL (RebaseFixup p)) (FL (RebaseFixup p) :> Named p) wX wZ
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wZ
forall (p :: * -> * -> *) wX wY.
(PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p) =>
(:>) (FL (RebaseFixup p)) (FL (RebaseFixup p) :> Named p) wX wY
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wY
pushThrough (FL (RebaseFixup p) wX wY
fixups1 FL (RebaseFixup p) wX wY
-> (:>) (FL (RebaseFixup p)) (Named p) wY wZ
-> (:>) (FL (RebaseFixup p)) (FL (RebaseFixup p) :> Named p) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (FL (RebaseFixup p) wY wZ
fixups2' FL (RebaseFixup p) wY wZ
-> Named p wZ wZ -> (:>) (FL (RebaseFixup p)) (Named p) wY wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> Named p wZ wZ
edit2'))
         (:>) (RebaseSelect p) (RebaseSelect p) wX wY
-> Maybe ((:>) (RebaseSelect p) (RebaseSelect p) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (FL (RebaseFixup p) wX wZ -> Named p wZ wZ -> RebaseSelect p wX wZ
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
RSFwd (FL (RebaseFixup p) wX wZ
fixupsS FL (RebaseFixup p) wX wZ
-> FL (RebaseFixup p) wZ wZ -> FL (RebaseFixup p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RebaseFixup p) wZ wZ
fixups2'') Named p wZ wZ
edit2'' RebaseSelect p wX wZ
-> RebaseSelect p wZ wY
-> (:>) (RebaseSelect p) (RebaseSelect p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wZ wZ -> Named p wZ wY -> RebaseSelect p wZ wY
forall (p :: * -> * -> *) wX wY wZ.
FL (RebaseFixup p) wX wY -> Named p wY wZ -> RebaseSelect p wX wZ
RSFwd FL (RebaseFixup p) wZ wZ
fixups1' Named p wZ wY
edit1'')

instance Commute (RebaseChange p) where
    commute :: (:>) (RebaseChange p) (RebaseChange p) wX wY
-> Maybe ((:>) (RebaseChange p) (RebaseChange p) wX wY)
commute _ = Maybe ((:>) (RebaseChange p) (RebaseChange p) wX wY)
forall a. a
impossible

instance (PrimPatchBase p, PatchInspect p) => PatchInspect (RebaseSelect p) where
   listTouchedFiles :: RebaseSelect p wX wY -> [String]
listTouchedFiles (RSFwd fixup :: FL (RebaseFixup p) wX wY
fixup toedit :: Named p wY wY
toedit) = [String] -> [String]
forall a. Eq a => [a] -> [a]
nub (FL (RebaseFixup p) wX wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles FL (RebaseFixup p) wX wY
fixup [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Named p wY wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles Named p wY wY
toedit)
   listTouchedFiles (RSRev fixup :: FL (RebaseFixup p) wY wY
fixup toedit :: Named p wY wX
toedit) = [String] -> [String]
forall a. Eq a => [a] -> [a]
nub (FL (RebaseFixup p) wY wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles FL (RebaseFixup p) wY wY
fixup [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Named p wY wX -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles Named p wY wX
toedit)

   hunkMatches :: (ByteString -> Bool) -> RebaseSelect p wX wY -> Bool
hunkMatches f :: ByteString -> Bool
f (RSFwd fixup :: FL (RebaseFixup p) wX wY
fixup toedit :: Named p wY wY
toedit) = (ByteString -> Bool) -> FL (RebaseFixup p) wX wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL (RebaseFixup p) wX wY
fixup Bool -> Bool -> Bool
|| (ByteString -> Bool) -> Named p wY wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f Named p wY wY
toedit
   hunkMatches f :: ByteString -> Bool
f (RSRev fixup :: FL (RebaseFixup p) wY wY
fixup toedit :: Named p wY wX
toedit) = (ByteString -> Bool) -> FL (RebaseFixup p) wY wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL (RebaseFixup p) wY wY
fixup Bool -> Bool -> Bool
|| (ByteString -> Bool) -> Named p wY wX -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f Named p wY wX
toedit

instance (PrimPatchBase p, PatchInspect p) => PatchInspect (RebaseChange p) where
   listTouchedFiles :: RebaseChange p wX wY -> [String]
listTouchedFiles (RCFwd fixup :: FL (RebaseFixup p) wX wY
fixup contents :: FL p wY wY
contents) = [String] -> [String]
forall a. Eq a => [a] -> [a]
nub (FL (RebaseFixup p) wX wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles FL (RebaseFixup p) wX wY
fixup [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ FL p wY wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles FL p wY wY
contents)
   listTouchedFiles (RCRev fixup :: FL (RebaseFixup p) wY wY
fixup contents :: FL p wY wX
contents) = [String] -> [String]
forall a. Eq a => [a] -> [a]
nub (FL (RebaseFixup p) wY wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles FL (RebaseFixup p) wY wY
fixup [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ FL p wY wX -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles FL p wY wX
contents)

   hunkMatches :: (ByteString -> Bool) -> RebaseChange p wX wY -> Bool
hunkMatches f :: ByteString -> Bool
f (RCFwd fixup :: FL (RebaseFixup p) wX wY
fixup contents :: FL p wY wY
contents) = (ByteString -> Bool) -> FL (RebaseFixup p) wX wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL (RebaseFixup p) wX wY
fixup Bool -> Bool -> Bool
|| (ByteString -> Bool) -> FL p wY wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL p wY wY
contents
   hunkMatches f :: ByteString -> Bool
f (RCRev fixup :: FL (RebaseFixup p) wY wY
fixup contents :: FL p wY wX
contents) = (ByteString -> Bool) -> FL (RebaseFixup p) wY wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL (RebaseFixup p) wY wY
fixup Bool -> Bool -> Bool
|| (ByteString -> Bool) -> FL p wY wX -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f FL p wY wX
contents

-- |Split a list of rebase patches into those that will
-- have conflicts if unsuspended and those that won't.
partitionUnconflicted
    :: (PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p)
    => FL (RebaseSelect p) wX wY
    -> (FL (RebaseSelect p) :> RL (RebaseSelect p)) wX wY
partitionUnconflicted :: FL (RebaseSelect p) wX wY
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wY
partitionUnconflicted = RL (RebaseSelect p) wX wX
-> FL (RebaseSelect p) wX wY
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wY
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p) =>
RL (RebaseSelect p) wX wY
-> FL (RebaseSelect p) wY wZ
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wZ
partitionUnconflictedAcc RL (RebaseSelect p) wX wX
forall (a :: * -> * -> *) wX. RL a wX wX
NilRL

partitionUnconflictedAcc :: (PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p)
                         => RL (RebaseSelect p) wX wY -> FL (RebaseSelect p) wY wZ
                         -> (FL (RebaseSelect p) :> RL (RebaseSelect p)) wX wZ
partitionUnconflictedAcc :: RL (RebaseSelect p) wX wY
-> FL (RebaseSelect p) wY wZ
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wZ
partitionUnconflictedAcc right :: RL (RebaseSelect p) wX wY
right NilFL = FL (RebaseSelect p) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL (RebaseSelect p) wX wX
-> RL (RebaseSelect p) wX wY
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RL (RebaseSelect p) wX wY
right
partitionUnconflictedAcc right :: RL (RebaseSelect p) wX wY
right (p :: RebaseSelect p wY wY
p :>: ps :: FL (RebaseSelect p) wY wZ
ps) =
   case CommuteFn (RebaseSelect p) (RebaseSelect p)
-> (:>) (RL (RebaseSelect p)) (RebaseSelect p) wX wY
-> Maybe ((:>) (RebaseSelect p) (RL (RebaseSelect p)) wX wY)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn (RL p1) p2
commuterRLId CommuteFn (RebaseSelect p) (RebaseSelect p)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (RL (RebaseSelect p) wX wY
right RL (RebaseSelect p) wX wY
-> RebaseSelect p wY wY
-> (:>) (RL (RebaseSelect p)) (RebaseSelect p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RebaseSelect p wY wY
p) of
     Just (p' :: RebaseSelect p wX wZ
p'@(RSFwd NilFL _) :> right' :: RL (RebaseSelect p) wZ wY
right')
       -> case RL (RebaseSelect p) wZ wY
-> FL (RebaseSelect p) wY wZ
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wZ wZ
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p) =>
RL (RebaseSelect p) wX wY
-> FL (RebaseSelect p) wY wZ
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wZ
partitionUnconflictedAcc RL (RebaseSelect p) wZ wY
right' FL (RebaseSelect p) wY wZ
ps of
            left' :: FL (RebaseSelect p) wZ wZ
left' :> right'' :: RL (RebaseSelect p) wZ wZ
right'' -> (RebaseSelect p wX wZ
p' RebaseSelect p wX wZ
-> FL (RebaseSelect p) wZ wZ -> FL (RebaseSelect p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseSelect p) wZ wZ
left') FL (RebaseSelect p) wX wZ
-> RL (RebaseSelect p) wZ wZ
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> RL (RebaseSelect p) wZ wZ
right''
     _ -> RL (RebaseSelect p) wX wY
-> FL (RebaseSelect p) wY wZ
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wZ
forall (p :: * -> * -> *) wX wY wZ.
(PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p) =>
RL (RebaseSelect p) wX wY
-> FL (RebaseSelect p) wY wZ
-> (:>) (FL (RebaseSelect p)) (RL (RebaseSelect p)) wX wZ
partitionUnconflictedAcc (RL (RebaseSelect p) wX wY
right RL (RebaseSelect p) wX wY
-> RebaseSelect p wY wY -> RL (RebaseSelect p) wX wY
forall (a :: * -> * -> *) wX wY wZ.
RL a wX wY -> a wY wZ -> RL a wX wZ
:<: RebaseSelect p wY wY
p) FL (RebaseSelect p) wY wZ
ps

-- | A patch, together with a list of patch names that it used to depend on,
-- but were lost during the rebasing process. The UI can use this information
-- to report them to the user.
data WithDroppedDeps p wX wY =
    WithDroppedDeps {
        WithDroppedDeps p wX wY -> p wX wY
wddPatch :: p wX wY,
        WithDroppedDeps p wX wY -> [PatchInfo]
wddDependedOn :: [PatchInfo]
    }

noDroppedDeps :: p wX wY -> WithDroppedDeps p wX wY
noDroppedDeps :: p wX wY -> WithDroppedDeps p wX wY
noDroppedDeps p :: p wX wY
p = p wX wY -> [PatchInfo] -> WithDroppedDeps p wX wY
forall (p :: * -> * -> *) wX wY.
p wX wY -> [PatchInfo] -> WithDroppedDeps p wX wY
WithDroppedDeps p wX wY
p []

instance PrimPatchBase p => PrimPatchBase (WithDroppedDeps p) where
   type PrimOf (WithDroppedDeps p) = PrimOf p

instance Effect p => Effect (WithDroppedDeps p) where
   effect :: WithDroppedDeps p wX wY -> FL (PrimOf (WithDroppedDeps p)) wX wY
effect = p wX wY -> FL (PrimOf p) wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (p wX wY -> FL (PrimOf p) wX wY)
-> (WithDroppedDeps p wX wY -> p wX wY)
-> WithDroppedDeps p wX wY
-> FL (PrimOf p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WithDroppedDeps p wX wY -> p wX wY
forall (p :: * -> * -> *) wX wY. WithDroppedDeps p wX wY -> p wX wY
wddPatch

-- Note, this could probably be rewritten using a generalised commuteWhatWeCanFL from
-- Darcs.Patch.Permutations.
-- |@pushThrough (ps :> (qs :> te))@ tries to commute as much of @ps@ as possible through
-- both @qs@ and @te@, giving @psStuck :> (qs' :> te') :> psCommuted@.
-- Anything that can be commuted ends up in @psCommuted@ and anything that can't goes in
-- @psStuck@.
pushThrough :: (PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p)
            => (FL (RebaseFixup p) :> (FL (RebaseFixup p) :> Named p)) wX wY
            -> (FL (RebaseFixup p) :> (FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p)) wX wY
pushThrough :: (:>) (FL (RebaseFixup p)) (FL (RebaseFixup p) :> Named p) wX wY
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wY
pushThrough (NilFL :> v :: (:>) (FL (RebaseFixup p)) (Named p) wZ wY
v) = FL (RebaseFixup p) wZ wZ
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL (RebaseFixup p) wZ wZ
-> (:>) (FL (RebaseFixup p) :> Named p) (FL (RebaseFixup p)) wZ wY
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wZ
     wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (:>) (FL (RebaseFixup p)) (Named p) wZ wY
v (:>) (FL (RebaseFixup p)) (Named p) wZ wY
-> FL (RebaseFixup p) wY wY
-> (:>) (FL (RebaseFixup p) :> Named p) (FL (RebaseFixup p)) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
pushThrough ((p :: RebaseFixup p wX wY
p :>: ps :: FL (RebaseFixup p) wY wZ
ps) :> v :: (:>) (FL (RebaseFixup p)) (Named p) wZ wY
v) =
  case (:>) (FL (RebaseFixup p)) (FL (RebaseFixup p) :> Named p) wY wY
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wY
     wY
forall (p :: * -> * -> *) wX wY.
(PrimPatchBase p, FromPrim p, Effect p, Commute p, Invert p) =>
(:>) (FL (RebaseFixup p)) (FL (RebaseFixup p) :> Named p) wX wY
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wY
pushThrough (FL (RebaseFixup p) wY wZ
ps FL (RebaseFixup p) wY wZ
-> (:>) (FL (RebaseFixup p)) (Named p) wZ wY
-> (:>) (FL (RebaseFixup p)) (FL (RebaseFixup p) :> Named p) wY wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (:>) (FL (RebaseFixup p)) (Named p) wZ wY
v) of
   psS :: FL (RebaseFixup p) wY wZ
psS :> v' :: (:>) (FL (RebaseFixup p)) (Named p) wZ wZ
v'@(qs :: FL (RebaseFixup p) wZ wZ
qs:>te :: Named p wZ wZ
te) :> ps' :: FL (RebaseFixup p) wZ wY
ps' ->
     (:>)
  (FL (RebaseFixup p))
  ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
  wX
  wY
-> Maybe
     ((:>)
        (FL (RebaseFixup p))
        ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
        wX
        wY)
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wY
forall a. a -> Maybe a -> a
fromMaybe ((RebaseFixup p wX wY
p RebaseFixup p wX wY
-> FL (RebaseFixup p) wY wZ -> FL (RebaseFixup p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseFixup p) wY wZ
psS) FL (RebaseFixup p) wX wZ
-> (:>) (FL (RebaseFixup p) :> Named p) (FL (RebaseFixup p)) wZ wY
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (:>) (FL (RebaseFixup p)) (Named p) wZ wZ
v' (:>) (FL (RebaseFixup p)) (Named p) wZ wZ
-> FL (RebaseFixup p) wZ wY
-> (:>) (FL (RebaseFixup p) :> Named p) (FL (RebaseFixup p)) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wZ wY
ps') (Maybe
   ((:>)
      (FL (RebaseFixup p))
      ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
      wX
      wY)
 -> (:>)
      (FL (RebaseFixup p))
      ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
      wX
      wY)
-> Maybe
     ((:>)
        (FL (RebaseFixup p))
        ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
        wX
        wY)
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wY
forall a b. (a -> b) -> a -> b
$ do
       psS' :: FL (RebaseFixup p) wX wZ
psS' :> p' :: RebaseFixup p wZ wZ
p' <- CommuteFn (RebaseFixup p) (RebaseFixup p)
-> (:>) (RebaseFixup p) (FL (RebaseFixup p)) wX wZ
-> Maybe ((:>) (FL (RebaseFixup p)) (RebaseFixup p) wX wZ)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn p1 (FL p2)
commuterIdFL CommuteFn (RebaseFixup p) (RebaseFixup p)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (RebaseFixup p wX wY
p RebaseFixup p wX wY
-> FL (RebaseFixup p) wY wZ
-> (:>) (RebaseFixup p) (FL (RebaseFixup p)) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wY wZ
psS)
       qs' :: FL (RebaseFixup p) wZ wZ
qs' :> p'' :: RebaseFixup p wZ wZ
p'' <- CommuteFn (RebaseFixup p) (RebaseFixup p)
-> (:>) (RebaseFixup p) (FL (RebaseFixup p)) wZ wZ
-> Maybe ((:>) (FL (RebaseFixup p)) (RebaseFixup p) wZ wZ)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
CommuteFn p1 p2 -> CommuteFn p1 (FL p2)
commuterIdFL CommuteFn (RebaseFixup p) (RebaseFixup p)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
selfCommuter (RebaseFixup p wZ wZ
p' RebaseFixup p wZ wZ
-> FL (RebaseFixup p) wZ wZ
-> (:>) (RebaseFixup p) (FL (RebaseFixup p)) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wZ wZ
qs)
       te' :: Named p wZ wZ
te' :> p''' :: FL (RebaseFixup p) wZ wZ
p''' <- (:>) (RebaseFixup p) (Named p) wZ wZ
-> Maybe ((:>) (Named p) (FL (RebaseFixup p)) wZ wZ)
forall (p :: * -> * -> *) wX wY.
(FromPrim p, Effect p, Commute p, Invert p) =>
(:>) (RebaseFixup p) (Named p) wX wY
-> Maybe ((:>) (Named p) (FL (RebaseFixup p)) wX wY)
commuteFixupNamed (RebaseFixup p wZ wZ
p'' RebaseFixup p wZ wZ
-> Named p wZ wZ -> (:>) (RebaseFixup p) (Named p) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> Named p wZ wZ
te)
       (:>)
  (FL (RebaseFixup p))
  ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
  wX
  wY
-> Maybe
     ((:>)
        (FL (RebaseFixup p))
        ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
        wX
        wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (FL (RebaseFixup p) wX wZ
psS' FL (RebaseFixup p) wX wZ
-> (:>) (FL (RebaseFixup p) :> Named p) (FL (RebaseFixup p)) wZ wY
-> (:>)
     (FL (RebaseFixup p))
     ((FL (RebaseFixup p) :> Named p) :> FL (RebaseFixup p))
     wX
     wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (FL (RebaseFixup p) wZ wZ
qs' FL (RebaseFixup p) wZ wZ
-> Named p wZ wZ -> (:>) (FL (RebaseFixup p)) (Named p) wZ wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> Named p wZ wZ
te') (:>) (FL (RebaseFixup p)) (Named p) wZ wZ
-> FL (RebaseFixup p) wZ wY
-> (:>) (FL (RebaseFixup p) :> Named p) (FL (RebaseFixup p)) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (FL (RebaseFixup p) wZ wZ
p''' FL (RebaseFixup p) wZ wZ
-> FL (RebaseFixup p) wZ wY -> FL (RebaseFixup p) wZ wY
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RebaseFixup p) wZ wY
ps'))

type WDDNamed p = WithDroppedDeps (Named p)

mergerIdWDD :: MergeFn p1 p2 -> MergeFn p1 (WithDroppedDeps p2)
mergerIdWDD :: MergeFn p1 p2 -> MergeFn p1 (WithDroppedDeps p2)
mergerIdWDD merger :: MergeFn p1 p2
merger (p1 :: p1 wZ wX
p1 :\/: WithDroppedDeps p2 :: p2 wZ wY
p2 deps :: [PatchInfo]
deps) =
   case (:\/:) p1 p2 wX wY -> (:/\:) p2 p1 wX wY
MergeFn p1 p2
merger (p1 wZ wX
p1 p1 wZ wX -> p2 wZ wY -> (:\/:) p1 p2 wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: p2 wZ wY
p2) of
     p2' :: p2 wX wZ
p2' :/\: p1' :: p1 wY wZ
p1' -> p2 wX wZ -> [PatchInfo] -> WithDroppedDeps p2 wX wZ
forall (p :: * -> * -> *) wX wY.
p wX wY -> [PatchInfo] -> WithDroppedDeps p wX wY
WithDroppedDeps p2 wX wZ
p2' [PatchInfo]
deps WithDroppedDeps p2 wX wZ
-> p1 wY wZ -> (:/\:) (WithDroppedDeps p2) p1 wX wY
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: p1 wY wZ
p1'


commuterIdWDD :: CommuteFn p q -> CommuteFn p (WithDroppedDeps q)
commuterIdWDD :: CommuteFn p q -> CommuteFn p (WithDroppedDeps q)
commuterIdWDD commuter :: CommuteFn p q
commuter (p :: p wX wZ
p :> WithDroppedDeps q :: q wZ wY
q deps :: [PatchInfo]
deps)
  = do -- no need to worry about names, because by definition a dropped dep
       -- is a name we no longer have
       -- TODO consistency checking?
       -- TODO consider inverse commutes, e.g. what happens if we wanted to
       -- commute (WithDroppedDeps ... [n] :> AddName n)?
       q' :: q wX wZ
q' :> p' :: p wZ wY
p' <- (:>) p q wX wY -> Maybe ((:>) q p wX wY)
CommuteFn p q
commuter (p wX wZ
p p wX wZ -> q wZ wY -> (:>) p q wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> q wZ wY
q)
       (:>) (WithDroppedDeps q) p wX wY
-> Maybe ((:>) (WithDroppedDeps q) p wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (q wX wZ -> [PatchInfo] -> WithDroppedDeps q wX wZ
forall (p :: * -> * -> *) wX wY.
p wX wY -> [PatchInfo] -> WithDroppedDeps p wX wY
WithDroppedDeps q wX wZ
q' [PatchInfo]
deps WithDroppedDeps q wX wZ
-> p wZ wY -> (:>) (WithDroppedDeps q) p wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> p wZ wY
p')

-- |Forcibly commute a 'RebaseName' with a patch, dropping any dependencies
-- if necessary and recording them in the patch
forceCommuteName :: (RebaseName p :> WDDNamed p) wX wY -> (WDDNamed p :> RebaseName p) wX wY
forceCommuteName :: (:>) (RebaseName p) (WDDNamed p) wX wY
-> (:>) (WDDNamed p) (RebaseName p) wX wY
forceCommuteName (AddName an :: PatchInfo
an :> WithDroppedDeps (NamedP pn :: PatchInfo
pn deps :: [PatchInfo]
deps body :: FL p wZ wY
body) ddeps :: [PatchInfo]
ddeps)
  | PatchInfo
an PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
pn = (:>) (WDDNamed p) (RebaseName p) wX wY
forall a. a
impossible
  | Bool
otherwise = Named p wX Any -> [PatchInfo] -> WithDroppedDeps (Named p) wX Any
forall (p :: * -> * -> *) wX wY.
p wX wY -> [PatchInfo] -> WithDroppedDeps p wX wY
WithDroppedDeps (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]
deps [PatchInfo] -> [PatchInfo] -> [PatchInfo]
forall a. Eq a => [a] -> [a] -> [a]
\\ [PatchInfo
an]) (FL p wZ wY -> FL p wX Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP FL p wZ wY
body)) (if PatchInfo
an PatchInfo -> [PatchInfo] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PatchInfo]
deps then PatchInfo
anPatchInfo -> [PatchInfo] -> [PatchInfo]
forall a. a -> [a] -> [a]
:[PatchInfo]
ddeps else [PatchInfo]
ddeps) WithDroppedDeps (Named p) wX Any
-> RebaseName p Any wY -> (:>) (WDDNamed p) (RebaseName p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> PatchInfo -> RebaseName p Any wY
forall (p :: * -> * -> *) wX wY. PatchInfo -> RebaseName p wX wY
AddName PatchInfo
an
forceCommuteName (DelName dn :: PatchInfo
dn :> p :: WDDNamed p wZ wY
p@(WithDroppedDeps (NamedP pn :: PatchInfo
pn deps :: [PatchInfo]
deps _body :: FL p wZ wY
_body) _ddeps :: [PatchInfo]
_ddeps))
  | PatchInfo
dn PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
pn = (:>) (WDDNamed p) (RebaseName p) wX wY
forall a. a
impossible
  | PatchInfo
dn PatchInfo -> [PatchInfo] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PatchInfo]
deps = (:>) (WDDNamed p) (RebaseName p) wX wY
forall a. a
impossible
  | Bool
otherwise = WDDNamed p wZ wY -> WithDroppedDeps (Named p) wX Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP WDDNamed p wZ wY
p WithDroppedDeps (Named p) wX Any
-> RebaseName p Any wY -> (:>) (WDDNamed p) (RebaseName p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> PatchInfo -> RebaseName p Any wY
forall (p :: * -> * -> *) wX wY. PatchInfo -> RebaseName p wX wY
DelName PatchInfo
dn
forceCommuteName (Rename old :: PatchInfo
old new :: PatchInfo
new :> WithDroppedDeps (NamedP pn :: PatchInfo
pn deps :: [PatchInfo]
deps body :: FL p wZ wY
body) ddeps :: [PatchInfo]
ddeps)
  | PatchInfo
old PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
pn = (:>) (WDDNamed p) (RebaseName p) wX wY
forall a. a
impossible
  | PatchInfo
new PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
pn = (:>) (WDDNamed p) (RebaseName p) wX wY
forall a. a
impossible
  | PatchInfo
old PatchInfo -> [PatchInfo] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PatchInfo]
deps = (:>) (WDDNamed p) (RebaseName p) wX wY
forall a. a
impossible
  | Bool
otherwise =
      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 Named p wX Any -> [PatchInfo] -> WithDroppedDeps (Named p) wX Any
forall (p :: * -> * -> *) wX wY.
p wX wY -> [PatchInfo] -> WithDroppedDeps p wX wY
WithDroppedDeps (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 wZ wY -> FL p wX Any
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP FL p wZ wY
body)) [PatchInfo]
ddeps WithDroppedDeps (Named p) wX Any
-> RebaseName p Any wY -> (:>) (WDDNamed p) (RebaseName p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> PatchInfo -> PatchInfo -> RebaseName p Any wY
forall (p :: * -> * -> *) wX wY.
PatchInfo -> PatchInfo -> RebaseName p wX wY
Rename PatchInfo
old PatchInfo
new

forceCommutePrim :: (Merge p, Invert p, Effect p, FromPrim p)
                 => (PrimOf p :> WDDNamed p) wX wY
                 -> (WDDNamed p :> FL (PrimOf p)) wX wY
forceCommutePrim :: (:>) (PrimOf p) (WDDNamed p) wX wY
-> (:>) (WDDNamed p) (FL (PrimOf p)) wX wY
forceCommutePrim (p :: PrimOf p wX wZ
p :> q :: WDDNamed p wZ wY
q) =
    case MergeFn p (Named p)
-> (:\/:) p (WDDNamed p) wX wY -> (:/\:) (WDDNamed p) p wX wY
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
MergeFn p1 p2 -> MergeFn p1 (WithDroppedDeps p2)
mergerIdWDD (MergeFn p p -> MergeFn p (Named p)
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
MergeFn p1 p2 -> MergeFn p1 (Named p2)
mergerIdNamed MergeFn p p
forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
selfMerger) (p wX wZ -> p wZ wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (PrimOf p wX wZ -> p wX wZ
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim PrimOf p wX wZ
p) p wZ wX -> WDDNamed p wZ wY -> (:\/:) p (WDDNamed p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: WDDNamed p wZ wY
q) of
        q' :: WithDroppedDeps (Named p) wX wZ
q' :/\: invp' :: p wY wZ
invp' -> WithDroppedDeps (Named p) wX wZ
q' WithDroppedDeps (Named p) wX wZ
-> FL (PrimOf p) wZ wY -> (:>) (WDDNamed p) (FL (PrimOf p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> p wZ wY -> FL (PrimOf p) wZ wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (p wY wZ -> p wZ wY
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert p wY wZ
invp')


forceCommutesPrim :: (Merge p, Invert p, Effect p, FromPrim p)
                  => (PrimOf p :> FL (WDDNamed p)) wX wY
                  -> (FL (WDDNamed p) :> FL (PrimOf p)) wX wY
forceCommutesPrim :: (:>) (PrimOf p) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forceCommutesPrim (p :: PrimOf p wX wZ
p :> NilFL) = FL (WDDNamed p) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL (WDDNamed p) wX wX
-> FL (PrimOf p) wX wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (PrimOf p wX wY
PrimOf p wX wZ
p 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
:>: FL (PrimOf p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
forceCommutesPrim (p :: PrimOf p wX wZ
p :> (q :: WDDNamed p wZ wY
q :>: qs :: FL (WDDNamed p) wY wY
qs)) =
    case (:>) (PrimOf p) (WDDNamed p) wX wY
-> (:>) (WDDNamed p) (FL (PrimOf p)) wX wY
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p) =>
(:>) (PrimOf p) (WDDNamed p) wX wY
-> (:>) (WDDNamed p) (FL (PrimOf p)) wX wY
forceCommutePrim (PrimOf p wX wZ
p PrimOf p wX wZ
-> WDDNamed p wZ wY -> (:>) (PrimOf p) (WDDNamed p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> WDDNamed p wZ wY
q) of
        q' :: WDDNamed p wX wZ
q' :> p' :: FL (PrimOf p) wZ wY
p' -> case (:>) (FL (PrimOf p)) (FL (WDDNamed p)) wZ wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wZ wY
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p) =>
(:>) (FL (PrimOf p)) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forceCommutessPrim ( FL (PrimOf p) wZ wY
p' FL (PrimOf p) wZ wY
-> FL (WDDNamed p) wY wY
-> (:>) (FL (PrimOf p)) (FL (WDDNamed p)) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (WDDNamed p) wY wY
qs) of
            qs' :: FL (WDDNamed p) wZ wZ
qs' :> p'' :: FL (PrimOf p) wZ wY
p'' -> (WDDNamed p wX wZ
q' WDDNamed p wX wZ -> FL (WDDNamed p) wZ wZ -> FL (WDDNamed p) wX wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (WDDNamed p) wZ wZ
qs') FL (WDDNamed p) wX wZ
-> FL (PrimOf p) wZ wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (PrimOf p) wZ wY
p''

forceCommutessPrim :: (Merge p, Invert p, Effect p, FromPrim p)
                   => (FL (PrimOf p) :> FL (WDDNamed p)) wX wY
                   -> (FL (WDDNamed p) :> FL (PrimOf p)) wX wY
forceCommutessPrim :: (:>) (FL (PrimOf p)) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forceCommutessPrim (NilFL :> qs :: FL (WDDNamed p) wZ wY
qs) = FL (WDDNamed p) wZ wY
qs FL (WDDNamed p) wZ wY
-> FL (PrimOf p) wY wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (PrimOf p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
forceCommutessPrim ((p :: PrimOf p wX wY
p :>: ps :: FL (PrimOf p) wY wZ
ps) :> qs :: FL (WDDNamed p) wZ wY
qs) =
    case (:>) (FL (PrimOf p)) (FL (WDDNamed p)) wY wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wY wY
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p) =>
(:>) (FL (PrimOf p)) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forceCommutessPrim (FL (PrimOf p) wY wZ
ps FL (PrimOf p) wY wZ
-> FL (WDDNamed p) wZ wY
-> (:>) (FL (PrimOf p)) (FL (WDDNamed p)) wY wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (WDDNamed p) wZ wY
qs) of
        qs' :: FL (WDDNamed p) wY wZ
qs' :> ps' :: FL (PrimOf p) wZ wY
ps' ->
            case (:>) (PrimOf p) (FL (WDDNamed p)) wX wZ
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wZ
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p) =>
(:>) (PrimOf p) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forceCommutesPrim (PrimOf p wX wY
p PrimOf p wX wY
-> FL (WDDNamed p) wY wZ -> (:>) (PrimOf p) (FL (WDDNamed p)) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (WDDNamed p) wY wZ
qs') of
                qs'' :: FL (WDDNamed p) wX wZ
qs'' :> p' :: FL (PrimOf p) wZ wZ
p' -> FL (WDDNamed p) wX wZ
qs'' FL (WDDNamed p) wX wZ
-> FL (PrimOf p) wZ wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (FL (PrimOf p) wZ wZ
p' FL (PrimOf p) wZ wZ -> FL (PrimOf p) wZ wY -> FL (PrimOf p) wZ wY
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (PrimOf p) wZ wY
ps')

forceCommutess :: (Merge p, Invert p, Effect p, FromPrim p)
               => (FL (RebaseFixup p) :> FL (WDDNamed p)) wX wY
               -> (FL (WDDNamed p) :> FL (RebaseFixup p)) wX wY
forceCommutess :: (:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forceCommutess (NilFL :> qs :: FL (WDDNamed p) wZ wY
qs) = FL (WDDNamed p) wZ wY
qs FL (WDDNamed p) wZ wY
-> FL (RebaseFixup p) wY wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wZ wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
forceCommutess ((NameFixup n :: RebaseName p wX wY
n :>: ps :: FL (RebaseFixup p) wY wZ
ps) :> qs :: FL (WDDNamed p) wZ wY
qs) =
    case (:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wY wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wY wY
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p) =>
(:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forceCommutess (FL (RebaseFixup p) wY wZ
ps FL (RebaseFixup p) wY wZ
-> FL (WDDNamed p) wZ wY
-> (:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wY wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (WDDNamed p) wZ wY
qs) of
        qs' :: FL (WDDNamed p) wY wZ
qs' :> ps' :: FL (RebaseFixup p) wZ wY
ps' ->
            case TotalCommuteFn (RebaseName p) (WDDNamed p)
-> (:>) (RebaseName p) (FL (WDDNamed p)) wX wZ
-> (:>) (FL (WDDNamed p)) (RebaseName p) wX wZ
forall (p1 :: * -> * -> *) (p2 :: * -> * -> *).
TotalCommuteFn p1 p2 -> TotalCommuteFn p1 (FL p2)
totalCommuterIdFL TotalCommuteFn (RebaseName p) (WDDNamed p)
forall (p :: * -> * -> *) wX wY.
(:>) (RebaseName p) (WDDNamed p) wX wY
-> (:>) (WDDNamed p) (RebaseName p) wX wY
forceCommuteName (RebaseName p wX wY
n RebaseName p wX wY
-> FL (WDDNamed p) wY wZ
-> (:>) (RebaseName p) (FL (WDDNamed p)) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (WDDNamed p) wY wZ
qs') of
                qs'' :: FL (WDDNamed p) wX wZ
qs'' :> n' :: RebaseName p wZ wZ
n' -> FL (WDDNamed p) wX wZ
qs'' FL (WDDNamed p) wX wZ
-> FL (RebaseFixup p) wZ wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (RebaseName p wZ wZ -> RebaseFixup p wZ wZ
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> RebaseFixup p wX wY
NameFixup RebaseName p wZ wZ
n' RebaseFixup p wZ wZ
-> FL (RebaseFixup p) wZ wY -> FL (RebaseFixup p) wZ wY
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (RebaseFixup p) wZ wY
ps')
forceCommutess ((PrimFixup p :: PrimOf p wX wY
p :>: ps :: FL (RebaseFixup p) wY wZ
ps) :> qs :: FL (WDDNamed p) wZ wY
qs) =
    case (:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wY wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wY wY
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p) =>
(:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forceCommutess (FL (RebaseFixup p) wY wZ
ps FL (RebaseFixup p) wY wZ
-> FL (WDDNamed p) wZ wY
-> (:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wY wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (WDDNamed p) wZ wY
qs) of
        qs' :: FL (WDDNamed p) wY wZ
qs' :> ps' :: FL (RebaseFixup p) wZ wY
ps' ->
            case (:>) (PrimOf p) (FL (WDDNamed p)) wX wZ
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wZ
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p) =>
(:>) (PrimOf p) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (PrimOf p)) wX wY
forceCommutesPrim (PrimOf p wX wY
p PrimOf p wX wY
-> FL (WDDNamed p) wY wZ -> (:>) (PrimOf p) (FL (WDDNamed p)) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (WDDNamed p) wY wZ
qs') of
                qs'' :: FL (WDDNamed p) wX wZ
qs'' :> p' :: FL (PrimOf p) wZ wZ
p' -> FL (WDDNamed p) wX wZ
qs'' FL (WDDNamed p) wX wZ
-> FL (RebaseFixup p) wZ wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> ((forall wW wY. PrimOf p wW wY -> RebaseFixup p wW wY)
-> FL (PrimOf p) wZ wZ -> FL (RebaseFixup p) wZ 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. PrimOf p wW wY -> RebaseFixup p wW wY
forall (p :: * -> * -> *) wX wY.
PrimPatch (PrimOf p) =>
PrimOf p wX wY -> RebaseFixup p wX wY
PrimFixup FL (PrimOf p) wZ wZ
p' FL (RebaseFixup p) wZ wZ
-> FL (RebaseFixup p) wZ wY -> FL (RebaseFixup p) wZ wY
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RebaseFixup p) wZ wY
ps')

-- |Turn a selected rebase patch back into a patch we can apply to
-- the main repository, together with residual fixups that need
-- to go back into the rebase state (unless the rebase is now finished).
-- Any fixups associated with the patch will turn into conflicts.
extractRebaseSelect :: (Merge p, Invert p, Effect p, FromPrim p, PrimPatchBase p)
                    => FL (RebaseSelect p) wX wY
                    -> (FL (WDDNamed p) :> FL (RebaseFixup p)) wX wY
extractRebaseSelect :: FL (RebaseSelect p) wX wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
extractRebaseSelect NilFL = FL (WDDNamed p) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL FL (WDDNamed p) wX wX
-> FL (RebaseFixup p) wX wX
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wX
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wX wX
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL
extractRebaseSelect (RSFwd fixups :: FL (RebaseFixup p) wX wY
fixups toedit :: Named p wY wY
toedit :>: rest :: FL (RebaseSelect p) wY wY
rest)
  = case FL (RebaseSelect p) wY wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wY wY
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p, PrimPatchBase p) =>
FL (RebaseSelect p) wX wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
extractRebaseSelect FL (RebaseSelect p) wY wY
rest of
     toedits2 :: FL (WDDNamed p) wY wZ
toedits2 :> fixups2 :: FL (RebaseFixup p) wZ wY
fixups2 ->
        case (:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wX wZ
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wZ
forall (p :: * -> * -> *) wX wY.
(Merge p, Invert p, Effect p, FromPrim p) =>
(:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wX wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forceCommutess (FL (RebaseFixup p) wX wY
fixups FL (RebaseFixup p) wX wY
-> FL (WDDNamed p) wY wZ
-> (:>) (FL (RebaseFixup p)) (FL (WDDNamed p)) wX wZ
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (Named p wY wY -> [PatchInfo] -> WithDroppedDeps (Named p) wY wY
forall (p :: * -> * -> *) wX wY.
p wX wY -> [PatchInfo] -> WithDroppedDeps p wX wY
WithDroppedDeps Named p wY wY
toedit [] WithDroppedDeps (Named p) wY wY
-> FL (WDDNamed p) wY wZ -> FL (WDDNamed p) wY wZ
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (WDDNamed p) wY wZ
toedits2)) of
          toedits' :: FL (WDDNamed p) wX wZ
toedits' :> fixups' :: FL (RebaseFixup p) wZ wZ
fixups' ->
            FL (WDDNamed p) wX wZ
toedits' FL (WDDNamed p) wX wZ
-> FL (RebaseFixup p) wZ wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (FL (RebaseFixup p) wZ wZ
fixups' FL (RebaseFixup p) wZ wZ
-> FL (RebaseFixup p) wZ wY -> FL (RebaseFixup p) wZ wY
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ FL (RebaseFixup p) wZ wY
fixups2)

extractRebaseSelect (RSRev{} :>: _) = (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forall a. a
impossible

-- signature to be compatible with extractRebaseSelect
-- | Like 'extractRebaseSelect', but any fixups are "reified" into a separate patch.
reifyRebaseSelect :: forall p wX wY
                   . (PrimPatchBase p, FromPrim p)
                  => FL (RebaseSelect p) wX wY
                  -> IO ((FL (WDDNamed p) :> FL (RebaseFixup p)) wX wY)
reifyRebaseSelect :: FL (RebaseSelect p) wX wY
-> IO ((:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY)
reifyRebaseSelect rs :: FL (RebaseSelect p) wX wY
rs = do FL (WDDNamed p) wX wY
res <- FL (FL (WDDNamed p)) wX wY -> FL (WDDNamed p) wX wY
forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL (FL (FL (WDDNamed p)) wX wY -> FL (WDDNamed p) wX wY)
-> IO (FL (FL (WDDNamed p)) wX wY) -> IO (FL (WDDNamed p) wX wY)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall wW wY. RebaseSelect p wW wY -> IO (FL (WDDNamed p) wW wY))
-> FL (RebaseSelect p) wX wY -> IO (FL (FL (WDDNamed p)) wX wY)
forall (m :: * -> *) (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
Monad m =>
(forall wW wY. a wW wY -> m (b wW wY))
-> FL a wX wZ -> m (FL b wX wZ)
mapFL_FL_M forall wW wY. RebaseSelect p wW wY -> IO (FL (WDDNamed p) wW wY)
reifyOne FL (RebaseSelect p) wX wY
rs
                          (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
-> IO ((:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return (FL (WDDNamed p) wX wY
res FL (WDDNamed p) wX wY
-> FL (RebaseFixup p) wY wY
-> (:>) (FL (WDDNamed p)) (FL (RebaseFixup p)) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> FL (RebaseFixup p) wY wY
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
  where reifyOne :: RebaseSelect p wA wB -> IO (FL (WDDNamed p) wA wB)
        reifyOne :: RebaseSelect p wA wB -> IO (FL (WDDNamed p) wA wB)
reifyOne (RSFwd fixups :: FL (RebaseFixup p) wA wY
fixups toedit :: Named p wY wB
toedit) =
            case FL (RebaseFixup p) wA wY
-> (:>) (FL (RebaseName p)) (FL (PrimOf p)) wA wY
forall (p :: * -> * -> *) wX wY.
PrimPatchBase p =>
FL (RebaseFixup p) wX wY
-> (:>) (FL (RebaseName p)) (FL (PrimOf p)) wX wY
flToNamesPrims FL (RebaseFixup p) wA wY
fixups of
                names :: FL (RebaseName p) wA wZ
names :> NilFL ->
                    FL (WDDNamed p) wA wB -> IO (FL (WDDNamed p) wA wB)
forall (m :: * -> *) a. Monad m => a -> m a
return ((forall wW wY.
 RebaseName p wW wY -> WithDroppedDeps (Named p) wW wY)
-> FL (RebaseName p) wA wZ -> FL (WDDNamed p) wA 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 (Named p wW wY -> WithDroppedDeps (Named p) wW wY
forall (p :: * -> * -> *) wX wY. p wX wY -> WithDroppedDeps p wX wY
noDroppedDeps (Named p wW wY -> WithDroppedDeps (Named p) wW wY)
-> (RebaseName p wW wY -> Named p wW wY)
-> RebaseName p wW wY
-> WithDroppedDeps (Named p) wW wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RebaseName p wW wY -> Named p wW wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> Named p wX wY
mkDummy) FL (RebaseName p) wA wZ
names FL (WDDNamed p) wA wZ
-> FL (WDDNamed p) wZ wB -> FL (WDDNamed p) wA wB
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ Named p wY wB -> WithDroppedDeps (Named p) wY wB
forall (p :: * -> * -> *) wX wY. p wX wY -> WithDroppedDeps p wX wY
noDroppedDeps Named p wY wB
toedit WithDroppedDeps (Named p) wY wB
-> FL (WDDNamed p) wB wB -> FL (WDDNamed p) wY wB
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (WDDNamed p) wB wB
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
                names :: FL (RebaseName p) wA wZ
names :> prims :: FL (PrimOf p) wZ wY
prims -> do
                    Named p wZ wY
n <- FL (PrimOf p) wZ wY -> IO (Named p wZ wY)
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
FL (PrimOf p) wX wY -> IO (Named p wX wY)
mkReified FL (PrimOf p) wZ wY
prims
                    FL (WDDNamed p) wA wB -> IO (FL (WDDNamed p) wA wB)
forall (m :: * -> *) a. Monad m => a -> m a
return ((forall wW wY.
 RebaseName p wW wY -> WithDroppedDeps (Named p) wW wY)
-> FL (RebaseName p) wA wZ -> FL (WDDNamed p) wA 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 (Named p wW wY -> WithDroppedDeps (Named p) wW wY
forall (p :: * -> * -> *) wX wY. p wX wY -> WithDroppedDeps p wX wY
noDroppedDeps (Named p wW wY -> WithDroppedDeps (Named p) wW wY)
-> (RebaseName p wW wY -> Named p wW wY)
-> RebaseName p wW wY
-> WithDroppedDeps (Named p) wW wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RebaseName p wW wY -> Named p wW wY
forall (p :: * -> * -> *) wX wY.
RebaseName p wX wY -> Named p wX wY
mkDummy) FL (RebaseName p) wA wZ
names FL (WDDNamed p) wA wZ
-> FL (WDDNamed p) wZ wB -> FL (WDDNamed p) wA wB
forall (a :: * -> * -> *) wX wY wZ.
FL a wX wY -> FL a wY wZ -> FL a wX wZ
+>+ Named p wZ wY -> WithDroppedDeps (Named p) wZ wY
forall (p :: * -> * -> *) wX wY. p wX wY -> WithDroppedDeps p wX wY
noDroppedDeps Named p wZ wY
n WithDroppedDeps (Named p) wZ wY
-> FL (WDDNamed p) wY wB -> FL (WDDNamed p) wZ wB
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: Named p wY wB -> WithDroppedDeps (Named p) wY wB
forall (p :: * -> * -> *) wX wY. p wX wY -> WithDroppedDeps p wX wY
noDroppedDeps Named p wY wB
toedit WithDroppedDeps (Named p) wY wB
-> FL (WDDNamed p) wB wB -> FL (WDDNamed p) wY wB
forall (a :: * -> * -> *) wX wY wZ.
a wX wY -> FL a wY wZ -> FL a wX wZ
:>: FL (WDDNamed p) wB wB
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
        reifyOne (RSRev{}) = IO (FL (WDDNamed p) wA wB)
forall a. a
impossible

mkReified :: FromPrim p => FL (PrimOf p) wX wY -> IO (Named p wX wY)
mkReified :: FL (PrimOf p) wX wY -> IO (Named p wX wY)
mkReified ps :: FL (PrimOf p) wX wY
ps = do
     let name :: String
name = "Reified fixup patch"
     let desc :: [a]
desc = []
     String
date <- IO String
getIsoDateTime
     let author :: String
author = "Invalid <invalid@invalid>"
     String
-> String -> String -> [String] -> FL p wX wY -> IO (Named p wX wY)
forall (p :: * -> * -> *) wX wY.
String
-> String -> String -> [String] -> FL p wX wY -> IO (Named p wX wY)
namepatch String
date String
name String
author [String]
forall a. [a]
desc ((forall wW wY. PrimOf p wW wY -> p wW wY)
-> FL (PrimOf p) wX wY -> FL 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 forall wW wY. PrimOf p wW wY -> p wW wY
forall (p :: * -> * -> *) wX wY.
FromPrim p =>
PrimOf p wX wY -> p wX wY
fromPrim FL (PrimOf p) wX wY
ps)

mkDummy :: RebaseName p wX wY -> Named p wX wY
mkDummy :: RebaseName p wX wY -> Named p wX wY
mkDummy (AddName pi :: PatchInfo
pi) = PatchInfo -> FL p wX wY -> Named p wX wY
forall (p :: * -> * -> *) wX wY.
PatchInfo -> FL p wX wY -> Named p wX wY
infopatch PatchInfo
pi (FL p Any Any -> FL p wX wY
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP FL p Any Any
forall (a :: * -> * -> *) wX. FL a wX wX
NilFL)
mkDummy (DelName _) = String -> Named p wX wY
forall a. HasCallStack => String -> a
error "internal error: can't make a dummy patch from a delete"
mkDummy (Rename _ _) = String -> Named p wX wY
forall a. HasCallStack => String -> a
error "internal error: can't make a dummy patch from a rename"

instance CommuteNoConflicts (RebaseChange p) where
    commuteNoConflicts :: (:>) (RebaseChange p) (RebaseChange p) wX wY
-> Maybe ((:>) (RebaseChange p) (RebaseChange p) wX wY)
commuteNoConflicts _ = Maybe ((:>) (RebaseChange p) (RebaseChange p) wX wY)
forall a. a
impossible

instance IsHunk (RebaseChange p) where
    -- RebaseChange is a compound patch, so it doesn't really make sense to
    -- ask whether it's a hunk. TODO: get rid of the need for this.
    isHunk :: RebaseChange p wX wY -> Maybe (FileHunk wX wY)
isHunk _ = Maybe (FileHunk wX wY)
forall a. Maybe a
Nothing

instance PatchListFormat (RebaseChange p)

instance ( PrimPatchBase p, Apply p, Invert p
         , PatchInspect p
         , ApplyState p ~ ApplyState (PrimOf p)
         )
        => Matchable (RebaseChange p)