module Darcs.Patch.PatchInfoAnd
( Hopefully
, PatchInfoAnd
, PatchInfoAndG
, WPatchInfo
, unWPatchInfo
, compareWPatchInfo
, piap
, n2pia
, patchInfoAndPatch
, fmapPIAP
, fmapFLPIAP
, conscientiously
, hopefully
, info
, winfo
, hopefullyM
, createHashed
, extractHash
, actually
, unavailable
, patchDesc
) where
import Darcs.Prelude
import Control.Exception ( Exception, throw )
import System.IO.Unsafe ( unsafeInterleaveIO )
import Data.Typeable ( Typeable )
import Darcs.Util.SignalHandler ( catchNonSignal )
import Darcs.Util.Printer ( Doc, ($$), renderString, text, vcat )
import Darcs.Patch.Ident ( Ident(..), PatchId, IdEq2(..) )
import Darcs.Patch.Info ( PatchInfo, showPatchInfo, displayPatchInfo, justName )
import Darcs.Patch.Conflict ( Conflict(..) )
import Darcs.Patch.Debug ( PatchDebug(..) )
import Darcs.Patch.Effect ( Effect(..) )
import Darcs.Patch.FileHunk ( IsHunk(..) )
import Darcs.Patch.Format ( PatchListFormat )
import Darcs.Patch.Merge ( CleanMerge(..), Merge(..) )
import Darcs.Patch.Named ( Named, fmapFL_Named )
import Darcs.Patch.Apply ( Apply(..) )
import Darcs.Patch.Commute ( Commute(..) )
import Darcs.Patch.Inspect ( PatchInspect(..) )
import Darcs.Patch.FromPrim ( PrimPatchBase(..) )
import Darcs.Patch.Read ( ReadPatch(..) )
import Darcs.Patch.Show ( ShowPatch(..) )
import Darcs.Patch.Repair ( Repair(..), RepairToFL )
import Darcs.Patch.RepoType ( RepoType(..) )
import Darcs.Patch.Show ( ShowPatchBasic(..), ShowContextPatch(..) )
import Darcs.Patch.Summary ( Summary )
import Darcs.Patch.Witnesses.Eq ( Eq2(..), EqCheck(..) )
import Darcs.Patch.Witnesses.Unsafe ( unsafeCoerceP )
import Darcs.Patch.Witnesses.Ordered
( (:/\:)(..)
, (:>)(..)
, (:\/:)(..)
, FL
, mapFL
, mapRL_RL
)
import Darcs.Patch.Witnesses.Sealed ( Sealed(Sealed), seal, mapSeal )
import Darcs.Patch.Witnesses.Show ( Show1, Show2 )
import Darcs.Util.Exception ( prettyException )
data Hopefully a wX wY
= Hopefully (SimpleHopefully a wX wY)
| Hashed String (SimpleHopefully a wX wY)
deriving Int -> Hopefully a wX wY -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
Int -> Hopefully a wX wY -> ShowS
forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
[Hopefully a wX wY] -> ShowS
forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
Hopefully a wX wY -> String
showList :: [Hopefully a wX wY] -> ShowS
$cshowList :: forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
[Hopefully a wX wY] -> ShowS
show :: Hopefully a wX wY -> String
$cshow :: forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
Hopefully a wX wY -> String
showsPrec :: Int -> Hopefully a wX wY -> ShowS
$cshowsPrec :: forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
Int -> Hopefully a wX wY -> ShowS
Show
data SimpleHopefully a wX wY = Actually (a wX wY) | Unavailable String
deriving Int -> SimpleHopefully a wX wY -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
Int -> SimpleHopefully a wX wY -> ShowS
forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
[SimpleHopefully a wX wY] -> ShowS
forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
SimpleHopefully a wX wY -> String
showList :: [SimpleHopefully a wX wY] -> ShowS
$cshowList :: forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
[SimpleHopefully a wX wY] -> ShowS
show :: SimpleHopefully a wX wY -> String
$cshow :: forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
SimpleHopefully a wX wY -> String
showsPrec :: Int -> SimpleHopefully a wX wY -> ShowS
$cshowsPrec :: forall (a :: * -> * -> *) wX wY.
Show (a wX wY) =>
Int -> SimpleHopefully a wX wY -> ShowS
Show
type PatchInfoAnd rt p = PatchInfoAndG rt (Named p)
data PatchInfoAndG (rt :: RepoType) p wA wB =
PIAP !PatchInfo
(Hopefully p wA wB)
deriving (Int -> PatchInfoAndG rt p wA wB -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show (p wA wB) =>
Int -> PatchInfoAndG rt p wA wB -> ShowS
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show (p wA wB) =>
[PatchInfoAndG rt p wA wB] -> ShowS
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show (p wA wB) =>
PatchInfoAndG rt p wA wB -> String
showList :: [PatchInfoAndG rt p wA wB] -> ShowS
$cshowList :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show (p wA wB) =>
[PatchInfoAndG rt p wA wB] -> ShowS
show :: PatchInfoAndG rt p wA wB -> String
$cshow :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show (p wA wB) =>
PatchInfoAndG rt p wA wB -> String
showsPrec :: Int -> PatchInfoAndG rt p wA wB -> ShowS
$cshowsPrec :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show (p wA wB) =>
Int -> PatchInfoAndG rt p wA wB -> ShowS
Show)
newtype WPatchInfo wA wB = WPatchInfo { forall wA wB. WPatchInfo wA wB -> PatchInfo
unWPatchInfo :: PatchInfo }
compareWPatchInfo :: WPatchInfo wA wB -> WPatchInfo wC wD -> EqCheck (wA, wB) (wC, wD)
compareWPatchInfo :: forall wA wB wC wD.
WPatchInfo wA wB -> WPatchInfo wC wD -> EqCheck (wA, wB) (wC, wD)
compareWPatchInfo (WPatchInfo PatchInfo
x) (WPatchInfo PatchInfo
y) = if PatchInfo
x forall a. Eq a => a -> a -> Bool
== PatchInfo
y then forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP forall wA. EqCheck wA wA
IsEq else forall wA wB. EqCheck wA wB
NotEq
instance Eq2 WPatchInfo where
WPatchInfo PatchInfo
x unsafeCompare :: forall wA wB wC wD. WPatchInfo wA wB -> WPatchInfo wC wD -> Bool
`unsafeCompare` WPatchInfo PatchInfo
y = PatchInfo
x forall a. Eq a => a -> a -> Bool
== PatchInfo
y
fmapH :: (a wX wY -> b wW wZ) -> Hopefully a wX wY -> Hopefully b wW wZ
fmapH :: forall (a :: * -> * -> *) wX wY (b :: * -> * -> *) wW wZ.
(a wX wY -> b wW wZ) -> Hopefully a wX wY -> Hopefully b wW wZ
fmapH a wX wY -> b wW wZ
f (Hopefully SimpleHopefully a wX wY
sh) = forall (a :: * -> * -> *) wX wY.
SimpleHopefully a wX wY -> Hopefully a wX wY
Hopefully (SimpleHopefully a wX wY -> SimpleHopefully b wW wZ
ff SimpleHopefully a wX wY
sh)
where ff :: SimpleHopefully a wX wY -> SimpleHopefully b wW wZ
ff (Actually a wX wY
a) = forall (a :: * -> * -> *) wX wY. a wX wY -> SimpleHopefully a wX wY
Actually (a wX wY -> b wW wZ
f a wX wY
a)
ff (Unavailable String
e) = forall (a :: * -> * -> *) wX wY. String -> SimpleHopefully a wX wY
Unavailable String
e
fmapH a wX wY -> b wW wZ
f (Hashed String
h SimpleHopefully a wX wY
sh) = forall (a :: * -> * -> *) wX wY.
String -> SimpleHopefully a wX wY -> Hopefully a wX wY
Hashed String
h (SimpleHopefully a wX wY -> SimpleHopefully b wW wZ
ff SimpleHopefully a wX wY
sh)
where ff :: SimpleHopefully a wX wY -> SimpleHopefully b wW wZ
ff (Actually a wX wY
a) = forall (a :: * -> * -> *) wX wY. a wX wY -> SimpleHopefully a wX wY
Actually (a wX wY -> b wW wZ
f a wX wY
a)
ff (Unavailable String
e) = forall (a :: * -> * -> *) wX wY. String -> SimpleHopefully a wX wY
Unavailable String
e
info :: PatchInfoAndG rt p wA wB -> PatchInfo
info :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> PatchInfo
info (PIAP PatchInfo
i Hopefully p wA wB
_) = PatchInfo
i
patchDesc :: forall rt p wX wY . PatchInfoAnd rt p wX wY -> String
patchDesc :: forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
PatchInfoAnd rt p wX wY -> String
patchDesc PatchInfoAnd rt p wX wY
p = PatchInfo -> String
justName forall a b. (a -> b) -> a -> b
$ forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> PatchInfo
info PatchInfoAnd rt p wX wY
p
winfo :: PatchInfoAnd rt p wA wB -> WPatchInfo wA wB
winfo :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WPatchInfo wA wB
winfo (PIAP PatchInfo
i Hopefully (Named p) wA wB
_) = forall wA wB. PatchInfo -> WPatchInfo wA wB
WPatchInfo PatchInfo
i
piap :: PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
piap :: forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
piap PatchInfo
i p wA wB
p = forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> Hopefully p wA wB -> PatchInfoAndG rt p wA wB
PIAP PatchInfo
i (forall (a :: * -> * -> *) wX wY.
SimpleHopefully a wX wY -> Hopefully a wX wY
Hopefully forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) wX wY. a wX wY -> SimpleHopefully a wX wY
Actually p wA wB
p)
n2pia :: (Ident p, PatchId p ~ PatchInfo) => p wX wY -> PatchInfoAndG rt p wX wY
n2pia :: forall (p :: * -> * -> *) wX wY (rt :: RepoType).
(Ident p, PatchId p ~ PatchInfo) =>
p wX wY -> PatchInfoAndG rt p wX wY
n2pia p wX wY
x = forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident p wX wY
x forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
`piap` p wX wY
x
patchInfoAndPatch :: PatchInfo -> Hopefully p wA wB -> PatchInfoAndG rt p wA wB
patchInfoAndPatch :: forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> Hopefully p wA wB -> PatchInfoAndG rt p wA wB
patchInfoAndPatch = forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> Hopefully p wA wB -> PatchInfoAndG rt p wA wB
PIAP
fmapFLPIAP :: (FL p wX wY -> FL q wX wY)
-> PatchInfoAnd rt p wX wY -> PatchInfoAnd rt q wX wY
fmapFLPIAP :: forall (p :: * -> * -> *) wX wY (q :: * -> * -> *)
(rt :: RepoType).
(FL p wX wY -> FL q wX wY)
-> PatchInfoAnd rt p wX wY -> PatchInfoAnd rt q wX wY
fmapFLPIAP FL p wX wY -> FL q wX wY
f (PIAP PatchInfo
i Hopefully (Named p) wX wY
hp) = forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> Hopefully p wA wB -> PatchInfoAndG rt p wA wB
PIAP PatchInfo
i (forall (a :: * -> * -> *) wX wY (b :: * -> * -> *) wW wZ.
(a wX wY -> b wW wZ) -> Hopefully a wX wY -> Hopefully b wW wZ
fmapH (forall (p :: * -> * -> *) wA wB (q :: * -> * -> *) wC wD.
(FL p wA wB -> FL q wC wD) -> Named p wA wB -> Named q wC wD
fmapFL_Named FL p wX wY -> FL q wX wY
f) Hopefully (Named p) wX wY
hp)
fmapPIAP :: (p wX wY -> q wX wY)
-> PatchInfoAndG rt p wX wY -> PatchInfoAndG rt q wX wY
fmapPIAP :: forall (p :: * -> * -> *) wX wY (q :: * -> * -> *)
(rt :: RepoType).
(p wX wY -> q wX wY)
-> PatchInfoAndG rt p wX wY -> PatchInfoAndG rt q wX wY
fmapPIAP p wX wY -> q wX wY
f (PIAP PatchInfo
i Hopefully p wX wY
hp) = forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> Hopefully p wA wB -> PatchInfoAndG rt p wA wB
PIAP PatchInfo
i (forall (a :: * -> * -> *) wX wY (b :: * -> * -> *) wW wZ.
(a wX wY -> b wW wZ) -> Hopefully a wX wY -> Hopefully b wW wZ
fmapH p wX wY -> q wX wY
f Hopefully p wX wY
hp)
hopefully :: PatchInfoAndG rt p wA wB -> p wA wB
hopefully :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully = forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
(Doc -> Doc) -> PatchInfoAndG rt p wA wB -> p wA wB
conscientiously forall a b. (a -> b) -> a -> b
$ \Doc
e -> String -> Doc
text String
"failed to read patch:" Doc -> Doc -> Doc
$$ Doc
e
data PatchNotAvailable = PatchNotAvailable Doc
deriving Typeable
instance Exception PatchNotAvailable
instance Show PatchNotAvailable where
show :: PatchNotAvailable -> String
show (PatchNotAvailable Doc
e) = Doc -> String
renderString Doc
e
conscientiously :: (Doc -> Doc)
-> PatchInfoAndG rt p wA wB -> p wA wB
conscientiously :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
(Doc -> Doc) -> PatchInfoAndG rt p wA wB -> p wA wB
conscientiously Doc -> Doc
er ~(PIAP PatchInfo
pinf Hopefully p wA wB
hp) =
case forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully p wA wB
hp of
Right p wA wB
p -> p wA wB
p
Left String
e -> forall a e. Exception e => e -> a
throw forall a b. (a -> b) -> a -> b
$ Doc -> PatchNotAvailable
PatchNotAvailable forall a b. (a -> b) -> a -> b
$ Doc -> Doc
er (PatchInfo -> Doc
displayPatchInfo PatchInfo
pinf Doc -> Doc -> Doc
$$ String -> Doc
text String
e)
hopefullyM :: PatchInfoAndG rt p wA wB -> Maybe (p wA wB)
hopefullyM :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> Maybe (p wA wB)
hopefullyM (PIAP PatchInfo
_ Hopefully p wA wB
hp) = case forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully p wA wB
hp of
Right p wA wB
p -> forall (m :: * -> *) a. Monad m => a -> m a
return p wA wB
p
Left String
_ -> forall a. Maybe a
Nothing
hopefully2either :: Hopefully a wX wY -> Either String (a wX wY)
hopefully2either :: forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either (Hopefully (Actually a wX wY
p)) = forall a b. b -> Either a b
Right a wX wY
p
hopefully2either (Hashed String
_ (Actually a wX wY
p)) = forall a b. b -> Either a b
Right a wX wY
p
hopefully2either (Hopefully (Unavailable String
e)) = forall a b. a -> Either a b
Left String
e
hopefully2either (Hashed String
_ (Unavailable String
e)) = forall a b. a -> Either a b
Left String
e
actually :: a wX wY -> Hopefully a wX wY
actually :: forall (a :: * -> * -> *) wX wY. a wX wY -> Hopefully a wX wY
actually = forall (a :: * -> * -> *) wX wY.
SimpleHopefully a wX wY -> Hopefully a wX wY
Hopefully forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wY. a wX wY -> SimpleHopefully a wX wY
Actually
createHashed :: String -> (String -> IO (Sealed (a wX))) -> IO (Sealed (Hopefully a wX))
createHashed :: forall (a :: * -> * -> *) wX.
String
-> (String -> IO (Sealed (a wX))) -> IO (Sealed (Hopefully a wX))
createHashed String
h String -> IO (Sealed (a wX))
f = forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (forall (a :: * -> * -> *) wX wY.
String -> SimpleHopefully a wX wY -> Hopefully a wX wY
Hashed String
h) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` forall a. IO a -> IO a
unsafeInterleaveIO (IO (Sealed (SimpleHopefully a wX))
f' forall a. IO a -> (SomeException -> IO a) -> IO a
`catchNonSignal` forall {m :: * -> *} {a :: * -> * -> *} {wX}.
Monad m =>
SomeException -> m (Sealed (SimpleHopefully a wX))
handler)
where
f' :: IO (Sealed (SimpleHopefully a wX))
f' = do Sealed a wX wX
x <- String -> IO (Sealed (a wX))
f String
h
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (forall (a :: * -> * -> *) wX wY. a wX wY -> SimpleHopefully a wX wY
Actually a wX wX
x))
handler :: SomeException -> m (Sealed (SimpleHopefully a wX))
handler SomeException
e = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (a :: * -> *) wX. a wX -> Sealed a
seal forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) wX wY. String -> SimpleHopefully a wX wY
Unavailable forall a b. (a -> b) -> a -> b
$ SomeException -> String
prettyException SomeException
e
extractHash :: PatchInfoAndG rt p wA wB -> Either (p wA wB) String
(PIAP PatchInfo
_ (Hashed String
s SimpleHopefully p wA wB
_)) = forall a b. b -> Either a b
Right String
s
extractHash PatchInfoAndG rt p wA wB
hp = forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
(Doc -> Doc) -> PatchInfoAndG rt p wA wB -> p wA wB
conscientiously (\Doc
e -> String -> Doc
text String
"unable to read patch:" Doc -> Doc -> Doc
$$ Doc
e) PatchInfoAndG rt p wA wB
hp
unavailable :: String -> Hopefully a wX wY
unavailable :: forall (a :: * -> * -> *) wX wY. String -> Hopefully a wX wY
unavailable = forall (a :: * -> * -> *) wX wY.
SimpleHopefully a wX wY -> Hopefully a wX wY
Hopefully forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wY. String -> SimpleHopefully a wX wY
Unavailable
instance Show2 p => Show1 (PatchInfoAnd rt p wX)
instance Show2 p => Show2 (PatchInfoAnd rt p)
instance RepairToFL p => Repair (PatchInfoAnd rt p) where
applyAndTryToFix :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (PatchInfoAnd rt p)) m =>
PatchInfoAnd rt p wX wY
-> m (Maybe (String, PatchInfoAnd rt p wX wY))
applyAndTryToFix PatchInfoAnd rt p wX wY
p = do Maybe (String, Named p wX wY)
mp' <- forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Repair p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m (Maybe (String, p wX wY))
applyAndTryToFix forall a b. (a -> b) -> a -> b
$ forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully PatchInfoAnd rt p wX wY
p
case Maybe (String, Named p wX wY)
mp' of
Maybe (String, Named p wX wY)
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Just (String
e,Named p wX wY
p') -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just (String
e, forall (p :: * -> * -> *) wX wY (rt :: RepoType).
(Ident p, PatchId p ~ PatchInfo) =>
p wX wY -> PatchInfoAndG rt p wX wY
n2pia Named p wX wY
p')
instance PrimPatchBase p => PrimPatchBase (PatchInfoAndG rt p) where
type PrimOf (PatchInfoAndG rt p) = PrimOf p
instance Eq2 (PatchInfoAndG rt p) where
unsafeCompare :: forall wA wB wC wD.
PatchInfoAndG rt p wA wB -> PatchInfoAndG rt p wC wD -> Bool
unsafeCompare (PIAP PatchInfo
i Hopefully p wA wB
_) (PIAP PatchInfo
i2 Hopefully p wC wD
_) = PatchInfo
i forall a. Eq a => a -> a -> Bool
== PatchInfo
i2
type instance PatchId (PatchInfoAndG rt p) = PatchInfo
instance Ident (PatchInfoAndG rt p) where
ident :: forall wX wY.
PatchInfoAndG rt p wX wY -> PatchId (PatchInfoAndG rt p)
ident (PIAP PatchInfo
i Hopefully p wX wY
_) = PatchInfo
i
instance IdEq2 (PatchInfoAndG rt p)
instance PatchListFormat (PatchInfoAndG rt p)
instance ShowPatchBasic p => ShowPatchBasic (PatchInfoAndG rt p) where
showPatch :: forall wX wY. ShowPatchFor -> PatchInfoAndG rt p wX wY -> Doc
showPatch ShowPatchFor
f (PIAP PatchInfo
n Hopefully p wX wY
p) =
case forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully p wX wY
p of
Right p wX wY
x -> forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f p wX wY
x
Left String
_ -> ShowPatchFor -> PatchInfo -> Doc
showPatchInfo ShowPatchFor
f PatchInfo
n
instance ShowContextPatch p => ShowContextPatch (PatchInfoAndG rt p) where
showContextPatch :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (PatchInfoAndG rt p)) m =>
ShowPatchFor -> PatchInfoAndG rt p wX wY -> m Doc
showContextPatch ShowPatchFor
f (PIAP PatchInfo
n Hopefully p wX wY
p) =
case forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully p wX wY
p of
Right p wX wY
x -> forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(ShowContextPatch p, ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> p wX wY -> m Doc
showContextPatch ShowPatchFor
f p wX wY
x
Left String
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ ShowPatchFor -> PatchInfo -> Doc
showPatchInfo ShowPatchFor
f PatchInfo
n
instance (Summary p, PatchListFormat p,
ShowPatch p) => ShowPatch (PatchInfoAndG rt p) where
description :: forall wX wY. PatchInfoAndG rt p wX wY -> Doc
description (PIAP PatchInfo
n Hopefully p wX wY
_) = PatchInfo -> Doc
displayPatchInfo PatchInfo
n
summary :: forall wX wY. PatchInfoAndG rt p wX wY -> Doc
summary (PIAP PatchInfo
_ Hopefully p wX wY
p) =
case forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully p wX wY
p of
Right p wX wY
x -> forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
summary p wX wY
x
Left String
_ -> String -> Doc
text forall a b. (a -> b) -> a -> b
$ String
"[patch summary is unavailable]"
summaryFL :: forall wX wY. FL (PatchInfoAndG rt p) wX wY -> Doc
summaryFL = [Doc] -> Doc
vcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
summary
content :: forall wX wY. PatchInfoAndG rt p wX wY -> Doc
content (PIAP PatchInfo
_ Hopefully p wX wY
p) =
case forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully p wX wY
p of
Right p wX wY
x -> forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
content p wX wY
x
Left String
_ -> String -> Doc
text forall a b. (a -> b) -> a -> b
$ String
"[patch content is unavailable]"
instance (PatchId p ~ PatchInfo, Commute p) => Commute (PatchInfoAndG rt p) where
commute :: forall wX wY.
(:>) (PatchInfoAndG rt p) (PatchInfoAndG rt p) wX wY
-> Maybe ((:>) (PatchInfoAndG rt p) (PatchInfoAndG rt p) wX wY)
commute (PatchInfoAndG rt p wX wZ
x :> PatchInfoAndG rt p wZ wY
y) = do p wX wZ
y' :> p wZ wY
x' <- forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully PatchInfoAndG rt p wX wZ
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully PatchInfoAndG rt p wZ wY
y)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ (forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wY
y forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
`piap` p wX wZ
y') forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wX wZ
x forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
`piap` p wZ wY
x')
instance (PatchId p ~ PatchInfo, CleanMerge p) =>
CleanMerge (PatchInfoAndG rt p) where
cleanMerge :: forall wX wY.
(:\/:) (PatchInfoAndG rt p) (PatchInfoAndG rt p) wX wY
-> Maybe ((:/\:) (PatchInfoAndG rt p) (PatchInfoAndG rt p) wX wY)
cleanMerge (PatchInfoAndG rt p wZ wX
x :\/: PatchInfoAndG rt p wZ wY
y)
| forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wX
x forall a. Eq a => a -> a -> Bool
== forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wY
y = forall a. HasCallStack => String -> a
error String
"cannot cleanMerge identical PatchInfoAndG"
| Bool
otherwise = do
p wX wZ
y' :/\: p wY wZ
x' <- forall (p :: * -> * -> *) wX wY.
CleanMerge p =>
(:\/:) p p wX wY -> Maybe ((:/\:) p p wX wY)
cleanMerge (forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully PatchInfoAndG rt p wZ wX
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully PatchInfoAndG rt p wZ wY
y)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ (forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wY
y forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
`piap` p wX wZ
y') forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: (forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wX
x forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
`piap` p wY wZ
x')
instance (PatchId p ~ PatchInfo, Merge p) => Merge (PatchInfoAndG rt p) where
merge :: forall wX wY.
(:\/:) (PatchInfoAndG rt p) (PatchInfoAndG rt p) wX wY
-> (:/\:) (PatchInfoAndG rt p) (PatchInfoAndG rt p) wX wY
merge (PatchInfoAndG rt p wZ wX
x :\/: PatchInfoAndG rt p wZ wY
y)
| forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wX
x forall a. Eq a => a -> a -> Bool
== forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wY
y = forall a. HasCallStack => String -> a
error String
"cannot merge identical PatchInfoAndG"
| Bool
otherwise =
case forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
merge (forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully PatchInfoAndG rt p wZ wX
x forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully PatchInfoAndG rt p wZ wY
y) of
p wX wZ
y' :/\: p wY wZ
x' -> (forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wY
y forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
`piap` p wX wZ
y') forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: (forall (p :: * -> * -> *) wX wY. Ident p => p wX wY -> PatchId p
ident PatchInfoAndG rt p wZ wX
x forall (p :: * -> * -> *) wA wB (rt :: RepoType).
PatchInfo -> p wA wB -> PatchInfoAndG rt p wA wB
`piap` p wY wZ
x')
instance PatchInspect p => PatchInspect (PatchInfoAndG rt p) where
listTouchedFiles :: forall wX wY. PatchInfoAndG rt p wX wY -> [AnchoredPath]
listTouchedFiles = forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [AnchoredPath]
listTouchedFiles forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully
hunkMatches :: forall wX wY.
(ByteString -> Bool) -> PatchInfoAndG rt p wX wY -> Bool
hunkMatches ByteString -> Bool
f = forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully
instance Apply p => Apply (PatchInfoAndG rt p) where
type ApplyState (PatchInfoAndG rt p) = ApplyState p
apply :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (PatchInfoAndG rt p)) m =>
PatchInfoAndG rt p wX wY -> m ()
apply = forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully
unapply :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (PatchInfoAndG rt p)) m =>
PatchInfoAndG rt p wX wY -> m ()
unapply = forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
unapply forall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully
instance ( ReadPatch p, Ident p, PatchId p ~ PatchInfo
) => ReadPatch (PatchInfoAndG rt p) where
readPatch' :: forall wX. Parser (Sealed (PatchInfoAndG rt p wX))
readPatch' = forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal forall (p :: * -> * -> *) wX wY (rt :: RepoType).
(Ident p, PatchId p ~ PatchInfo) =>
p wX wY -> PatchInfoAndG rt p wX wY
n2pia forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> * -> *) wX. ReadPatch p => Parser (Sealed (p wX))
readPatch'
instance Effect p => Effect (PatchInfoAndG rt p) where
effect :: forall wX wY.
PatchInfoAndG rt p wX wY -> FL (PrimOf (PatchInfoAndG rt p)) wX wY
effect = forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully
instance IsHunk (PatchInfoAndG rt p) where
isHunk :: forall wX wY. PatchInfoAndG rt p wX wY -> Maybe (FileHunk wX wY)
isHunk PatchInfoAndG rt p wX wY
_ = forall a. Maybe a
Nothing
instance PatchDebug p => PatchDebug (PatchInfoAndG rt p)
instance (Commute p, Conflict p) => Conflict (PatchInfoAnd rt p) where
resolveConflicts :: forall wO wX wY.
RL (PatchInfoAnd rt p) wO wX
-> RL (PatchInfoAnd rt p) wX wY
-> [ConflictDetails (PrimOf (PatchInfoAnd rt p)) wY]
resolveConflicts RL (PatchInfoAnd rt p) wO wX
context RL (PatchInfoAnd rt p) wX wY
patches =
forall (p :: * -> * -> *) wO wX wY.
Conflict p =>
RL p wO wX -> RL p wX wY -> [ConflictDetails (PrimOf p) wY]
resolveConflicts (forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> RL a wX wZ -> RL b wX wZ
mapRL_RL forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully RL (PatchInfoAnd rt p) wO wX
context) (forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> RL a wX wZ -> RL b wX wZ
mapRL_RL forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAndG rt p wA wB -> p wA wB
hopefully RL (PatchInfoAnd rt p) wX wY
patches)