-- Copyright (C) 2006 David Roundy
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; see the file COPYING.  If not, write to
-- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-- Boston, MA 02110-1301, USA.

{-# LANGUAGE CPP #-}
module Darcs.Patch.PatchInfoAnd ( Hopefully(..), SimpleHopefully(..), PatchInfoAnd(..),
                         WPatchInfo, unWPatchInfo, compareWPatchInfo,
                         piap, n2pia, patchInfoAndPatch,
                         fmapFLPIAP, generaliseRepoTypePIAP,
                         conscientiously, hopefully, info, winfo,
                         hopefullyM, createHashed, extractHash,
                         actually, unavailable, patchDesc ) where

import Prelude ()
import Darcs.Prelude

import System.IO.Unsafe ( unsafeInterleaveIO )

import Darcs.Util.SignalHandler ( catchNonSignal )
import Darcs.Util.Printer
    ( Doc, renderString, errorDoc, text, ($$), vcat
     )
import Darcs.Patch.Info ( PatchInfo, showPatchInfo, displayPatchInfo, justName )
import Darcs.Patch.Conflict ( Conflict, CommuteNoConflicts )
import Darcs.Patch.Debug ( PatchDebug(..) )
import Darcs.Patch.Effect ( Effect(..) )
import Darcs.Patch.FileHunk ( IsHunk(..) )
import Darcs.Patch.Format ( PatchListFormat )
import Darcs.Patch.Merge ( Merge(..) )
import Darcs.Patch.Named.Wrapped
    ( WrappedNamed, patch2patchinfo, fmapFL_WrappedNamed, (:~:), (:~~:)
    , generaliseRepoTypeWrapped
    )
import Darcs.Patch.Prim ( PrimPatchBase(..), FromPrim )
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.Repair ( Repair(..), RepairToFL )
import Darcs.Patch.RepoType ( RepoType(..), IsRepoType, RebaseTypeOf, RebaseType(..) )
import Darcs.Patch.Show ( ShowPatchBasic(..), ShowContextPatch(..) )
import Darcs.Patch.Witnesses.Eq ( Eq2(..), EqCheck(..) )
import Darcs.Patch.Witnesses.Unsafe ( unsafeCoerceP )
import Darcs.Patch.Witnesses.Ordered ( (:>)(..), (:\/:)(..), (:/\:)(..), FL, mapFL )
import Darcs.Patch.Witnesses.Sealed ( Sealed(Sealed), seal, mapSeal )
import Darcs.Patch.Witnesses.Show ( Show1(..), Show2(..), ShowDict(ShowDictClass) )
import Darcs.Util.Exception ( prettyException )
import Darcs.Util.Tree( Tree )

-- | @'Hopefully' p C@ @(x y)@ is @'Either' String (p C@ @(x y))@ in a
-- form adapted to darcs patches. The @C@ @(x y)@ represents the type
-- witness for the patch that should be there. The @Hopefully@ type
-- just tells whether we expect the patch to be hashed or not, and
-- 'SimpleHopefully' does the real work of emulating
-- 'Either'. @Hopefully sh@ represents an expected unhashed patch, and
-- @Hashed hash sh@ represents an expected hashed patch with its hash.
data Hopefully a wX wY
    = Hopefully (SimpleHopefully a wX wY)
    | Hashed String (SimpleHopefully a wX wY)
    deriving Int -> Hopefully a wX wY -> ShowS
[Hopefully a wX wY] -> ShowS
Hopefully a wX wY -> String
(Int -> Hopefully a wX wY -> ShowS)
-> (Hopefully a wX wY -> String)
-> ([Hopefully a wX wY] -> ShowS)
-> Show (Hopefully a wX wY)
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

-- | @SimpleHopefully@ is a variant of @Either String@ adapted for
-- type witnesses. @Actually@ is the equivalent of @Right@, while
-- @Unavailable@ is @Left@.
data SimpleHopefully a wX wY = Actually (a wX wY) | Unavailable String
    deriving Int -> SimpleHopefully a wX wY -> ShowS
[SimpleHopefully a wX wY] -> ShowS
SimpleHopefully a wX wY -> String
(Int -> SimpleHopefully a wX wY -> ShowS)
-> (SimpleHopefully a wX wY -> String)
-> ([SimpleHopefully a wX wY] -> ShowS)
-> Show (SimpleHopefully a wX wY)
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

-- | @'PatchInfoAnd' p wA wB@ represents a hope we have to get a
-- patch through its info. We're not sure we have the patch, but we
-- know its info.
data PatchInfoAnd rt p wA wB = PIAP !PatchInfo (Hopefully (WrappedNamed rt p) wA wB)
    deriving Int -> PatchInfoAnd rt p wA wB -> ShowS
[PatchInfoAnd rt p wA wB] -> ShowS
PatchInfoAnd rt p wA wB -> String
(Int -> PatchInfoAnd rt p wA wB -> ShowS)
-> (PatchInfoAnd rt p wA wB -> String)
-> ([PatchInfoAnd rt p wA wB] -> ShowS)
-> Show (PatchInfoAnd rt p wA wB)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show2 p =>
Int -> PatchInfoAnd rt p wA wB -> ShowS
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show2 p =>
[PatchInfoAnd rt p wA wB] -> ShowS
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show2 p =>
PatchInfoAnd rt p wA wB -> String
showList :: [PatchInfoAnd rt p wA wB] -> ShowS
$cshowList :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show2 p =>
[PatchInfoAnd rt p wA wB] -> ShowS
show :: PatchInfoAnd rt p wA wB -> String
$cshow :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show2 p =>
PatchInfoAnd rt p wA wB -> String
showsPrec :: Int -> PatchInfoAnd rt p wA wB -> ShowS
$cshowsPrec :: forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
Show2 p =>
Int -> PatchInfoAnd rt p wA wB -> ShowS
Show

instance Show2 p => Show1 (PatchInfoAnd rt p wX) where
    showDict1 :: ShowDict (PatchInfoAnd rt p wX wX)
showDict1 = ShowDict (PatchInfoAnd rt p wX wX)
forall a. Show a => ShowDict a
ShowDictClass

instance Show2 p => Show2 (PatchInfoAnd rt p) where
    showDict2 :: ShowDict (PatchInfoAnd rt p wX wY)
showDict2 = ShowDict (PatchInfoAnd rt p wX wY)
forall a. Show a => ShowDict a
ShowDictClass

instance PrimPatchBase p => PrimPatchBase (PatchInfoAnd rt p) where
   type PrimOf (PatchInfoAnd rt p) = PrimOf p

-- | @'WPatchInfo' wA wB@ represents the info of a patch, marked with
-- the patch's witnesses.
newtype WPatchInfo wA wB = WPatchInfo { WPatchInfo wA wB -> PatchInfo
unWPatchInfo :: PatchInfo }

-- This is actually unsafe if we ever commute patches and then compare them
-- using this function. TODO: consider adding an extra existential to WPatchInfo
-- (as with LabelledPatch in Darcs.Patch.Choices)
compareWPatchInfo :: WPatchInfo wA wB -> WPatchInfo wC wD -> EqCheck (wA, wB) (wC, wD)
compareWPatchInfo :: WPatchInfo wA wB -> WPatchInfo wC wD -> EqCheck (wA, wB) (wC, wD)
compareWPatchInfo (WPatchInfo x :: PatchInfo
x) (WPatchInfo y :: PatchInfo
y) = if PatchInfo
x PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
y then EqCheck Any Any -> EqCheck (wA, wB) (wC, wD)
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP EqCheck Any Any
forall wA. EqCheck wA wA
IsEq else EqCheck (wA, wB) (wC, wD)
forall wA wB. EqCheck wA wB
NotEq

instance Eq2 WPatchInfo where
   WPatchInfo x :: PatchInfo
x unsafeCompare :: WPatchInfo wA wB -> WPatchInfo wC wD -> Bool
`unsafeCompare` WPatchInfo y :: PatchInfo
y = PatchInfo
x PatchInfo -> PatchInfo -> Bool
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 :: (a wX wY -> b wW wZ) -> Hopefully a wX wY -> Hopefully b wW wZ
fmapH f :: a wX wY -> b wW wZ
f (Hopefully sh :: SimpleHopefully a wX wY
sh) = SimpleHopefully b wW wZ -> Hopefully b wW wZ
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 :: a wX wY
a) = b wW wZ -> SimpleHopefully b wW wZ
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 e :: String
e) = String -> SimpleHopefully b wW wZ
forall (a :: * -> * -> *) wX wY. String -> SimpleHopefully a wX wY
Unavailable String
e
fmapH f :: a wX wY -> b wW wZ
f (Hashed h :: String
h sh :: SimpleHopefully a wX wY
sh) = String -> SimpleHopefully b wW wZ -> Hopefully b wW wZ
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 :: a wX wY
a) = b wW wZ -> SimpleHopefully b wW wZ
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 e :: String
e) = String -> SimpleHopefully b wW wZ
forall (a :: * -> * -> *) wX wY. String -> SimpleHopefully a wX wY
Unavailable String
e

