Make recursion and RULES interact better
[ghc-hetmet.git] / compiler / basicTypes / BasicTypes.lhs
index ab6d463..e6e3a90 100644 (file)
@@ -109,24 +109,18 @@ The @IPName@ type is here because it is used in TypeRep (i.e. very
 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}
 
 
@@ -295,6 +289,7 @@ data OverlapFlag
                -- 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
@@ -370,12 +365,14 @@ defn of OccInfo here, safely at the bottom
 
 \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
 
@@ -427,6 +424,7 @@ isFragileOcc other      = False
 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)