2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Class]{The @Class@ datatype}
11 classKey, classSelIds, classTyCon,
13 classBigSig, classInstEnv,
18 #include "HsVersions.h"
20 import {-# SOURCE #-} Id ( Id, idType, idName )
21 import {-# SOURCE #-} TyCon ( TyCon )
22 import {-# SOURCE #-} Type ( Type )
23 import {-# SOURCE #-} SpecEnv ( SpecEnv )
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 )
36 %************************************************************************
38 \subsection[Class-basic]{@Class@: basic definition}
40 %************************************************************************
42 A @Class@ corresponds to a Greek kappa in the static semantics:
47 Unique -- Key for fast comparison
50 [TyVar] -- The class type variables
52 [(Class,[Type])] -- Immediate superclasses, and the
53 [Id] -- corresponding selector functions to
54 -- extract them from a dictionary of this
57 [Id] -- * selector functions
58 [Maybe Id] -- * default methods
59 -- They are all ordered by tag. The
60 -- selector ids contain unfoldings.
62 ClassInstEnv -- All the instances of this class
64 TyCon -- The data type constructor for dictionaries
67 type ClassInstEnv = SpecEnv Id -- The Ids are dfuns
70 The @mkClass@ function fills in the indirect superclasses.
73 mkClass :: Name -> [TyVar]
74 -> [(Class,[Type])] -> [Id]
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
89 %************************************************************************
91 \subsection[Class-selectors]{@Class@: simple selectors}
93 %************************************************************************
95 The rest of these functions are just simple selectors.
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
104 classBigSig (Class _ _ tyvars super_classes sdsels sels defms _ _)
105 = (tyvars, super_classes, sdsels, sels, defms)
109 %************************************************************************
111 \subsection[Class-instances]{Instance declarations for @Class@}
113 %************************************************************************
115 We compare @Classes@ by their keys (which include @Uniques@).
118 instance Eq Class where
119 c1 == c2 = classKey c1 == classKey c2
120 c1 /= c2 = classKey c1 /= classKey c2
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
131 instance Uniquable Class where
132 uniqueOf c = classKey c
134 instance NamedThing Class where
135 getName (Class _ n _ _ _ _ _ _ _) = n