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,
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 duffUsage :: GenUsage uvar
40 duffUsage = panic "Usage of non-Type kind doesn't make sense"
43 %************************************************************************
45 \subsection{Environments}
47 %************************************************************************
50 type UVarEnv a = UniqFM a
52 nullUVarEnv :: UVarEnv a
53 mkUVarEnv :: [(UVar, a)] -> UVarEnv a
54 addOneToUVarEnv :: UVarEnv a -> UVar -> a -> UVarEnv a
55 growUVarEnvList :: UVarEnv a -> [(UVar, a)] -> UVarEnv a
56 isNullUVarEnv :: UVarEnv a -> Bool
57 lookupUVarEnv :: UVarEnv a -> UVar -> Maybe a
59 nullUVarEnv = emptyUFM
61 addOneToUVarEnv = addToUFM
62 lookupUVarEnv = lookupUFM
64 growUVarEnvList env pairs = plusUFM env (listToUFM pairs)
65 isNullUVarEnv env = sizeUFM env == 0
68 %************************************************************************
70 \subsection{Equality on usages}
72 %************************************************************************
74 Equaltity (with respect to an environment mapping usage variables
75 to equivalent usage variables).
78 eqUVar :: UVarEnv UVar -> UVar -> UVar -> Bool
81 case lookupUVarEnv uve u1 of
85 eqUsage :: UVarEnv UVar -> Usage -> Usage -> Bool
86 eqUsage uve (UsageVar u1) (UsageVar u2) = eqUVar uve u1 u2
87 eqUsage uve UsageOne UsageOne = True
88 eqUsage uve UsageOmega UsageOmega = True
92 %************************************************************************
94 \subsection{Instances}
96 %************************************************************************
99 instance Eq u => Eq (GenUsage u) where
100 (UsageVar u1) == (UsageVar u2) = u1 == u2
101 UsageOne == UsageOne = True
102 UsageOmega == UsageOmega = True
107 instance Outputable uvar => Outputable (GenUsage uvar) where
108 ppr sty UsageOne = ptext SLIT("UsageOne")
109 ppr sty UsageOmega = ptext SLIT("UsageOmega")
110 ppr sty (UsageVar u) = pprUVar sty u
112 pprUVar sty u = (<>) (ptext SLIT("u")) (ppr sty u)