9fe3df3dfcd7f11a754fcfc56239fa2dd91d6e01
[ghc-hetmet.git] / ghc / compiler / types / Kind.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1996
3 %
4 \section[Kind]{The @Kind@ datatype}
5
6 \begin{code}
7 module Kind (
8         Kind(..),               -- Only visible to friends: TcKind
9
10         mkArrowKind,
11         mkTypeKind,
12         mkUnboxedTypeKind,
13         mkBoxedTypeKind,
14
15         isSubKindOf,
16         resultKind, argKind
17     ) where
18
19 import Ubiq{-uitous-}
20
21 import Util             ( panic )
22 --import Outputable     ( Outputable(..) )
23 import Pretty
24 \end{code}
25
26 \begin{code}
27 data Kind
28   = TypeKind            -- Any type (incl unboxed types)
29   | BoxedTypeKind       -- Any boxed type
30   | UnboxedTypeKind     -- Any unboxed type
31   | ArrowKind Kind Kind
32   deriving Eq
33
34 mkArrowKind       = ArrowKind
35 mkTypeKind        = TypeKind
36 mkUnboxedTypeKind = UnboxedTypeKind
37 mkBoxedTypeKind   = BoxedTypeKind
38
39 isSubKindOf :: Kind -> Kind -> Bool
40
41 BoxedTypeKind   `isSubKindOf` TypeKind = True
42 UnboxedTypeKind `isSubKindOf` TypeKind = True
43 kind1           `isSubKindOf` kind2    = kind1 == kind2
44
45 resultKind :: Kind -> Kind      -- Get result from arrow kind
46 resultKind (ArrowKind _ res_kind) = res_kind
47 resultKind other_kind             = panic "resultKind"
48
49 argKind :: Kind -> Kind         -- Get argument from arrow kind
50 argKind (ArrowKind arg_kind _) = arg_kind
51 argKind other_kind             = panic "argKind"
52 \end{code}
53
54 Printing
55 ~~~~~~~~
56 \begin{code}
57 instance Outputable Kind where
58   ppr sty kind = pprKind kind
59
60 pprKind TypeKind        = ppStr "*"
61 pprKind BoxedTypeKind   = ppStr "*b"
62 pprKind UnboxedTypeKind = ppStr "*u"
63 pprKind (ArrowKind k1 k2) = ppSep [pprKind_parend k1, ppStr "->", pprKind k2]
64
65 pprKind_parend k@(ArrowKind _ _) = ppBesides [ppLparen, pprKind k, ppRparen]
66 pprKind_parend k                 = pprKind k
67 \end{code}