2 % (c) The AQUA Project, Glasgow University, 1996
4 \section[Kind]{The @Kind@ datatype}
7 #include "HsVersions.h"
10 Kind(..), -- Only visible to friends: TcKind
20 isUnboxedKind, isTypeKind
25 import Util ( panic, assertPanic )
26 --import Outputable ( Outputable(..) )
32 = TypeKind -- Any type (incl unboxed types)
33 | BoxedTypeKind -- Any boxed type
34 | UnboxedTypeKind -- Any unboxed type
38 mkArrowKind = ArrowKind
40 mkUnboxedTypeKind = UnboxedTypeKind
41 mkBoxedTypeKind = BoxedTypeKind
43 isTypeKind :: Kind -> Bool
44 isTypeKind TypeKind = True
45 isTypeKind other = False
47 isUnboxedKind :: Kind -> Bool
48 isUnboxedKind UnboxedTypeKind = True
49 isUnboxedKind other = False
51 hasMoreBoxityInfo :: Kind -> Kind -> Bool
53 BoxedTypeKind `hasMoreBoxityInfo` TypeKind = True
54 BoxedTypeKind `hasMoreBoxityInfo` BoxedTypeKind = True
56 UnboxedTypeKind `hasMoreBoxityInfo` TypeKind = True
57 UnboxedTypeKind `hasMoreBoxityInfo` UnboxedTypeKind = True
59 TypeKind `hasMoreBoxityInfo` TypeKind = True
61 kind1 `hasMoreBoxityInfo` kind2 = ASSERT( notArrowKind kind1 &&
66 notArrowKind (ArrowKind _ _) = False
67 notArrowKind other_kind = True
69 resultKind :: Kind -> Kind -- Get result from arrow kind
70 resultKind (ArrowKind _ res_kind) = res_kind
71 resultKind other_kind = panic "resultKind"
73 argKind :: Kind -> Kind -- Get argument from arrow kind
74 argKind (ArrowKind arg_kind _) = arg_kind
75 argKind other_kind = panic "argKind"
81 instance Outputable Kind where
82 ppr sty kind = pprKind kind
84 pprKind TypeKind = ppStr "*"
85 pprKind BoxedTypeKind = ppStr "*b"
86 pprKind UnboxedTypeKind = ppStr "*u"
87 pprKind (ArrowKind k1 k2) = ppSep [pprKind_parend k1, ppStr "->", pprKind k2]
89 pprKind_parend k@(ArrowKind _ _) = ppBesides [ppLparen, pprKind k, ppRparen]
90 pprKind_parend k = pprKind k