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,
19 import Pretty ( Pretty(..), PrettyRep, ppPStr, ppBeside )
20 import UniqFM ( emptyUFM, listToUFM, addToUFM, lookupUFM,
21 plusUFM, sizeUFM, UniqFM
23 import Unique ( Unique{-instances-} )
34 type Usage = GenUsage UVar
36 usageOmega = UsageOmega
38 duffUsage :: GenUsage uvar
39 duffUsage = panic "Usage of non-Type kind doesn't make sense"
42 %************************************************************************
44 \subsection{Environments}
46 %************************************************************************
49 type UVarEnv a = UniqFM a
51 nullUVarEnv :: UVarEnv a
52 mkUVarEnv :: [(UVar, a)] -> UVarEnv a
53 addOneToUVarEnv :: UVarEnv a -> UVar -> a -> UVarEnv a
54 growUVarEnvList :: UVarEnv a -> [(UVar, a)] -> UVarEnv a
55 isNullUVarEnv :: UVarEnv a -> Bool
56 lookupUVarEnv :: UVarEnv a -> UVar -> Maybe a
58 nullUVarEnv = emptyUFM
60 addOneToUVarEnv = addToUFM
61 lookupUVarEnv = lookupUFM
63 growUVarEnvList env pairs = plusUFM env (listToUFM pairs)
64 isNullUVarEnv env = sizeUFM env == 0
67 %************************************************************************
69 \subsection{Equality on usages}
71 %************************************************************************
73 Equaltity (with respect to an environment mapping usage variables
74 to equivalent usage variables).
77 eqUVar :: UVarEnv UVar -> UVar -> UVar -> Bool
80 case lookupUVarEnv uve u1 of
84 eqUsage :: UVarEnv UVar -> Usage -> Usage -> Bool
85 eqUsage uve (UsageVar u1) (UsageVar u2) = eqUVar uve u1 u2
86 eqUsage uve UsageOne UsageOne = True
87 eqUsage uve UsageOmega UsageOmega = True
91 %************************************************************************
93 \subsection{Instances}
95 %************************************************************************
98 instance Eq u => Eq (GenUsage u) where
99 (UsageVar u1) == (UsageVar u2) = u1 == u2
100 UsageOne == UsageOne = True
101 UsageOmega == UsageOmega = True
106 instance Outputable uvar => Outputable (GenUsage uvar) where
107 ppr sty UsageOne = ppPStr SLIT("UsageOne")
108 ppr sty UsageOmega = ppPStr SLIT("UsageOmega")
109 ppr sty (UsageVar u) = pprUVar sty u
111 pprUVar sty u = ppBeside (ppPStr SLIT("u")) (ppr sty u)