info :: PatchInfoAnd rt p wA wB -> PatchInfo
info :: PatchInfoAnd rt p wA wB -> PatchInfo
info (PIAP i :: PatchInfo
i _) = PatchInfo
i

patchDesc :: forall rt p wX wY . PatchInfoAnd rt p wX wY -> String
patchDesc :: PatchInfoAnd rt p wX wY -> String
patchDesc p :: PatchInfoAnd rt p wX wY
p = PatchInfo -> String
justName (PatchInfo -> String) -> PatchInfo -> String
forall a b. (a -> b) -> a -> b
$ PatchInfoAnd rt p wX wY -> PatchInfo
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> PatchInfo
info PatchInfoAnd rt p wX wY
p

winfo :: PatchInfoAnd rt p wA wB -> WPatchInfo wA wB
winfo :: PatchInfoAnd rt p wA wB -> WPatchInfo wA wB
winfo (PIAP i :: PatchInfo
i _) = PatchInfo -> WPatchInfo wA wB
forall wA wB. PatchInfo -> WPatchInfo wA wB
WPatchInfo PatchInfo
i

-- | @'piap' i p@ creates a PatchInfoAnd containing p with info i.
piap :: PatchInfo -> WrappedNamed rt p wA wB -> PatchInfoAnd rt p wA wB
piap :: PatchInfo -> WrappedNamed rt p wA wB -> PatchInfoAnd rt p wA wB
piap i :: PatchInfo
i p :: WrappedNamed rt p wA wB
p = PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
PIAP PatchInfo
i (SimpleHopefully (WrappedNamed rt p) wA wB
-> Hopefully (WrappedNamed rt p) wA wB
forall (a :: * -> * -> *) wX wY.
SimpleHopefully a wX wY -> Hopefully a wX wY
Hopefully (SimpleHopefully (WrappedNamed rt p) wA wB
 -> Hopefully (WrappedNamed rt p) wA wB)
-> SimpleHopefully (WrappedNamed rt p) wA wB
-> Hopefully (WrappedNamed rt p) wA wB
forall a b. (a -> b) -> a -> b
$ WrappedNamed rt p wA wB
-> SimpleHopefully (WrappedNamed rt p) wA wB
forall (a :: * -> * -> *) wX wY. a wX wY -> SimpleHopefully a wX wY
Actually WrappedNamed rt p wA wB
p)

