[project @ 1999-05-21 12:52:28 by simonmar]
[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     ) where
15
16 #include "HsVersions.h"
17
18 import {-# SOURCE #-} TyCon     ( TyCon )
19 import {-# SOURCE #-} Type      ( Type )
20 import {-# SOURCE #-} InstEnv   ( InstEnv )
21
22 import Var              ( Id, TyVar )
23 import Name             ( NamedThing(..), Name )
24 import Unique           ( Unique, Uniquable(..) )
25 import Outputable
26 import Util
27 \end{code}
28
29 %************************************************************************
30 %*                                                                      *
31 \subsection[Class-basic]{@Class@: basic definition}
32 %*                                                                      *
33 %************************************************************************
34
35 A @Class@ corresponds to a Greek kappa in the static semantics:
36
37 \begin{code}
38 data Class
39   = Class
40         Unique          -- Key for fast comparison
41         Name
42
43         [TyVar]                 -- The class type variables
44
45         [(Class,[Type])]        -- Immediate superclasses, and the
46         [Id]                    -- corresponding selector functions to
47                                 -- extract them from a dictionary of this
48                                 -- class
49
50         [Id]                    --       * selector functions
51         [Maybe Id]              --       * default methods
52                                 -- They are all ordered by tag.  The
53                                 -- selector ids contain unfoldings.
54
55         InstEnv                 -- All the instances of this class
56
57         TyCon                   -- The data type constructor for dictionaries
58                                 -- of this class
59 \end{code}
60
61 The @mkClass@ function fills in the indirect superclasses.
62
63 \begin{code}
64 mkClass :: Name -> [TyVar]
65         -> [(Class,[Type])] -> [Id]
66         -> [Id] -> [Maybe Id]
67         -> TyCon
68         -> InstEnv
69         -> Class
70
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
75           dict_sels defms
76           class_insts
77           tycon
78 \end{code}
79
80 %************************************************************************
81 %*                                                                      *
82 \subsection[Class-selectors]{@Class@: simple selectors}
83 %*                                                                      *
84 %************************************************************************
85
86 The rest of these functions are just simple selectors.
87
88 \begin{code}
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
94
95 classBigSig (Class _ _ tyvars super_classes sdsels sels defms _ _)
96   = (tyvars, super_classes, sdsels, sels, defms)
97 \end{code}
98
99
100 %************************************************************************
101 %*                                                                      *
102 \subsection[Class-instances]{Instance declarations for @Class@}
103 %*                                                                      *
104 %************************************************************************
105
106 We compare @Classes@ by their keys (which include @Uniques@).
107
108 \begin{code}
109 instance Eq Class where
110     c1 == c2 = classKey c1 == classKey c2
111     c1 /= c2 = classKey c1 /= classKey c2
112
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
119 \end{code}
120
121 \begin{code}
122 instance Uniquable Class where
123     getUnique c = classKey c
124
125 instance NamedThing Class where
126     getName (Class _ n _ _ _ _ _ _ _) = n
127
128 instance Outputable Class where
129     ppr c = ppr (getName c)
130
131 instance Show Class where
132     showsPrec p c = showsPrecSDoc p (ppr c)
133 \end{code}
134
135