-- Copyright (C) 2002-2004 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.

{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-unused-imports #-}

module Darcs.Patch.Viewing
    ( showContextHunk
    ) where

import Darcs.Prelude hiding ( readFile )

import Control.Applicative( (<$>) )
import qualified Data.ByteString as B ( null )
import Darcs.Util.Tree ( Tree )
import Darcs.Util.Tree.Monad ( virtualTreeMonad )

import Darcs.Patch.Apply ( Apply(..) )
import Darcs.Patch.ApplyMonad ( getApplyState,
                                ApplyMonad(..), ApplyMonadTree(..), toTree )
import Darcs.Patch.FileHunk ( IsHunk(..), FileHunk(..), showFileHunk )
import Darcs.Patch.Format ( PatchListFormat(..), ListFormat(..),
                            FileNameFormat(..) )
import Darcs.Patch.Show
    ( ShowPatchBasic(..), ShowPatch(..)
    , formatFileName, ShowPatchFor(..), ShowContextPatch(..) )
import Darcs.Patch.Witnesses.Ordered ( RL(..), FL(..), mapFL, mapFL_FL,
                                       reverseRL, concatFL )
import Darcs.Util.ByteString ( linesPS )
import Darcs.Util.Printer ( Doc, empty, vcat, text, blueText, Color(Cyan, Magenta),
                 lineColor, ($$), (<+>), prefix, userchunkPS )

showContextSeries :: forall p m wX wY . (Apply p, ShowContextPatch p, IsHunk p,
                                         ApplyMonad (ApplyState p) m)
                  => ShowPatchFor -> FileNameFormat -> FL p wX wY -> m Doc
showContextSeries :: forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ShowContextPatch p, IsHunk p,
 ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> FileNameFormat -> FL p wX wY -> m Doc
showContextSeries ShowPatchFor
use FileNameFormat
fmt = forall wWw wXx wYy.
Maybe (FileHunk wWw wXx) -> FL p wXx wYy -> m Doc
scs forall a. Maybe a
Nothing
  where
    scs :: forall wWw wXx wYy . Maybe (FileHunk wWw wXx) -> FL p wXx wYy -> m Doc
    scs :: forall wWw wXx wYy.
Maybe (FileHunk wWw wXx) -> FL p wXx wYy -> m Doc
scs Maybe (FileHunk wWw wXx)
pold (p wXx wY
p :>: FL p wY wYy
ps) = do
        (()
_, ApplyState p (ApplyMonadBase m)
s') <- forall (state :: (* -> *) -> *) (m :: * -> *) x.
ApplyMonad state m =>
m x -> state (ApplyMonadBase m) -> m (x, state (ApplyMonadBase m))
nestedApply (forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ApplyMonad (ApplyState p) m) =>
p wX wY -> m ()
apply p wXx wY
p) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (state :: (* -> *) -> *) (m :: * -> *).
ApplyMonad state m =>
m (state (ApplyMonadBase m))
getApplyState
        case forall (p :: * -> * -> *) wX wY.
IsHunk p =>
p wX wY -> Maybe (FileHunk wX wY)
isHunk p wXx wY
p of
            Maybe (FileHunk wXx wY)
Nothing -> do
                Doc
a <- forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(ShowContextPatch p, ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> p wX wY -> m Doc
showContextPatch ShowPatchFor
use p wXx wY
p
                (Doc, ApplyState p (ApplyMonadBase m))
b <- forall (state :: (* -> *) -> *) (m :: * -> *) x.
ApplyMonad state m =>
m x -> state (ApplyMonadBase m) -> m (x, state (ApplyMonadBase m))
nestedApply (forall wWw wXx wYy.
Maybe (FileHunk wWw wXx) -> FL p wXx wYy -> m Doc
scs forall a. Maybe a
Nothing FL p wY wYy
ps) ApplyState p (ApplyMonadBase m)
s'
                forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Doc
a Doc -> Doc -> Doc
$$ forall a b. (a, b) -> a
fst (Doc, ApplyState p (ApplyMonadBase m))
b
            Just FileHunk wXx wY
fh -> case FL p wY wYy
ps of
                FL p wY wYy
NilFL -> forall a b. (a, b) -> a
fst forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (state :: (* -> *) -> *) (m :: * -> *) x.
ApplyMonad state m =>
(state (ApplyMonadBase m) -> ApplyMonadBase m x)
-> state (ApplyMonadBase m) -> m (x, state (ApplyMonadBase m))
liftApply (forall wA wB wC wD.
Maybe (FileHunk wA wB)
-> FileHunk wB wC
-> Maybe (FileHunk wC wD)
-> ApplyState p (ApplyMonadBase m)
-> ApplyMonadBase m Doc
cool Maybe (FileHunk wWw wXx)
pold FileHunk wXx wY
fh forall a. Maybe a
Nothing) ApplyState p (ApplyMonadBase m)
s'
                (p wY wY
p2 :>: FL p wY wYy
_) -> do
                    Doc
a <- forall a b. (a, b) -> a
fst forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (state :: (* -> *) -> *) (m :: * -> *) x.
ApplyMonad state m =>
(state (ApplyMonadBase m) -> ApplyMonadBase m x)
-> state (ApplyMonadBase m) -> m (x, state (ApplyMonadBase m))
liftApply (forall wA wB wC wD.
Maybe (FileHunk wA wB)
-> FileHunk wB wC
-> Maybe (FileHunk wC wD)
-> ApplyState p (ApplyMonadBase m)
-> ApplyMonadBase m Doc
cool Maybe (FileHunk wWw wXx)
pold FileHunk wXx wY
fh (forall (p :: * -> * -> *) wX wY.
IsHunk p =>
p wX wY -> Maybe (FileHunk wX wY)
isHunk p wY wY
p2)) ApplyState p (ApplyMonadBase m)
s'
                    (Doc, ApplyState p (ApplyMonadBase m))
b <- forall (state :: (* -> *) -> *) (m :: * -> *) x.
ApplyMonad state m =>
m x -> state (ApplyMonadBase m) -> m (x, state (ApplyMonadBase m))
nestedApply (forall wWw wXx wYy.
Maybe (FileHunk wWw wXx) -> FL p wXx wYy -> m Doc
scs (forall a. a -> Maybe a
Just FileHunk wXx wY
fh) FL p wY wYy
ps) ApplyState p (ApplyMonadBase m)
s'
                    forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Doc
a Doc -> Doc -> Doc
$$ forall a b. (a, b) -> a
fst (Doc, ApplyState p (ApplyMonadBase m))
b
    scs Maybe (FileHunk wWw wXx)
_ FL p wXx wYy
NilFL = forall (m :: * -> *) a. Monad m => a -> m a
return Doc
empty

    cool :: Maybe (FileHunk wA wB) -> FileHunk wB wC -> Maybe (FileHunk wC wD)
         -> (ApplyState p) (ApplyMonadBase m) -> (ApplyMonadBase m) Doc
    cool :: forall wA wB wC wD.
Maybe (FileHunk wA wB)
-> FileHunk wB wC
-> Maybe (FileHunk wC wD)
-> ApplyState p (ApplyMonadBase m)
-> ApplyMonadBase m Doc
cool Maybe (FileHunk wA wB)
pold FileHunk wB wC
fh Maybe (FileHunk wC wD)
ps ApplyState p (ApplyMonadBase m)
s =
        forall a b. (a, b) -> a
fst forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a.
Monad m =>
TreeMonad m a -> Tree m -> m (a, Tree m)
virtualTreeMonad (forall (m :: * -> *) wA wB wC wD.
ApplyMonad Tree m =>
FileNameFormat
-> Maybe (FileHunk wA wB)
-> FileHunk wB wC
-> Maybe (FileHunk wC wD)
-> m Doc
coolContextHunk FileNameFormat
fmt Maybe (FileHunk wA wB)
pold FileHunk wB wC
fh Maybe (FileHunk wC wD)
ps) (forall (s :: (* -> *) -> *) (m :: * -> *).
ToTree s =>
s m -> Tree m
toTree ApplyState p (ApplyMonadBase m)
s)

showContextHunk :: (ApplyMonad Tree m) => FileNameFormat -> FileHunk wX wY -> m Doc
showContextHunk :: forall (m :: * -> *) wX wY.
ApplyMonad Tree m =>
FileNameFormat -> FileHunk wX wY -> m Doc
showContextHunk FileNameFormat
fmt FileHunk wX wY
h = forall (m :: * -> *) wA wB wC wD.
ApplyMonad Tree m =>
FileNameFormat
-> Maybe (FileHunk wA wB)
-> FileHunk wB wC
-> Maybe (FileHunk wC wD)
-> m Doc
coolContextHunk FileNameFormat
fmt forall a. Maybe a
Nothing FileHunk wX wY
h forall a. Maybe a
Nothing

coolContextHunk :: (ApplyMonad Tree m)
                => FileNameFormat
                -> Maybe (FileHunk wA wB) -> FileHunk wB wC
                -> Maybe (FileHunk wC wD) -> m Doc
coolContextHunk :: forall (m :: * -> *) wA wB wC wD.
ApplyMonad Tree m =>
FileNameFormat
-> Maybe (FileHunk wA wB)
-> FileHunk wB wC
-> Maybe (FileHunk wC wD)
-> m Doc
coolContextHunk FileNameFormat
fmt Maybe (FileHunk wA wB)
prev fh :: FileHunk wB wC
fh@(FileHunk AnchoredPath
f Int
l [ByteString]
o [ByteString]
n) Maybe (FileHunk wC wD)
next = do
    Bool
have <- forall (m :: * -> *). ApplyMonadTree m => AnchoredPath -> m Bool
mDoesFileExist AnchoredPath
f
    Maybe ByteString
f_content <- if Bool
have then forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` forall (m :: * -> *).
ApplyMonadTree m =>
AnchoredPath -> m ByteString
mReadFilePS AnchoredPath
f else forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
    case ByteString -> [ByteString]
linesPS forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Maybe ByteString
f_content of
        -- FIXME This is a weird error...
        Maybe [ByteString]
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall wX wY. FileNameFormat -> FileHunk wX wY -> Doc
showFileHunk FileNameFormat
fmt FileHunk wB wC
fh
        Just [ByteString]
ls ->
            let pre :: [ByteString]
pre = forall a. Int -> [a] -> [a]
take Int
numpre forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [a]
drop (Int
l forall a. Num a => a -> a -> a
- Int
numpre forall a. Num a => a -> a -> a
- Int
1) [ByteString]
ls
                cleanedls :: [ByteString]
cleanedls = case forall a. [a] -> [a]
reverse [ByteString]
ls of
                    (ByteString
x : [ByteString]
xs)
                        | ByteString -> Bool
B.null ByteString
x -> forall a. [a] -> [a]
reverse [ByteString]
xs
                    [ByteString]
_ -> [ByteString]
ls
                post :: [ByteString]
post = forall a. Int -> [a] -> [a]
take Int
numpost forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [a]
drop (forall a. Ord a => a -> a -> a
max Int
0 forall a b. (a -> b) -> a -> b
$ Int
lforall a. Num a => a -> a -> a
+forall (t :: * -> *) a. Foldable t => t a -> Int
length [ByteString]
oforall a. Num a => a -> a -> a
-Int
1) [ByteString]
cleanedls in
            forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$
                String -> Doc
blueText String
"hunk" Doc -> Doc -> Doc
<+> FileNameFormat -> AnchoredPath -> Doc
formatFileName FileNameFormat
fmt AnchoredPath
f
                    Doc -> Doc -> Doc
<+> String -> Doc
text (forall a. Show a => a -> String
show Int
l)
                Doc -> Doc -> Doc
$$ String -> Doc -> Doc
prefix String
" " ([Doc] -> Doc
vcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map ByteString -> Doc
userchunkPS [ByteString]
pre)
                Doc -> Doc -> Doc
$$ Color -> Doc -> Doc
lineColor Color
Magenta (String -> Doc -> Doc
prefix String
"-" ([Doc] -> Doc
vcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map ByteString -> Doc
userchunkPS [ByteString]
o))
                Doc -> Doc -> Doc
$$ Color -> Doc -> Doc
lineColor Color
Cyan    (String -> Doc -> Doc
prefix String
"+" ([Doc] -> Doc
vcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map ByteString -> Doc
userchunkPS [ByteString]
n))
                Doc -> Doc -> Doc
$$ String -> Doc -> Doc
prefix String
" " ([Doc] -> Doc
vcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map ByteString -> Doc
userchunkPS [ByteString]
post)
  where
    numpre :: Int
numpre = case Maybe (FileHunk wA wB)
prev of
        Just (FileHunk AnchoredPath
f' Int
lprev [ByteString]
_ [ByteString]
nprev)
            | AnchoredPath
f' forall a. Eq a => a -> a -> Bool
== AnchoredPath
f Bool -> Bool -> Bool
&& Int
l forall a. Num a => a -> a -> a
- (Int
lprev forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. Foldable t => t a -> Int
length [ByteString]
nprev forall a. Num a => a -> a -> a
+ Int
3) forall a. Ord a => a -> a -> Bool
< Int
3 Bool -> Bool -> Bool
&& Int
lprev forall a. Ord a => a -> a -> Bool
< Int
l
            -> forall a. Ord a => a -> a -> a
max Int
0 forall a b. (a -> b) -> a -> b
$ Int
l forall a. Num a => a -> a -> a
- (Int
lprev forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. Foldable t => t a -> Int
length [ByteString]
nprev forall a. Num a => a -> a -> a
+ Int
3)
        Maybe (FileHunk wA wB)
_ -> if Int
l forall a. Ord a => a -> a -> Bool
>= Int
4 then Int
3 else Int
l forall a. Num a => a -> a -> a
- Int
1

    numpost :: Int
numpost = case Maybe (FileHunk wC wD)
next of
        Just (FileHunk AnchoredPath
f' Int
lnext [ByteString]
_ [ByteString]
_)
            | AnchoredPath
f' forall a. Eq a => a -> a -> Bool
== AnchoredPath
f Bool -> Bool -> Bool
&& Int
lnext forall a. Ord a => a -> a -> Bool
< Int
l forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. Foldable t => t a -> Int
length [ByteString]
n forall a. Num a => a -> a -> a
+ Int
4 Bool -> Bool -> Bool
&& Int
lnext forall a. Ord a => a -> a -> Bool
> Int
l
            -> Int
lnext forall a. Num a => a -> a -> a
- (Int
l forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. Foldable t => t a -> Int
length [ByteString]
n)
        Maybe (FileHunk wC wD)
_ -> Int
3

instance (PatchListFormat p, ShowPatchBasic p) => ShowPatchBasic (FL p) where
    showPatch :: forall wX wY. ShowPatchFor -> FL p wX wY -> Doc
showPatch ShowPatchFor
ForDisplay = [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.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForDisplay)
    showPatch ShowPatchFor
ForStorage = forall wX wY. ListFormat p -> FL p wX wY -> Doc
showPatchInternal forall (p :: * -> * -> *). PatchListFormat p => ListFormat p
patchListFormat
      where
        showPatchInternal :: ListFormat p -> FL p wX wY -> Doc
        showPatchInternal :: forall wX wY. ListFormat p -> FL p wX wY -> Doc
showPatchInternal ListFormat p
ListFormatV1 (p wX wY
p :>: FL p wY wY
NilFL) = (forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForStorage) p wX wY
p
        showPatchInternal ListFormat p
ListFormatV1 FL p wX wY
NilFL = String -> Doc
blueText String
"{" Doc -> Doc -> Doc
$$ String -> Doc
blueText String
"}"
        showPatchInternal ListFormat p
ListFormatV1 FL p wX wY
ps = String -> Doc
blueText String
"{"
                                            Doc -> Doc -> Doc
$$ [Doc] -> Doc
vcat (forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForStorage) FL p wX wY
ps)
                                            Doc -> Doc -> Doc
$$ String -> Doc
blueText String
"}"
        showPatchInternal ListFormat p
ListFormatV2 FL p wX wY
ps = [Doc] -> Doc
vcat (forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForStorage) FL p wX wY
ps)
        showPatchInternal ListFormat p
ListFormatDefault FL p wX wY
ps = [Doc] -> Doc
vcat (forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForStorage) FL p wX wY
ps)
        showPatchInternal ListFormat p
ListFormatV3 FL p wX wY
ps = [Doc] -> Doc
vcat (forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForStorage) FL p wX wY
ps)

instance (Apply p, IsHunk p, PatchListFormat p, ShowContextPatch p)
        => ShowContextPatch (FL p) where
    showContextPatch :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (FL p)) m =>
ShowPatchFor -> FL p wX wY -> m Doc
showContextPatch ShowPatchFor
ForDisplay = forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ShowContextPatch p, IsHunk p,
 ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> FileNameFormat -> FL p wX wY -> m Doc
showContextSeries ShowPatchFor
ForDisplay FileNameFormat
FileNameFormatDisplay
    showContextPatch ShowPatchFor
ForStorage = forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (FL p)) m =>
ListFormat p -> FL p wX wY -> m Doc
showContextPatchInternal forall (p :: * -> * -> *). PatchListFormat p => ListFormat p
patchListFormat
      where
        showContextPatchInternal :: (ApplyMonad (ApplyState (FL p)) m)
                                 => ListFormat p -> FL p wX wY -> m Doc
        showContextPatchInternal :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (FL p)) m =>
ListFormat p -> FL p wX wY -> m Doc
showContextPatchInternal ListFormat p
ListFormatV1 (p wX wY
p :>: FL p wY wY
NilFL) =
            forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(ShowContextPatch p, ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> p wX wY -> m Doc
showContextPatch ShowPatchFor
ForStorage p wX wY
p
        showContextPatchInternal ListFormat p
ListFormatV1 FL p wX wY
NilFL =
            forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ String -> Doc
blueText String
"{" Doc -> Doc -> Doc
$$ String -> Doc
blueText String
"}"
        showContextPatchInternal ListFormat p
ListFormatV1 FL p wX wY
ps = do
            Doc
x <- forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ShowContextPatch p, IsHunk p,
 ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> FileNameFormat -> FL p wX wY -> m Doc
showContextSeries ShowPatchFor
ForStorage FileNameFormat
FileNameFormatV1 FL p wX wY
ps
            forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ String -> Doc
blueText String
"{" Doc -> Doc -> Doc
$$ Doc
x Doc -> Doc -> Doc
$$ String -> Doc
blueText String
"}"
        showContextPatchInternal ListFormat p
ListFormatV2 FL p wX wY
ps = forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ShowContextPatch p, IsHunk p,
 ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> FileNameFormat -> FL p wX wY -> m Doc
showContextSeries ShowPatchFor
ForStorage FileNameFormat
FileNameFormatV2 FL p wX wY
ps
        showContextPatchInternal ListFormat p
ListFormatDefault FL p wX wY
ps = forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(Apply p, ShowContextPatch p, IsHunk p,
 ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> FileNameFormat -> FL p wX wY -> m Doc
showContextSeries ShowPatchFor
ForStorage FileNameFormat
FileNameFormatV2 FL p wX wY
ps
        showContextPatchInternal ListFormat p
ListFormatV3 FL p wX wY
ps = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
ForStorage FL p wX wY
ps

instance (PatchListFormat p, ShowPatch p) => ShowPatch (FL p) where
    content :: forall wX wY. FL p wX wY -> Doc
content = [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
content

    description :: forall wX wY. FL p wX wY -> Doc
description = [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
description

    summary :: forall wX wY. FL p wX wY -> Doc
summary = forall (p :: * -> * -> *) wX wY. ShowPatch p => FL p wX wY -> Doc
summaryFL

    summaryFL :: forall wX wY. FL (FL p) wX wY -> Doc
summaryFL = forall (p :: * -> * -> *) wX wY. ShowPatch p => FL p wX wY -> Doc
summaryFL forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL

    thing :: forall wX wY. FL p wX wY -> String
thing FL p wX wY
x = forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> String
thing (forall (a :: * -> * -> *) wX wY. FL a wX wY -> a wX wY
helperx FL p wX wY
x) forall a. [a] -> [a] -> [a]
++ String
"s"
      where
        helperx :: FL a wX wY -> a wX wY
        helperx :: forall (a :: * -> * -> *) wX wY. FL a wX wY -> a wX wY
helperx FL a wX wY
_ = forall a. HasCallStack => a
undefined

    things :: forall wX wY. FL p wX wY -> String
things = forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> String
thing

instance (PatchListFormat p, ShowPatchBasic p) => ShowPatchBasic (RL p) where
    showPatch :: forall wX wY. ShowPatchFor -> RL p wX wY -> Doc
showPatch ShowPatchFor
f = forall (p :: * -> * -> *) wX wY.
ShowPatchBasic p =>
ShowPatchFor -> p wX wY -> Doc
showPatch ShowPatchFor
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL

instance (ShowContextPatch p, Apply p, IsHunk p, PatchListFormat p)
        => ShowContextPatch (RL p) where
    showContextPatch :: forall (m :: * -> *) wX wY.
ApplyMonad (ApplyState (RL p)) m =>
ShowPatchFor -> RL p wX wY -> m Doc
showContextPatch ShowPatchFor
use = forall (p :: * -> * -> *) (m :: * -> *) wX wY.
(ShowContextPatch p, ApplyMonad (ApplyState p) m) =>
ShowPatchFor -> p wX wY -> m Doc
showContextPatch ShowPatchFor
use forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL

instance (PatchListFormat p, ShowPatch p) => ShowPatch (RL p) where
    content :: forall wX wY. RL p wX wY -> Doc
content = forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
content forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL

    description :: forall wX wY. RL p wX wY -> Doc
description = forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
description forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL

    summary :: forall wX wY. RL p wX wY -> Doc
summary = forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> Doc
summary forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL

    summaryFL :: forall wX wY. FL (RL p) wX wY -> Doc
summaryFL = forall (p :: * -> * -> *) wX wY. ShowPatch p => FL p wX wY -> Doc
summaryFL forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL

    thing :: forall wX wY. RL p wX wY -> String
thing = forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> String
thing forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL

    things :: forall wX wY. RL p wX wY -> String
things = forall (p :: * -> * -> *) wX wY. ShowPatch p => p wX wY -> String
things forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL