Implement roles into Template Haskell.
authorRichard Eisenberg <eir@cis.upenn.edu>
Fri, 2 Aug 2013 14:52:48 +0000 (15:52 +0100)
committerRichard Eisenberg <eir@cis.upenn.edu>
Fri, 2 Aug 2013 14:52:48 +0000 (15:52 +0100)
The biggest change is to the TyVarBndr type, which now can deal
with role annotations.

libraries/template-haskell/Language/Haskell/TH.hs
libraries/template-haskell/Language/Haskell/TH/Lib.hs
libraries/template-haskell/Language/Haskell/TH/Ppr.hs
libraries/template-haskell/Language/Haskell/TH/Syntax.hs

index 066086e..5064b6a 100644 (file)
@@ -59,7 +59,7 @@ module Language.Haskell.TH(
     -- ** Patterns
         Pat(..), FieldExp, FieldPat,
     -- ** Types
-        Type(..), TyVarBndr(..), TyLit(..), Kind, Cxt, Pred(..),
+        Type(..), TyVarBndr(..), TyLit(..), Kind, Cxt, Pred(..), Role(..),
 
     -- * Library functions
     -- ** Abbreviations
index e29463b..346d872 100644 (file)
@@ -566,6 +566,12 @@ plainTV = PlainTV
 kindedTV :: Name -> Kind -> TyVarBndr
 kindedTV = KindedTV
 
+roledTV :: Name -> Role -> TyVarBndr
+roledTV = RoledTV
+
+kindedRoledTV :: Name -> Kind -> Role -> TyVarBndr
+kindedRoledTV = KindedRoledTV
+
 varK :: Name -> Kind
 varK = VarT
 
@@ -591,6 +597,14 @@ constraintK :: Kind
 constraintK = ConstraintT
 
 -------------------------------------------------------------------------------
+-- *   Role
+
+nominal, representational, phantom :: Role
+nominal = Nominal
+representational = Representational
+phantom = Phantom
+
+-------------------------------------------------------------------------------
 -- *   Callconv
 
 cCall, stdCall :: Callconv
index 8bd3b84..4096d9e 100644 (file)
@@ -485,6 +485,14 @@ instance Ppr TyLit where
 instance Ppr TyVarBndr where
     ppr (PlainTV nm)    = ppr nm
     ppr (KindedTV nm k) = parens (ppr nm <+> text "::" <+> ppr k)
+    ppr (RoledTV nm r)  = ppr nm <> text "@" <> ppr r
+    ppr (KindedRoledTV nm k r)
+      = parens (ppr nm <+> text "::" <+> ppr k) <> text "@" <> ppr r
+
+instance Ppr Role where
+    ppr Nominal          = text "N"
+    ppr Representational = text "R"
+    ppr Phantom          = text "P"
 
 ------------------------------
 pprCxt :: Cxt -> Doc
index 9d6ae93..2995b58 100644 (file)
@@ -1258,12 +1258,20 @@ data Type = ForallT [TyVarBndr] Cxt Type  -- ^ @forall \<vars\>. \<ctxt\> -> \<t
 
 data TyVarBndr = PlainTV  Name            -- ^ @a@
                | KindedTV Name Kind       -- ^ @(a :: k)@
+               | RoledTV  Name Role       -- ^ @a\@R@
+               | KindedRoledTV Name Kind Role -- ^ @(a :: k)\@R@
       deriving( Show, Eq, Data, Typeable )
 
 data TyLit = NumTyLit Integer             -- ^ @2@
            | StrTyLit String              -- ^ @"Hello"@
   deriving ( Show, Eq, Data, Typeable )
 
+-- | Role annotations
+data Role = Nominal            -- ^ @N@
+          | Representational   -- ^ @R@
+          | Phantom            -- ^ @P@
+  deriving( Show, Eq, Data, Typeable )
+
 -- | To avoid duplication between kinds and types, they
 -- are defined to be the same. Naturally, you would never
 -- have a type be 'StarT' and you would never have a kind