2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
4 \section[Usage]{The @Usage@ datatype}
7 #include "HsVersions.h"
10 GenUsage(..), Usage(..), UVar(..), UVarEnv(..),
11 usageOmega, pprUVar, duffUsage,
12 nullUVarEnv, mkUVarEnv, addOneToUVarEnv,
13 growUVarEnvList, isNullUVarEnv, lookupUVarEnv,
18 import Pretty ( Pretty(..), PrettyRep, ppPStr, ppBeside )
19 import UniqFM ( emptyUFM, listToUFM, addToUFM, lookupUFM,
20 plusUFM, sizeUFM, UniqFM )
21 import Unique ( Unique{-instances-} )
31 type Usage = GenUsage UVar
33 usageOmega = UsageOmega
35 duffUsage :: GenUsage uvar
36 duffUsage = error "Usage of non-Type kind doesn't make sense"
39 %************************************************************************
41 \subsection{Environments}
43 %************************************************************************
46 type UVarEnv a = UniqFM a
48 nullUVarEnv :: UVarEnv a
49 mkUVarEnv :: [(UVar, a)] -> UVarEnv a
50 addOneToUVarEnv :: UVarEnv a -> UVar -> a -> UVarEnv a
51 growUVarEnvList :: UVarEnv a -> [(UVar, a)] -> UVarEnv a
52 isNullUVarEnv :: UVarEnv a -> Bool
53 lookupUVarEnv :: UVarEnv a -> UVar -> Maybe a
55 nullUVarEnv = emptyUFM
57 addOneToUVarEnv = addToUFM
58 lookupUVarEnv = lookupUFM
60 growUVarEnvList env pairs = plusUFM env (listToUFM pairs)
61 isNullUVarEnv env = sizeUFM env == 0
64 %************************************************************************
66 \subsection{Equality on usages}
68 %************************************************************************
70 Equaltity (with respect to an environment mapping usage variables
71 to equivalent usage variables).
74 eqUVar :: UVarEnv UVar -> UVar -> UVar -> Bool
77 case lookupUVarEnv uve u1 of
81 eqUsage :: UVarEnv UVar -> Usage -> Usage -> Bool
82 eqUsage uve (UsageVar u1) (UsageVar u2) = eqUVar uve u1 u2
83 eqUsage uve UsageOne UsageOne = True
84 eqUsage uve UsageOmega UsageOmega = True
88 %************************************************************************
90 \subsection{Instances}
92 %************************************************************************
95 instance Eq u => Eq (GenUsage u) where
96 (UsageVar u1) == (UsageVar u2) = u1 == u2
97 UsageOne == UsageOne = True
98 UsageOmega == UsageOmega = True
103 instance Outputable uvar => Outputable (GenUsage uvar) where
104 ppr sty UsageOne = ppPStr SLIT("UsageOne")
105 ppr sty UsageOmega = ppPStr SLIT("UsageOmega")
106 ppr sty (UsageVar u) = pprUVar sty u
108 pprUVar sty u = ppBeside (ppPStr SLIT("u")) (ppr sty u)