2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
4 \section[Usage]{The @Usage@ datatype}
7 #include "HsVersions.h"
10 GenUsage(..), SYN_IE(Usage), SYN_IE(UVar), SYN_IE(UVarEnv),
11 usageOmega, pprUVar, duffUsage,
12 nullUVarEnv, mkUVarEnv, addOneToUVarEnv,
13 growUVarEnvList, isNullUVarEnv, lookupUVarEnv,
14 eqUVar, eqUsage, cloneUVar
20 import Pretty ( Doc, Mode, ptext, (<>) )
21 import UniqFM ( emptyUFM, listToUFM, addToUFM, lookupUFM,
22 plusUFM, sizeUFM, UniqFM
24 import Unique ( Unique{-instances-} )
35 type Usage = GenUsage UVar
37 usageOmega = UsageOmega
39 cloneUVar :: UVar -> Unique -> UVar
40 cloneUVar uvar uniq = uniq
42 duffUsage :: GenUsage uvar
43 duffUsage = panic "Usage of non-Type kind doesn't make sense"
46 %************************************************************************
48 \subsection{Environments}
50 %************************************************************************
53 type UVarEnv a = UniqFM a
55 nullUVarEnv :: UVarEnv a
56 mkUVarEnv :: [(UVar, a)] -> UVarEnv a
57 addOneToUVarEnv :: UVarEnv a -> UVar -> a -> UVarEnv a
58 growUVarEnvList :: UVarEnv a -> [(UVar, a)] -> UVarEnv a
59 isNullUVarEnv :: UVarEnv a -> Bool
60 lookupUVarEnv :: UVarEnv a -> UVar -> Maybe a
62 nullUVarEnv = emptyUFM
64 addOneToUVarEnv = addToUFM
65 lookupUVarEnv = lookupUFM
67 growUVarEnvList env pairs = plusUFM env (listToUFM pairs)
68 isNullUVarEnv env = sizeUFM env == 0
71 %************************************************************************
73 \subsection{Equality on usages}
75 %************************************************************************
77 Equaltity (with respect to an environment mapping usage variables
78 to equivalent usage variables).
81 eqUVar :: UVarEnv UVar -> UVar -> UVar -> Bool
84 case lookupUVarEnv uve u1 of
88 eqUsage :: UVarEnv UVar -> Usage -> Usage -> Bool
89 eqUsage uve (UsageVar u1) (UsageVar u2) = eqUVar uve u1 u2
90 eqUsage uve UsageOne UsageOne = True
91 eqUsage uve UsageOmega UsageOmega = True
95 %************************************************************************
97 \subsection{Instances}
99 %************************************************************************
102 instance Eq u => Eq (GenUsage u) where
103 (UsageVar u1) == (UsageVar u2) = u1 == u2
104 UsageOne == UsageOne = True
105 UsageOmega == UsageOmega = True
110 instance Outputable uvar => Outputable (GenUsage uvar) where
111 ppr sty UsageOne = ptext SLIT("UsageOne")
112 ppr sty UsageOmega = ptext SLIT("UsageOmega")
113 ppr sty (UsageVar u) = pprUVar sty u
115 pprUVar sty u = (<>) (ptext SLIT("u")) (ppr sty u)