2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Class]{The @Class@ datatype}
11 classKey, classSelIds, classTyCon,
13 classBigSig, classInstEnv
16 #include "HsVersions.h"
18 import {-# SOURCE #-} TyCon ( TyCon )
19 import {-# SOURCE #-} Type ( Type )
20 import {-# SOURCE #-} InstEnv ( InstEnv )
22 import Var ( Id, TyVar )
23 import Name ( NamedThing(..), Name )
24 import Unique ( Unique, Uniquable(..) )
29 %************************************************************************
31 \subsection[Class-basic]{@Class@: basic definition}
33 %************************************************************************
35 A @Class@ corresponds to a Greek kappa in the static semantics:
40 Unique -- Key for fast comparison
43 [TyVar] -- The class type variables
45 [(Class,[Type])] -- Immediate superclasses, and the
46 [Id] -- corresponding selector functions to
47 -- extract them from a dictionary of this
50 [Id] -- * selector functions
51 [Maybe Id] -- * default methods
52 -- They are all ordered by tag. The
53 -- selector ids contain unfoldings.
55 InstEnv -- All the instances of this class
57 TyCon -- The data type constructor for dictionaries
61 The @mkClass@ function fills in the indirect superclasses.
64 mkClass :: Name -> [TyVar]
65 -> [(Class,[Type])] -> [Id]
71 mkClass name tyvars super_classes superdict_sels
72 dict_sels defms tycon class_insts
73 = Class (getUnique name) name tyvars
74 super_classes superdict_sels
80 %************************************************************************
82 \subsection[Class-selectors]{@Class@: simple selectors}
84 %************************************************************************
86 The rest of these functions are just simple selectors.
89 classKey (Class key _ _ _ _ _ _ _ _) = key
90 classSuperClassTheta (Class _ _ _ scs _ _ _ _ _) = scs
91 classSelIds (Class _ _ _ _ sc_sels op_sels _ _ _) = sc_sels ++ op_sels
92 classTyCon (Class _ _ _ _ _ _ _ _ tc) = tc
93 classInstEnv (Class _ _ _ _ _ _ _ env _) = env
95 classBigSig (Class _ _ tyvars super_classes sdsels sels defms _ _)
96 = (tyvars, super_classes, sdsels, sels, defms)
100 %************************************************************************
102 \subsection[Class-instances]{Instance declarations for @Class@}
104 %************************************************************************
106 We compare @Classes@ by their keys (which include @Uniques@).
109 instance Eq Class where
110 c1 == c2 = classKey c1 == classKey c2
111 c1 /= c2 = classKey c1 /= classKey c2
113 instance Ord Class where
114 c1 <= c2 = classKey c1 <= classKey c2
115 c1 < c2 = classKey c1 < classKey c2
116 c1 >= c2 = classKey c1 >= classKey c2
117 c1 > c2 = classKey c1 > classKey c2
118 compare c1 c2 = classKey c1 `compare` classKey c2
122 instance Uniquable Class where
123 getUnique c = classKey c
125 instance NamedThing Class where
126 getName (Class _ n _ _ _ _ _ _ _) = n
128 instance Outputable Class where
129 ppr c = ppr (getName c)
131 instance Show Class where
132 showsPrec p c = showsPrecSDoc p (ppr c)