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