-- | @n2pia@ creates a PatchInfoAnd representing a @Named@ patch.
n2pia :: WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
n2pia :: WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
n2pia x :: WrappedNamed rt p wX wY
x = WrappedNamed rt p wX wY -> PatchInfo
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> PatchInfo
patch2patchinfo WrappedNamed rt p wX wY
x PatchInfo -> WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> WrappedNamed rt p wA wB -> PatchInfoAnd rt p wA wB
`piap` WrappedNamed rt p wX wY
x

patchInfoAndPatch :: PatchInfo -> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
patchInfoAndPatch :: PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
patchInfoAndPatch =  PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
PIAP

fmapFLPIAP
  :: (FL p wX wY -> FL q wX wY)
  -> (RebaseTypeOf rt :~~: 'IsRebase -> p :~: q)
  -> PatchInfoAnd rt p wX wY
  -> PatchInfoAnd rt q wX wY
fmapFLPIAP :: (FL p wX wY -> FL q wX wY)
-> ((RebaseTypeOf rt :~~: 'IsRebase) -> p :~: q)
-> PatchInfoAnd rt p wX wY
-> PatchInfoAnd rt q wX wY
fmapFLPIAP f :: FL p wX wY -> FL q wX wY
f whenRebase :: (RebaseTypeOf rt :~~: 'IsRebase) -> p :~: q
whenRebase (PIAP i :: PatchInfo
i hp :: Hopefully (WrappedNamed rt p) wX wY
hp)
  = PatchInfo
-> Hopefully (WrappedNamed rt q) wX wY -> PatchInfoAnd rt q wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
PIAP PatchInfo
i ((WrappedNamed rt p wX wY -> WrappedNamed rt q wX wY)
-> Hopefully (WrappedNamed rt p) wX wY
-> Hopefully (WrappedNamed rt q) wX wY
forall (a :: * -> * -> *) wX wY (b :: * -> * -> *) wW wZ.
(a wX wY -> b wW wZ) -> Hopefully a wX wY -> Hopefully b wW wZ
fmapH ((FL p wX wY -> FL q wX wY)
-> ((RebaseTypeOf rt :~~: 'IsRebase) -> p :~: q)
-> WrappedNamed rt p wX wY
-> WrappedNamed rt q wX wY
forall (p :: * -> * -> *) wA wB (q :: * -> * -> *)
       (rt :: RepoType).
(FL p wA wB -> FL q wA wB)
-> ((RebaseTypeOf rt :~~: 'IsRebase) -> p :~: q)
-> WrappedNamed rt p wA wB
-> WrappedNamed rt q wA wB
fmapFL_WrappedNamed FL p wX wY -> FL q wX wY
f (RebaseTypeOf rt :~~: 'IsRebase) -> p :~: q
whenRebase) Hopefully (WrappedNamed rt p) wX wY
hp)

generaliseRepoTypePIAP
    :: PatchInfoAnd ('RepoType 'NoRebase) p wA wB
    -> PatchInfoAnd rt p wA wB
generaliseRepoTypePIAP :: PatchInfoAnd ('RepoType 'NoRebase) p wA wB
-> PatchInfoAnd rt p wA wB
generaliseRepoTypePIAP (PIAP i :: PatchInfo
i hp :: Hopefully (WrappedNamed ('RepoType 'NoRebase) p) wA wB
hp) = PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
PIAP PatchInfo
i ((WrappedNamed ('RepoType 'NoRebase) p wA wB
 -> WrappedNamed rt p wA wB)
-> Hopefully (WrappedNamed ('RepoType 'NoRebase) p) wA wB
-> Hopefully (WrappedNamed rt p) wA wB
forall (a :: * -> * -> *) wX wY (b :: * -> * -> *) wW wZ.
(a wX wY -> b wW wZ) -> Hopefully a wX wY -> Hopefully b wW wZ
fmapH WrappedNamed ('RepoType 'NoRebase) p wA wB
-> WrappedNamed rt p wA wB
forall (p :: * -> * -> *) wA wB (rt :: RepoType).
WrappedNamed ('RepoType 'NoRebase) p wA wB
-> WrappedNamed rt p wA wB
generaliseRepoTypeWrapped Hopefully (WrappedNamed ('RepoType 'NoRebase) p) wA wB
hp)

-- | @'hopefully' hp@ tries to get a patch from a 'PatchInfoAnd'
-- value. If it fails, it outputs an error \"failed to read patch:
-- \<description of the patch>\". We get the description of the patch
-- from the info part of 'hp'
hopefully :: PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully :: PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully = (Doc -> Doc) -> PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
(Doc -> Doc) -> PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
conscientiously ((Doc -> Doc)
 -> PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB)
-> (Doc -> Doc)
-> PatchInfoAnd rt p wA wB
-> WrappedNamed rt p wA wB
forall a b. (a -> b) -> a -> b
$ \e :: Doc
e -> String -> Doc
text "failed to read patch:" Doc -> Doc -> Doc
$$ Doc
e

-- | @'conscientiously' er hp@ tries to extract a patch from a 'PatchInfoAnd'.
-- If it fails, it applies the error handling function @er@ to a description
-- of the patch info component of @hp@.
conscientiously :: (Doc -> Doc)
                -> PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
conscientiously :: (Doc -> Doc) -> PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
conscientiously er :: Doc -> Doc
er (PIAP pinf :: PatchInfo
pinf hp :: Hopefully (WrappedNamed rt p) wA wB
hp) =
    case Hopefully (WrappedNamed rt p) wA wB
-> Either String (WrappedNamed rt p wA wB)
forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully (WrappedNamed rt p) wA wB
hp of
      Right p :: WrappedNamed rt p wA wB
p -> WrappedNamed rt p wA wB
p
      Left e :: String
e -> Doc -> WrappedNamed rt p wA wB
forall a. Doc -> a
errorDoc (Doc -> WrappedNamed rt p wA wB) -> Doc -> WrappedNamed rt p wA wB
forall a b. (a -> b) -> a -> b
$ Doc -> Doc
er (PatchInfo -> Doc
displayPatchInfo PatchInfo
pinf Doc -> Doc -> Doc
$$ String -> Doc
text String
e)

-- | @hopefullyM@ is a version of @hopefully@ which calls @fail@ in a
-- monad instead of erroring.
hopefullyM ::
#if MIN_VERSION_base(4,13,0)
  MonadFail m
#else
  Monad m
#endif
  => PatchInfoAnd rt p wA wB -> m (WrappedNamed rt p wA wB)
hopefullyM :: PatchInfoAnd rt p wA wB -> m (WrappedNamed rt p wA wB)
hopefullyM (PIAP pinf :: PatchInfo
pinf hp :: Hopefully (WrappedNamed rt p) wA wB
hp) = case Hopefully (WrappedNamed rt p) wA wB
-> Either String (WrappedNamed rt p wA wB)
forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully (WrappedNamed rt p) wA wB
hp of
                              Right p :: WrappedNamed rt p wA wB
p -> WrappedNamed rt p wA wB -> m (WrappedNamed rt p wA wB)
forall (m :: * -> *) a. Monad m => a -> m a
return WrappedNamed rt p wA wB
p
                              Left e :: String
e -> String -> m (WrappedNamed rt p wA wB)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> m (WrappedNamed rt p wA wB))
-> String -> m (WrappedNamed rt p wA wB)
forall a b. (a -> b) -> a -> b
$ Doc -> String
renderString
                                                     (PatchInfo -> Doc
displayPatchInfo PatchInfo
pinf Doc -> Doc -> Doc
$$ String -> Doc
text String
e)

-- Any recommendations for a nice adverb to name the below?
hopefully2either :: Hopefully a wX wY -> Either String (a wX wY)
hopefully2either :: Hopefully a wX wY -> Either String (a wX wY)
hopefully2either (Hopefully (Actually p :: a wX wY
p)) = a wX wY -> Either String (a wX wY)
forall a b. b -> Either a b
Right a wX wY
p
hopefully2either (Hashed _ (Actually p :: a wX wY
p)) = a wX wY -> Either String (a wX wY)
forall a b. b -> Either a b
Right a wX wY
p
hopefully2either (Hopefully (Unavailable e :: String
e)) = String -> Either String (a wX wY)
forall a b. a -> Either a b
Left String
e
hopefully2either (Hashed _ (Unavailable e :: String
e)) = String -> Either String (a wX wY)
forall a b. a -> Either a b
Left String
e

actually :: a wX wY -> Hopefully a wX wY
actually :: a wX wY -> Hopefully a wX wY
actually = SimpleHopefully a wX wY -> Hopefully a wX wY
forall (a :: * -> * -> *) wX wY.
SimpleHopefully a wX wY -> Hopefully a wX wY
Hopefully (SimpleHopefully a wX wY -> Hopefully a wX wY)
-> (a wX wY -> SimpleHopefully a wX wY)
-> a wX wY
-> Hopefully a wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a wX wY -> SimpleHopefully a wX wY
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 :: String
-> (String -> IO (Sealed (a wX))) -> IO (Sealed (Hopefully a wX))
createHashed h :: String
h f :: String -> IO (Sealed (a wX))
f = (forall wX. SimpleHopefully a wX wX -> Hopefully a wX wX)
-> Sealed (SimpleHopefully a wX) -> Sealed (Hopefully a wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal (String -> SimpleHopefully a wX wX -> Hopefully a wX wX
forall (a :: * -> * -> *) wX wY.
String -> SimpleHopefully a wX wY -> Hopefully a wX wY
Hashed String
h) (Sealed (SimpleHopefully a wX) -> Sealed (Hopefully a wX))
-> IO (Sealed (SimpleHopefully a wX))
-> IO (Sealed (Hopefully a wX))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` IO (Sealed (SimpleHopefully a wX))
-> IO (Sealed (SimpleHopefully a wX))
forall a. IO a -> IO a
unsafeInterleaveIO (IO (Sealed (SimpleHopefully a wX))
f' IO (Sealed (SimpleHopefully a wX))
-> (SomeException -> IO (Sealed (SimpleHopefully a wX)))
-> IO (Sealed (SimpleHopefully a wX))
forall a. IO a -> (SomeException -> IO a) -> IO a
`catchNonSignal` SomeException -> IO (Sealed (SimpleHopefully a wX))
forall (m :: * -> *) (a :: * -> * -> *) wX.
Monad m =>
SomeException -> m (Sealed (SimpleHopefully a wX))
handler)
  where
  f' :: IO (Sealed (SimpleHopefully a wX))
f' = do Sealed x :: a wX wX
x <- String -> IO (Sealed (a wX))
f String
h
          Sealed (SimpleHopefully a wX) -> IO (Sealed (SimpleHopefully a wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (SimpleHopefully a wX wX -> Sealed (SimpleHopefully a wX)
forall (a :: * -> *) wX. a wX -> Sealed a
Sealed (a wX wX -> SimpleHopefully a wX wX
forall (a :: * -> * -> *) wX wY. a wX wY -> SimpleHopefully a wX wY
Actually a wX wX
x))
  handler :: SomeException -> m (Sealed (SimpleHopefully a wX))
handler e :: SomeException
e = Sealed (SimpleHopefully a wX) -> m (Sealed (SimpleHopefully a wX))
forall (m :: * -> *) a. Monad m => a -> m a
return (Sealed (SimpleHopefully a wX)
 -> m (Sealed (SimpleHopefully a wX)))
-> Sealed (SimpleHopefully a wX)
-> m (Sealed (SimpleHopefully a wX))
forall a b. (a -> b) -> a -> b
$ SimpleHopefully a wX Any -> Sealed (SimpleHopefully a wX)
forall (a :: * -> *) wX. a wX -> Sealed a
seal (SimpleHopefully a wX Any -> Sealed (SimpleHopefully a wX))
-> SimpleHopefully a wX Any -> Sealed (SimpleHopefully a wX)
forall a b. (a -> b) -> a -> b
$ String -> SimpleHopefully a wX Any
forall (a :: * -> * -> *) wX wY. String -> SimpleHopefully a wX wY
Unavailable (String -> SimpleHopefully a wX Any)
-> String -> SimpleHopefully a wX Any
forall a b. (a -> b) -> a -> b
$ SomeException -> String
prettyException SomeException
e

extractHash :: PatchInfoAnd rt p wA wB -> Either (WrappedNamed rt p wA wB) String
extractHash :: PatchInfoAnd rt p wA wB -> Either (WrappedNamed rt p wA wB) String
extractHash (PIAP _ (Hashed s :: String
s _)) = String -> Either (WrappedNamed rt p wA wB) String
forall a b. b -> Either a b
Right String
s
extractHash hp :: PatchInfoAnd rt p wA wB
hp = WrappedNamed rt p wA wB -> Either (WrappedNamed rt p wA wB) String
forall a b. a -> Either a b
Left (WrappedNamed rt p wA wB
 -> Either (WrappedNamed rt p wA wB) String)
-> WrappedNamed rt p wA wB
-> Either (WrappedNamed rt p wA wB) String
forall a b. (a -> b) -> a -> b
$ (Doc -> Doc) -> PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
(Doc -> Doc) -> PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
conscientiously (\e :: Doc
e -> String -> Doc
text "unable to read patch:" Doc -> Doc -> Doc
$$ Doc
e) PatchInfoAnd rt p wA wB
hp

unavailable :: String -> Hopefully a wX wY
unavailable :: String -> Hopefully a wX wY
unavailable = SimpleHopefully a wX wY -> Hopefully a wX wY
forall (a :: * -> * -> *) wX wY.
SimpleHopefully a wX wY -> Hopefully a wX wY
Hopefully (SimpleHopefully a wX wY -> Hopefully a wX wY)
-> (String -> SimpleHopefully a wX wY)
-> String
-> Hopefully a wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SimpleHopefully a wX wY
forall (a :: * -> * -> *) wX wY. String -> SimpleHopefully a wX wY
Unavailable

-- Equality on PatchInfoAnd is solely determined by the PatchInfo
-- It is a global invariant of darcs that once a patch is recorded,
-- it should always have the same representation in the same context.
instance Eq2 (PatchInfoAnd rt p) where
    unsafeCompare :: PatchInfoAnd rt p wA wB -> PatchInfoAnd rt p wC wD -> Bool
unsafeCompare (PIAP i :: PatchInfo
i _) (PIAP i2 :: PatchInfo
i2 _) = PatchInfo
i PatchInfo -> PatchInfo -> Bool
forall a. Eq a => a -> a -> Bool
== PatchInfo
i2

instance Invert p => Invert (PatchInfoAnd rt p) where
    invert :: PatchInfoAnd rt p wX wY -> PatchInfoAnd rt p wY wX
invert (PIAP i :: PatchInfo
i p :: Hopefully (WrappedNamed rt p) wX wY
p) = PatchInfo
-> Hopefully (WrappedNamed rt p) wY wX -> PatchInfoAnd rt p wY wX
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo
-> Hopefully (WrappedNamed rt p) wA wB -> PatchInfoAnd rt p wA wB
PIAP PatchInfo
i (WrappedNamed rt p wX wY -> WrappedNamed rt p wY wX
forall (p :: * -> * -> *) wX wY. Invert p => p wX wY -> p wY wX
invert (WrappedNamed rt p wX wY -> WrappedNamed rt p wY wX)
-> Hopefully (WrappedNamed rt p) wX wY
-> Hopefully (WrappedNamed rt p) wY wX
forall (a :: * -> * -> *) wX wY (b :: * -> * -> *) wW wZ.
(a wX wY -> b wW wZ) -> Hopefully a wX wY -> Hopefully b wW wZ
`fmapH` Hopefully (WrappedNamed rt p) wX wY
p)

instance PatchListFormat (PatchInfoAnd rt p)

instance (PatchListFormat p, ShowPatchBasic p) => ShowPatchBasic (PatchInfoAnd rt p) where
    showPatch :: ShowPatchFor -> PatchInfoAnd rt p wX wY -> Doc
showPatch f :: ShowPatchFor
f (PIAP n :: PatchInfo
n p :: Hopefully (WrappedNamed rt p) wX wY
p) =
      case Hopefully (WrappedNamed rt p) wX wY
-> Either String (WrappedNamed rt p wX wY)
forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully (WrappedNamed rt p) wX wY
p of
        Right x :: WrappedNamed rt p wX wY
x -> ShowPatchFor -> WrappedNamed rt p wX wY -> Doc
forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f WrappedNamed rt p wX wY
x
        Left _ -> ShowPatchFor -> PatchInfo -> Doc
showPatchInfo ShowPatchFor
f PatchInfo
n

instance (Apply p, IsHunk p, PatchListFormat p, PrimPatchBase p,
          ShowContextPatch p) => ShowContextPatch (PatchInfoAnd rt p) where
    showContextPatch :: ShowPatchFor -> PatchInfoAnd rt p wX wY -> m Doc
showContextPatch f :: ShowPatchFor
f (PIAP n :: PatchInfo
n p :: Hopefully (WrappedNamed rt p) wX wY
p) = case Hopefully (WrappedNamed rt p) wX wY
-> Either String (WrappedNamed rt p wX wY)
forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully (WrappedNamed rt p) wX wY
p of
                                      Right x :: WrappedNamed rt p wX wY
x -> ShowPatchFor -> WrappedNamed rt p wX wY -> m Doc
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(ShowContextPatch p, ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> p wX wY -> m Doc
showContextPatch ShowPatchFor
f WrappedNamed rt p wX wY
x
                                      Left _ -> 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 -> PatchInfo -> Doc
showPatchInfo ShowPatchFor
f PatchInfo
n

instance (Apply p, Conflict p, CommuteNoConflicts p, IsHunk p, PatchListFormat p, PrimPatchBase p,
          ShowPatch p, ApplyState p ~ Tree) => ShowPatch (PatchInfoAnd rt p) where
    description :: PatchInfoAnd rt p wX wY -> Doc
description (PIAP n :: PatchInfo
n _) = PatchInfo -> Doc
displayPatchInfo PatchInfo
n
    summary :: PatchInfoAnd rt p wX wY -> Doc
summary (PIAP n :: PatchInfo
n p :: Hopefully (WrappedNamed rt p) wX wY
p) = case Hopefully (WrappedNamed rt p) wX wY
-> Either String (WrappedNamed rt p wX wY)
forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully (WrappedNamed rt p) wX wY
p of
                         Right x :: WrappedNamed rt p wX wY
x -> WrappedNamed rt p wX wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
summary WrappedNamed rt p wX wY
x
                         Left _ -> PatchInfo -> Doc
displayPatchInfo PatchInfo
n
    summaryFL :: FL (PatchInfoAnd rt p) wX wY -> Doc
summaryFL = [Doc] -> Doc
vcat ([Doc] -> Doc)
-> (FL (PatchInfoAnd rt p) wX wY -> [Doc])
-> FL (PatchInfoAnd rt p) wX wY
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall wX wY. PatchInfoAnd rt p wX wY -> Doc)
-> FL (PatchInfoAnd rt p) wX wY -> [Doc]
forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL forall wX wY. PatchInfoAnd rt p wX wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
summary
    showNicely :: PatchInfoAnd rt p wX wY -> Doc
showNicely (PIAP n :: PatchInfo
n p :: Hopefully (WrappedNamed rt p) wX wY
p) = case Hopefully (WrappedNamed rt p) wX wY
-> Either String (WrappedNamed rt p wX wY)
forall (a :: * -> * -> *) wX wY.
Hopefully a wX wY -> Either String (a wX wY)
hopefully2either Hopefully (WrappedNamed rt p) wX wY
p of
                            Right x :: WrappedNamed rt p wX wY
x -> WrappedNamed rt p wX wY -> Doc
forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
showNicely WrappedNamed rt p wX wY
x
                            Left _ -> PatchInfo -> Doc
displayPatchInfo PatchInfo
n

instance Commute p => Commute (PatchInfoAnd rt p) where
    commute :: (:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY
-> Maybe ((:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY)
commute (x :: PatchInfoAnd rt p wX wZ
x :> y :: PatchInfoAnd rt p wZ wY
y) = do y' :: WrappedNamed rt p wX wZ
y' :> x' :: WrappedNamed rt p wZ wY
x' <- (:>) (WrappedNamed rt p) (WrappedNamed rt p) wX wY
-> Maybe ((:>) (WrappedNamed rt p) (WrappedNamed rt p) wX wY)
forall (p :: * -> * -> *) wX wY.
Commute p =>
(:>) p p wX wY -> Maybe ((:>) p p wX wY)
commute (PatchInfoAnd rt p wX wZ -> WrappedNamed rt p wX wZ
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully PatchInfoAnd rt p wX wZ
x WrappedNamed rt p wX wZ
-> WrappedNamed rt p wZ wY
-> (:>) (WrappedNamed rt p) (WrappedNamed rt p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> PatchInfoAnd rt p wZ wY -> WrappedNamed rt p wZ wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully PatchInfoAnd rt p wZ wY
y)
                          (:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY
-> Maybe ((:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY)
forall (m :: * -> *) a. Monad m => a -> m a
return ((:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY
 -> Maybe ((:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY))
-> (:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY
-> Maybe ((:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY)
forall a b. (a -> b) -> a -> b
$ (PatchInfoAnd rt p wZ wY -> PatchInfo
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> PatchInfo
info PatchInfoAnd rt p wZ wY
y PatchInfo -> WrappedNamed rt p wX wZ -> PatchInfoAnd rt p wX wZ
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> WrappedNamed rt p wA wB -> PatchInfoAnd rt p wA wB
`piap` WrappedNamed rt p wX wZ
y') PatchInfoAnd rt p wX wZ
-> PatchInfoAnd rt p wZ wY
-> (:>) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wX wZ -> a2 wZ wY -> (:>) a1 a2 wX wY
:> (PatchInfoAnd rt p wX wZ -> PatchInfo
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> PatchInfo
info PatchInfoAnd rt p wX wZ
x PatchInfo -> WrappedNamed rt p wZ wY -> PatchInfoAnd rt p wZ wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> WrappedNamed rt p wA wB -> PatchInfoAnd rt p wA wB
`piap` WrappedNamed rt p wZ wY
x')

instance Merge p => Merge (PatchInfoAnd rt p) where
    merge :: (:\/:) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY
-> (:/\:) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY
merge (x :: PatchInfoAnd rt p wZ wX
x :\/: y :: PatchInfoAnd rt p wZ wY
y) = case (:\/:) (WrappedNamed rt p) (WrappedNamed rt p) wX wY
-> (:/\:) (WrappedNamed rt p) (WrappedNamed rt p) wX wY
forall (p :: * -> * -> *) wX wY.
Merge p =>
(:\/:) p p wX wY -> (:/\:) p p wX wY
merge (PatchInfoAnd rt p wZ wX -> WrappedNamed rt p wZ wX
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully PatchInfoAnd rt p wZ wX
x WrappedNamed rt p wZ wX
-> WrappedNamed rt p wZ wY
-> (:\/:) (WrappedNamed rt p) (WrappedNamed rt p) wX wY
forall (a1 :: * -> * -> *) (a2 :: * -> * -> *) wX wY wZ.
a1 wZ wX -> a2 wZ wY -> (:\/:) a1 a2 wX wY
:\/: PatchInfoAnd rt p wZ wY -> WrappedNamed rt p wZ wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully PatchInfoAnd rt p wZ wY
y) of
                       y' :: WrappedNamed rt p wX wZ
y' :/\: x' :: WrappedNamed rt p wY wZ
x' -> (PatchInfoAnd rt p wZ wY -> PatchInfo
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> PatchInfo
info PatchInfoAnd rt p wZ wY
y PatchInfo -> WrappedNamed rt p wX wZ -> PatchInfoAnd rt p wX wZ
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> WrappedNamed rt p wA wB -> PatchInfoAnd rt p wA wB
`piap` WrappedNamed rt p wX wZ
y') PatchInfoAnd rt p wX wZ
-> PatchInfoAnd rt p wY wZ
-> (:/\:) (PatchInfoAnd rt p) (PatchInfoAnd rt p) wX wY
forall (a3 :: * -> * -> *) (a4 :: * -> * -> *) wX wY wZ.
a3 wX wZ -> a4 wY wZ -> (:/\:) a3 a4 wX wY
:/\: (PatchInfoAnd rt p wZ wX -> PatchInfo
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> PatchInfo
info PatchInfoAnd rt p wZ wX
x PatchInfo -> WrappedNamed rt p wY wZ -> PatchInfoAnd rt p wY wZ
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfo -> WrappedNamed rt p wA wB -> PatchInfoAnd rt p wA wB
`piap` WrappedNamed rt p wY wZ
x')

instance PatchInspect p => PatchInspect (PatchInfoAnd rt p) where
    listTouchedFiles :: PatchInfoAnd rt p wX wY -> [String]
listTouchedFiles = WrappedNamed rt p wX wY -> [String]
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
p wX wY -> [String]
listTouchedFiles (WrappedNamed rt p wX wY -> [String])
-> (PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY)
-> PatchInfoAnd rt p wX wY
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully
    hunkMatches :: (ByteString -> Bool) -> PatchInfoAnd rt p wX wY -> Bool
hunkMatches f :: ByteString -> Bool
f = (ByteString -> Bool) -> WrappedNamed rt p wX wY -> Bool
forall (p :: * -> * -> *) wX wY.
PatchInspect p =>
(ByteString -> Bool) -> p wX wY -> Bool
hunkMatches ByteString -> Bool
f (WrappedNamed rt p wX wY -> Bool)
-> (PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY)
-> PatchInfoAnd rt p wX wY
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully

instance Apply p => Apply (PatchInfoAnd rt p) where
    type ApplyState (PatchInfoAnd rt p) = ApplyState p
    apply :: PatchInfoAnd rt p wX wY -> m ()
apply p :: PatchInfoAnd rt p wX wY
p = WrappedNamed rt p wX wY -> m ()
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply (WrappedNamed rt p wX wY -> m ())
-> WrappedNamed rt p wX wY -> m ()
forall a b. (a -> b) -> a -> b
$ PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully PatchInfoAnd rt p wX wY
p

instance RepairToFL p => Repair (PatchInfoAnd rt p) where
    applyAndTryToFix :: PatchInfoAnd rt p wX wY
-> m (Maybe (String, PatchInfoAnd rt p wX wY))
applyAndTryToFix p :: PatchInfoAnd rt p wX wY
p = do Maybe (String, WrappedNamed rt p wX wY)
mp' <- WrappedNamed rt p wX wY
-> m (Maybe (String, WrappedNamed rt p wX wY))
forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Repair p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m (Maybe (String, p wX wY))
applyAndTryToFix (WrappedNamed rt p wX wY
 -> m (Maybe (String, WrappedNamed rt p wX wY)))
-> WrappedNamed rt p wX wY
-> m (Maybe (String, WrappedNamed rt p wX wY))
forall a b. (a -> b) -> a -> b
$ PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully PatchInfoAnd rt p wX wY
p
                            case Maybe (String, WrappedNamed rt p wX wY)
mp' of
                              Nothing -> Maybe (String, PatchInfoAnd rt p wX wY)
-> m (Maybe (String, PatchInfoAnd rt p wX wY))
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (String, PatchInfoAnd rt p wX wY)
forall a. Maybe a
Nothing
                              Just (e :: String
e,p' :: WrappedNamed rt p wX wY
p') -> Maybe (String, PatchInfoAnd rt p wX wY)
-> m (Maybe (String, PatchInfoAnd rt p wX wY))
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (String, PatchInfoAnd rt p wX wY)
 -> m (Maybe (String, PatchInfoAnd rt p wX wY)))
-> Maybe (String, PatchInfoAnd rt p wX wY)
-> m (Maybe (String, PatchInfoAnd rt p wX wY))
forall a b. (a -> b) -> a -> b
$ (String, PatchInfoAnd rt p wX wY)
-> Maybe (String, PatchInfoAnd rt p wX wY)
forall a. a -> Maybe a
Just (String
e, WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
n2pia WrappedNamed rt p wX wY
p')

instance ( ReadPatch p, PatchListFormat p, PrimPatchBase p, Effect p, FromPrim p
         , IsRepoType rt
         ) => ReadPatch (PatchInfoAnd rt p) where

    readPatch' :: m (Sealed (PatchInfoAnd rt p wX))
readPatch' = (forall wX. WrappedNamed rt p wX wX -> PatchInfoAnd rt p wX wX)
-> Sealed (WrappedNamed rt p wX) -> Sealed (PatchInfoAnd rt p wX)
forall (a :: * -> *) (b :: * -> *).
(forall wX. a wX -> b wX) -> Sealed a -> Sealed b
mapSeal forall wX. WrappedNamed rt p wX wX -> PatchInfoAnd rt p wX wX
forall (rt :: RepoType) (p :: * -> * -> *) wX wY.
WrappedNamed rt p wX wY -> PatchInfoAnd rt p wX wY
n2pia (Sealed (WrappedNamed rt p wX) -> Sealed (PatchInfoAnd rt p wX))
-> m (Sealed (WrappedNamed rt p wX))
-> m (Sealed (PatchInfoAnd rt p wX))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Sealed (WrappedNamed rt p wX))
forall (p :: * -> * -> *) (m :: * -> *) wX.
(ReadPatch p, ParserM m) =>
m (Sealed (p wX))
readPatch'

instance Effect p => Effect (PatchInfoAnd rt p) where
    effect :: PatchInfoAnd rt p wX wY -> FL (PrimOf (PatchInfoAnd rt p)) wX wY
effect = WrappedNamed rt p wX wY -> FL (PrimOf p) wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (WrappedNamed rt p wX wY -> FL (PrimOf p) wX wY)
-> (PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY)
-> PatchInfoAnd rt p wX wY
-> FL (PrimOf p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully
    effectRL :: PatchInfoAnd rt p wX wY -> RL (PrimOf (PatchInfoAnd rt p)) wX wY
effectRL = WrappedNamed rt p wX wY -> RL (PrimOf p) wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> RL (PrimOf p) wX wY
effectRL (WrappedNamed rt p wX wY -> RL (PrimOf p) wX wY)
-> (PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY)
-> PatchInfoAnd rt p wX wY
-> RL (PrimOf p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatchInfoAnd rt p wX wY -> WrappedNamed rt p wX wY
forall (rt :: RepoType) (p :: * -> * -> *) wA wB.
PatchInfoAnd rt p wA wB -> WrappedNamed rt p wA wB
hopefully

instance IsHunk (PatchInfoAnd rt p) where
    isHunk :: PatchInfoAnd rt p wX wY -> Maybe (FileHunk wX wY)
isHunk _ = Maybe (FileHunk wX wY)
forall a. Maybe a
Nothing

instance PatchDebug p => PatchDebug (PatchInfoAnd rt p)