[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / compiler / types / Class.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[Class]{The @Class@ datatype}
5
6 \begin{code}
7 module Class (
8         Class,
9
10         mkClass,
11         classKey, classSelIds, classTyCon,
12         classSuperClassTheta,
13         classBigSig, classInstEnv,
14
15         ClassInstEnv
16     ) where
17
18 #include "HsVersions.h"
19
20 import {-# SOURCE #-} TyCon     ( TyCon )
21 import {-# SOURCE #-} Type      ( Type )
22 import {-# SOURCE #-} SpecEnv   ( SpecEnv )
23
24 import Var              ( Id, TyVar )
25 import Name             ( NamedThing(..), Name )
26 import Unique           ( Unique, Uniquable(..) )
27 import Outputable
28 import Util
29 \end{code}
30
31 %************************************************************************
32 %*                                                                      *
33 \subsection[Class-basic]{@Class@: basic definition}
34 %*                                                                      *
35 %************************************************************************
36
37 A @Class@ corresponds to a Greek kappa in the static semantics:
38
39 \begin{code}
40 data Class
41   = Class
42         Unique          -- Key for fast comparison
43         Name
44
45         [TyVar]                 -- The class type variables
46
47         [(Class,[Type])]        -- Immediate superclasses, and the
48         [Id]                    -- corresponding selector functions to
49                                 -- extract them from a dictionary of this
50                                 -- class
51
52         [Id]                    --       * selector functions
53         [Maybe Id]              --       * default methods
54                                 -- They are all ordered by tag.  The
55                                 -- selector ids contain unfoldings.
56
57         ClassInstEnv            -- All the instances of this class
58
59         TyCon                   -- The data type constructor for dictionaries
60                                 -- of this class
61
62 type ClassInstEnv = SpecEnv Id          -- The Ids are dfuns
63 \end{code}
64
65 The @mkClass@ function fills in the indirect superclasses.
66
67 \begin{code}
68 mkClass :: Name -> [TyVar]
69         -> [(Class,[Type])] -> [Id]
70         -> [Id] -> [Maybe Id]
71         -> TyCon
72         -> ClassInstEnv
73         -> Class
74
75 mkClass name tyvars super_classes superdict_sels
76         dict_sels defms tycon class_insts
77   = Class (getUnique name) name tyvars
78           super_classes superdict_sels
79           dict_sels defms
80           class_insts
81           tycon
82 \end{code}
83
84 %************************************************************************
85 %*                                                                      *
86 \subsection[Class-selectors]{@Class@: simple selectors}
87 %*                                                                      *
88 %************************************************************************
89
90 The rest of these functions are just simple selectors.
91
92 \begin{code}
93 classKey             (Class key _ _ _ _ _ _ _ _)  = key
94 classSuperClassTheta (Class _ _ _ scs _ _ _ _ _)  = scs
95 classSelIds          (Class _ _ _ _ _ sels _ _ _) = sels
96 classTyCon           (Class _ _ _ _ _ _ _ _ tc)   = tc
97 classInstEnv         (Class _ _ _ _ _ _ _ env _)  = env
98
99 classBigSig (Class _ _ tyvars super_classes sdsels sels defms _ _)
100   = (tyvars, super_classes, sdsels, sels, defms)
101 \end{code}
102
103
104 %************************************************************************
105 %*                                                                      *
106 \subsection[Class-instances]{Instance declarations for @Class@}
107 %*                                                                      *
108 %************************************************************************
109
110 We compare @Classes@ by their keys (which include @Uniques@).
111
112 \begin{code}
113 instance Eq Class where
114     c1 == c2 = classKey c1 == classKey c2
115     c1 /= c2 = classKey c1 /= classKey c2
116
117 instance Ord Class where
118     c1 <= c2 = classKey c1 <= classKey c2
119     c1 <  c2 = classKey c1 <  classKey c2
120     c1 >= c2 = classKey c1 >= classKey c2
121     c1 >  c2 = classKey c1 >  classKey c2
122     compare c1 c2 = classKey c1 `compare` classKey c2
123 \end{code}
124
125 \begin{code}
126 instance Uniquable Class where
127     getUnique c = classKey c
128
129 instance NamedThing Class where
130     getName (Class _ n _ _ _ _ _ _ _) = n
131
132 instance Outputable Class where
133     ppr c = ppr (getName c)
134
135 instance Show Class where
136     showsPrec p c = showsPrecSDoc p (ppr c)
137 \end{code}
138
139