early in the hierarchy), but also in HsSyn.
\begin{code}
-data IPName name
- = Dupable name -- ?x: you can freely duplicate this implicit parameter
- | Linear name -- %x: you must use the splitting function to duplicate it
+newtype IPName name = IPName name -- ?x
deriving( Eq, Ord ) -- Ord is used in the IP name cache finite map
-- (used in HscTypes.OrigIParamCache)
-
ipNameName :: IPName name -> name
-ipNameName (Dupable n) = n
-ipNameName (Linear n) = n
+ipNameName (IPName n) = n
mapIPName :: (a->b) -> IPName a -> IPName b
-mapIPName f (Dupable n) = Dupable (f n)
-mapIPName f (Linear n) = Linear (f n)
+mapIPName f (IPName n) = IPName (f n)
instance Outputable name => Outputable (IPName name) where
- ppr (Dupable n) = char '?' <> ppr n -- Ordinary implicit parameters
- ppr (Linear n) = char '%' <> ppr n -- Splittable implicit parameters
+ ppr (IPName n) = char '?' <> ppr n -- Ordinary implicit parameters
\end{code}
-- Without the Incoherent flag, we'd complain that
-- instantiating 'b' would change which instance
-- was chosen
+ deriving( Eq )
instance Outputable OverlapFlag where
ppr NoOverlap = empty
\begin{code}
data OccInfo
- = NoOccInfo
+ = NoOccInfo -- Many occurrences, or unknown
+
+ | RulesOnly -- Occurs only in the RHS of one or more rules
| IAmDead -- Marks unused variables. Sometimes useful for
-- lambda and case-bound variables.
- | OneOcc !InsideLam
+ | OneOcc !InsideLam -- Occurs exactly once, not inside a rule
!OneBranch
!InterestingCxt
instance Outputable OccInfo where
-- only used for debugging; never parsed. KSW 1999-07
ppr NoOccInfo = empty
+ ppr RulesOnly = ptext SLIT("RulesOnly")
ppr IAmALoopBreaker = ptext SLIT("LoopBreaker")
ppr IAmDead = ptext SLIT("Dead")
ppr (OneOcc inside_lam one_branch int_cxt)