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