Spelling fixes in comments [ci skip]
[ghc.git] / compiler / basicTypes / PatSyn.hs
index b54a11d..823c838 100644 (file)
@@ -5,7 +5,7 @@
 \section[PatSyn]{@PatSyn@: Pattern synonyms}
 -}
 
-{-# LANGUAGE CPP, DeriveDataTypeable #-}
+{-# LANGUAGE CPP #-}
 
 module PatSyn (
         -- * Main data types
@@ -15,7 +15,7 @@ module PatSyn (
         patSynName, patSynArity, patSynIsInfix,
         patSynArgs,
         patSynMatcher, patSynBuilder,
-        patSynUnivTyBinders, patSynExTyVars, patSynExTyBinders, patSynSig,
+        patSynUnivTyVarBinders, patSynExTyVars, patSynExTyVarBinders, patSynSig,
         patSynInstArgTys, patSynInstResTy, patSynFieldLabels,
         patSynFieldType,
 
@@ -34,7 +34,6 @@ import Var
 import FieldLabel
 
 import qualified Data.Data as Data
-import qualified Data.Typeable
 import Data.Function
 import Data.List
 
@@ -46,9 +45,10 @@ import Data.List
 ************************************************************************
 -}
 
--- | A pattern synonym
+-- | Pattern Synonym
+--
 -- See Note [Pattern synonym representation]
--- See Note [Pattern synonym signatures]
+-- See Note [Pattern synonym signature contexts]
 data PatSyn
   = MkPatSyn {
         psName        :: Name,
@@ -64,15 +64,13 @@ data PatSyn
                                        -- psArgs
 
         -- Universially-quantified type variables
-        psUnivTyVars    :: [TyVar],    -- Two linked fields; see DataCon
-        psUnivTyBinders :: [TyBinder], -- Note [TyBinders in DataCons]
+        psUnivTyVars  :: [TyVarBinder],
 
         -- Required dictionaries (may mention psUnivTyVars)
         psReqTheta    :: ThetaType,
 
         -- Existentially-quantified type vars
-        psExTyVars    :: [TyVar],      -- Two linked fields; see DataCon
-        psExTyBinders :: [TyBinder],   -- Note [TyBinders in DataCons]
+        psExTyVars    :: [TyVarBinder],
 
         -- Provided dictionaries (may mention psUnivTyVars or psExTyVars)
         psProvTheta   :: ThetaType,
@@ -108,9 +106,8 @@ data PatSyn
              --                       =>  arg_tys -> res_ty
              -- See Note [Builder for pattern synonyms with unboxed type]
   }
-  deriving Data.Typeable.Typeable
 
-{- Note [Pattern synonym signatures]
+{- Note [Pattern synonym signature contexts]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 In a pattern synonym signature we write
    pattern P :: req => prov => t1 -> ... tn -> res_ty
@@ -245,7 +242,7 @@ This means that when typechecking an occurrence of P in an expression,
 we must remember that the builder has this void argument. This is
 done by TcPatSyn.patSynBuilderOcc.
 
-Note [Patterns synonyms and the data type Type]
+Note [Pattern synonyms and the data type Type]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 The type of a pattern synonym is of the form (See Note
 [Pattern synonym signatures]):
@@ -272,13 +269,6 @@ instance Eq PatSyn where
     (==) = (==) `on` getUnique
     (/=) = (/=) `on` getUnique
 
-instance Ord PatSyn where
-    (<=) = (<=) `on` getUnique
-    (<) = (<) `on` getUnique
-    (>=) = (>=) `on` getUnique
-    (>) = (>) `on` getUnique
-    compare = compare `on` getUnique
-
 instance Uniquable PatSyn where
     getUnique = psUnique
 
@@ -309,11 +299,9 @@ instance Data.Data PatSyn where
 -- | Build a new pattern synonym
 mkPatSyn :: Name
          -> Bool                 -- ^ Is the pattern synonym declared infix?
-         -> ([TyVar], [TyBinder], ThetaType)
-                                 -- ^ Universially-quantified type variables
+         -> ([TyVarBinder], ThetaType) -- ^ Universially-quantified type variables
                                  --   and required dicts
-         -> ([TyVar], [TyBinder], ThetaType)
-                                 -- ^ Existentially-quantified type variables
+         -> ([TyVarBinder], ThetaType) -- ^ Existentially-quantified type variables
                                  --   and provided dicts
          -> [Type]               -- ^ Original arguments
          -> Type                 -- ^ Original result type
@@ -325,14 +313,14 @@ mkPatSyn :: Name
  -- NB: The univ and ex vars are both in TyBinder form and TyVar form for
  -- convenience. All the TyBinders should be Named!
 mkPatSyn name declared_infix
-         (univ_tvs, univ_bndrs, req_theta)
-         (ex_tvs, ex_bndrs, prov_theta)
+         (univ_tvs, req_theta)
+         (ex_tvs, prov_theta)
          orig_args
          orig_res_ty
          matcher builder field_labels
     = MkPatSyn {psName = name, psUnique = getUnique name,
-                psUnivTyVars = univ_tvs, psUnivTyBinders = univ_bndrs,
-                psExTyVars = ex_tvs, psExTyBinders = ex_bndrs,
+                psUnivTyVars = univ_tvs,
+                psExTyVars = ex_tvs,
                 psProvTheta = prov_theta, psReqTheta = req_theta,
                 psInfix = declared_infix,
                 psArgs = orig_args,
@@ -368,20 +356,20 @@ patSynFieldType ps label
       Just (_, ty) -> ty
       Nothing -> pprPanic "dataConFieldType" (ppr ps <+> ppr label)
 
-patSynUnivTyBinders :: PatSyn -> [TyBinder]
-patSynUnivTyBinders = psUnivTyBinders
+patSynUnivTyVarBinders :: PatSyn -> [TyVarBinder]
+patSynUnivTyVarBinders = psUnivTyVars
 
 patSynExTyVars :: PatSyn -> [TyVar]
-patSynExTyVars = psExTyVars
+patSynExTyVars ps = binderVars (psExTyVars ps)
 
-patSynExTyBinders :: PatSyn -> [TyBinder]
-patSynExTyBinders = psExTyBinders
+patSynExTyVarBinders :: PatSyn -> [TyVarBinder]
+patSynExTyVarBinders = psExTyVars
 
 patSynSig :: PatSyn -> ([TyVar], ThetaType, [TyVar], ThetaType, [Type], Type)
 patSynSig (MkPatSyn { psUnivTyVars = univ_tvs, psExTyVars = ex_tvs
                     , psProvTheta = prov, psReqTheta = req
                     , psArgs = arg_tys, psOrigResTy = res_ty })
-  = (univ_tvs, req, ex_tvs, prov, arg_tys, res_ty)
+  = (binderVars univ_tvs, req, binderVars ex_tvs, prov, arg_tys, res_ty)
 
 patSynMatcher :: PatSyn -> (Id,Bool)
 patSynMatcher = psMatcher
@@ -410,7 +398,7 @@ patSynInstArgTys (MkPatSyn { psName = name, psUnivTyVars = univ_tvs
           , text "patSynInstArgTys" <+> ppr name $$ ppr tyvars $$ ppr inst_tys )
     map (substTyWith tyvars inst_tys) arg_tys
   where
-    tyvars = univ_tvs ++ ex_tvs
+    tyvars = binderVars (univ_tvs ++ ex_tvs)
 
 patSynInstResTy :: PatSyn -> [Type] -> Type
 -- Return the type of whole pattern
@@ -423,19 +411,19 @@ patSynInstResTy (MkPatSyn { psName = name, psUnivTyVars = univ_tvs
                 inst_tys
   = ASSERT2( length univ_tvs == length inst_tys
            , text "patSynInstResTy" <+> ppr name $$ ppr univ_tvs $$ ppr inst_tys )
-    substTyWith univ_tvs inst_tys res_ty
+    substTyWith (binderVars univ_tvs) inst_tys res_ty
 
 -- | Print the type of a pattern synonym. The foralls are printed explicitly
 pprPatSynType :: PatSyn -> SDoc
 pprPatSynType (MkPatSyn { psUnivTyVars = univ_tvs,  psReqTheta  = req_theta
                         , psExTyVars   = ex_tvs,    psProvTheta = prov_theta
                         , psArgs       = orig_args, psOrigResTy = orig_res_ty })
-  = sep [ pprForAllImplicit univ_tvs
+  = sep [ pprForAll univ_tvs
         , pprThetaArrowTy req_theta
         , ppWhen insert_empty_ctxt $ parens empty <+> darrow
         , pprType sigma_ty ]
   where
-    sigma_ty = mkForAllTys (mkNamedBinders Specified ex_tvs) $
+    sigma_ty = mkForAllTys ex_tvs  $
                mkFunTys prov_theta $
                mkFunTys orig_args orig_res_ty
     insert_empty_ctxt = null req_theta && not (null prov_theta && null ex_tvs)