module Darcs.Patch.Witnesses.Show
    ( ShowDict(..)
    , showD
    , showListD
    , showsPrecD
    , Show1(..)
    , Show2(..)
    , show1
    , showsPrec1
    , show2
    , showsPrec2
    , showOp2
    , appPrec
    ) where

import Prelude ()
import Darcs.Prelude

import Darcs.Util.Show ( appPrec )

data ShowDict a where
    ShowDictClass :: Show a => ShowDict a
    ShowDictRecord :: (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> ShowDict a

showsPrecD :: ShowDict a -> Int -> a -> ShowS
showsPrecD :: ShowDict a -> Int -> a -> ShowS
showsPrecD ShowDictClass       = Int -> a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec
showsPrecD (ShowDictRecord showsPrecR :: Int -> a -> ShowS
showsPrecR _ _) = Int -> a -> ShowS
showsPrecR

showD :: ShowDict a -> a -> String
showD :: ShowDict a -> a -> String
showD ShowDictClass       = a -> String
forall a. Show a => a -> String
show
showD (ShowDictRecord _ showR :: a -> String
showR _) = a -> String
showR

showListD :: ShowDict a -> [a] -> ShowS
showListD :: ShowDict a -> [a] -> ShowS
showListD ShowDictClass       = [a] -> ShowS
forall a. Show a => [a] -> ShowS
showList
showListD (ShowDictRecord _ _ showListR :: [a] -> ShowS
showListR) = [a] -> ShowS
showListR

class Show1 a where
    showDict1 :: ShowDict (a wX)

showsPrec1 :: Show1 a => Int -> a wX -> ShowS
showsPrec1 :: Int -> a wX -> ShowS
showsPrec1 = ShowDict (a wX) -> Int -> a wX -> ShowS
forall a. ShowDict a -> Int -> a -> ShowS
showsPrecD ShowDict (a wX)
forall (a :: * -> *) wX. Show1 a => ShowDict (a wX)
showDict1

show1 :: Show1 a => a wX -> String
show1 :: a wX -> String
show1 = ShowDict (a wX) -> a wX -> String
forall a. ShowDict a -> a -> String
showD ShowDict (a wX)
forall (a :: * -> *) wX. Show1 a => ShowDict (a wX)
showDict1

class Show2 a where
    showDict2 :: ShowDict (a wX wY)

showsPrec2 :: Show2 a => Int -> a wX wY -> ShowS
showsPrec2 :: Int -> a wX wY -> ShowS
showsPrec2 = ShowDict (a wX wY) -> Int -> a wX wY -> ShowS
forall a. ShowDict a -> Int -> a -> ShowS
showsPrecD ShowDict (a wX wY)
forall (a :: * -> * -> *) wX wY. Show2 a => ShowDict (a wX wY)
showDict2

show2 :: Show2 a => a wX wY -> String
show2 :: a wX wY -> String
show2 = ShowDict (a wX wY) -> a wX wY -> String
forall a. ShowDict a -> a -> String
showD ShowDict (a wX wY)
forall (a :: * -> * -> *) wX wY. Show2 a => ShowDict (a wX wY)
showDict2

showOp2 :: (Show2 a, Show2 b) => Int -> String -> Int -> a wW wX -> b wY wZ -> String -> String
showOp2 :: Int -> String -> Int -> a wW wX -> b wY wZ -> ShowS
showOp2 prec :: Int
prec opstr :: String
opstr d :: Int
d x :: a wW wX
x y :: b wY wZ
y = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
prec) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Int -> a wW wX -> ShowS
forall (a :: * -> * -> *) wX wY. Show2 a => Int -> a wX wY -> ShowS
showsPrec2 (Int
prec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1) a wW wX
x ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                          String -> ShowS
showString String
opstr ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> b wY wZ -> ShowS
forall (a :: * -> * -> *) wX wY. Show2 a => Int -> a wX wY -> ShowS
showsPrec2 (Int
prec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1) b wY wZ
y