Define typeRep in terms of new Proxy#
authorAustin Seipp <austin@well-typed.com>
Thu, 26 Sep 2013 06:43:54 +0000 (01:43 -0500)
committerAustin Seipp <austin@well-typed.com>
Fri, 27 Sep 2013 05:16:33 +0000 (00:16 -0500)
Data.Typeable.Internal.Typeable now contains typeRep# - defined over
Proxy# - instead of typeRep, the latter now being a wrapper of the
former.

Authored-by: Edward Kmett <ekmett@gmail.com>
Authored-by: Austin Seipp <austin@well-typed.com>
Signed-off-by: Austin Seipp <austin@well-typed.com>
libraries/base/Data/Typeable.hs
libraries/base/Data/Typeable/Internal.hs

index 355f17b..bacb426 100644 (file)
@@ -7,6 +7,7 @@
            , TypeOperators
            , PolyKinds
            , GADTs
+           , MagicHash
   #-}
 {-# OPTIONS_GHC -funbox-strict-fields #-}
 
@@ -43,7 +44,8 @@ module Data.Typeable
         Proxy (..),
 
         -- * The Typeable class
-        Typeable( typeRep ),
+        Typeable,
+        typeRep,
 
         -- * Propositional equality
         (:=:)(Refl),
index 447b069..517b9a8 100644 (file)
@@ -29,6 +29,7 @@ module Data.Typeable.Internal (
     Fingerprint(..),
     typeOf, typeOf1, typeOf2, typeOf3, typeOf4, typeOf5, typeOf6, typeOf7,
     TyCon(..),
+    typeRep,
     mkTyCon,
     mkTyCon3,
     mkTyConApp,
@@ -190,11 +191,15 @@ tyConString = tyConName
 -- | The class 'Typeable' allows a concrete representation of a type to
 -- be calculated.
 class Typeable a where
-  typeRep :: proxy a -> TypeRep
-  -- ^ Takes a value of type @a@ and returns a concrete representation
-  -- of that type.
-  --
-  -- /Version: 4.7.0.0/
+  typeRep# :: Proxy# a -> TypeRep
+
+--  Takes a value of type @a@ and returns a concrete representation
+-- of that type.
+--
+-- /Version: 4.7.0.0/
+typeRep :: forall proxy a. Typeable a => proxy a -> TypeRep
+typeRep _ = typeRep# (proxy# :: Proxy# a)
+{-# INLINE typeRep #-}
 
 -- Keeping backwards-compatibility
 typeOf :: forall a. Typeable a => a -> TypeRep
@@ -228,8 +233,7 @@ typeOf7 _ = typeRep (Proxy :: Proxy t)
 
 -- | Kind-polymorphic Typeable instance for type application
 instance (Typeable s, Typeable a) => Typeable (s a) where
-  typeRep _ = typeRep (Proxy :: Proxy s) `mkAppTy` typeRep (Proxy :: Proxy a)
-
+  typeRep# _ = typeRep# (proxy# :: Proxy# s) `mkAppTy` typeRep# (proxy# :: Proxy# a)
 
 ----------------- Showing TypeReps --------------------