1module Darcs.Patch.Witnesses.Show
2    ( Show1(..)
3    , Show2(..)
4    , show1
5    , showsPrec1
6    , show2
7    , showsPrec2
8    , showOp2
9    , appPrec
10    ) where
11
12import Darcs.Prelude
13
14import Darcs.Util.Show ( appPrec )
15
16import Data.Constraint ( Dict(..) )
17
18type ShowDict a = Dict (Show a)
19
20showsPrecD :: ShowDict a -> Int -> a -> ShowS
21showsPrecD Dict       = showsPrec
22
23showD :: ShowDict a -> a -> String
24showD Dict       = show
25
26class Show1 a where
27  showDict1 :: Dict (Show (a wX))
28  default showDict1 :: Show (a wX) => ShowDict (a wX)
29  showDict1 = Dict
30
31showsPrec1 :: Show1 a => Int -> a wX -> ShowS
32showsPrec1 = showsPrecD showDict1
33
34show1 :: Show1 a => a wX -> String
35show1 = showD showDict1
36
37class Show2 a where
38  showDict2 :: ShowDict (a wX wY)
39  default showDict2 :: Show (a wX wY) => ShowDict (a wX wY)
40  showDict2 = Dict
41
42showsPrec2 :: Show2 a => Int -> a wX wY -> ShowS
43showsPrec2 = showsPrecD showDict2
44
45show2 :: Show2 a => a wX wY -> String
46show2 = showD showDict2
47
48showOp2 :: (Show2 a, Show2 b) => Int -> String -> Int -> a wW wX -> b wY wZ -> String -> String
49showOp2 prec opstr d x y = showParen (d > prec) $ showsPrec2 (prec + 1) x .
50                          showString opstr . showsPrec2 (prec + 1) y
51