"Combining" in parenthesis
[darcs-mirror-sem_syn.git] / Util.hs
1 module Util where 
2
3 import Text.PrettyPrint
4 import Data.List (group, sort)
5
6 class Ppr a where
7     ppr :: a -> Doc 
8     pprList :: [a] -> Doc 
9     pprList as = brackets (sep $ punctuate comma (map ppr as))
10
11
12 instance (Ppr Int) where 
13     ppr i = int i 
14
15 instance (Ppr Integer) where
16     ppr i = integer i 
17
18
19 instance (Ppr a, Ppr b) => Ppr (a,b) where
20     ppr (a,b) = parens (sep $ punctuate comma [ppr a, ppr b])
21
22 instance (Ppr a, Ppr b, Ppr c) => Ppr (a,b,c) where 
23     ppr (a,b,c) = parens (sep $ punctuate comma [ppr a, ppr b, ppr c])
24
25 instance Ppr a => Ppr [a] where
26     ppr as    = pprList as -- brackets (sep $ punctuate comma (map ppr as))
27
28 instance Ppr Char where
29     ppr c     = char c
30     pprList s = text s
31
32 instance (Ppr a, Ppr b) => Ppr (Either a b) where
33     ppr (Left a)  = text "Left"  <+> ppr a 
34     ppr (Right b) = text "Right" <+> ppr b
35
36 instance (Ppr a) => Ppr (Maybe a) where
37     ppr (Nothing) = text "Nothing"
38     ppr (Just a)  = text "Just" <+> ppr a 
39
40
41 {-# SPECIALIZE snub :: [Int] -> [Int] #-}
42 {-# SPECIALIZE snub :: [String] -> [String] #-}
43 snub :: Ord a => [a] -> [a]
44 snub = map head . group .  sort