{-# OPTIONS_GHC -fno-warn-orphans #-}
module Darcs.Patch.V1.Show ( showPatch_ ) where

import Darcs.Patch.Format ( FileNameFormat(..) )
import Darcs.Patch.Prim ( showPrim, PrimPatch )

import Darcs.Patch.V1.Core ( Patch(..) )

import Darcs.Witnesses.Show ( Show1(..), Show2(..), ShowDict(..) )

import Printer ( Doc, renderString,
                 text, blueText,
                 ($$), (<+>) )

#include "gadts.h"

instance PrimPatch prim => Show (Patch prim C(x y))  where
    show p = renderString (showPatch_ p) ++ "\n"
instance PrimPatch prim => Show1 (Patch prim C(x)) where
    showDict1 = ShowDictClass
instance PrimPatch prim => Show2 (Patch prim) where
    showDict2 = ShowDictClass

showPatch_ :: PrimPatch prim => Patch prim C(a b) -> Doc
showPatch_ (PP p) = showPrim OldFormat p
showPatch_ (Merger _ _ p1 p2) = showMerger "merger" p1 p2
showPatch_ (Regrem _ _ p1 p2) = showMerger "regrem" p1 p2

showMerger :: PrimPatch prim => String -> Patch prim C(a b) -> Patch prim C(d e) -> Doc
showMerger merger_name p1 p2 =
    blueText merger_name <+> text "0.0" <+> blueText "("
                           $$ showPatch_ p1
                           $$ showPatch_ p2
                           $$ blueText ")"