Implement sameConstructor
authorGabor Greif <ggreif@gmail.com>
Tue, 2 Sep 2014 10:44:09 +0000 (12:44 +0200)
committerGabor Greif <ggreif@gmail.com>
Fri, 19 Sep 2014 01:38:42 +0000 (03:38 +0200)
libraries/base/GHC/Generics.hs

index c8a69d6..3d75c68 100644 (file)
@@ -557,7 +557,7 @@ module GHC.Generics  (
   , Fixity(..), Associativity(..), Arity(..), prec
 
   -- * Propositional equality for meta-information
-  , sameDatatype
+  , sameDatatype, sameConstructor
 
   -- * Generic type classes
   , Generic(..), Generic1(..)
@@ -694,6 +694,19 @@ class Constructor c where
   conIsRecord :: t c (f :: * -> *) a -> Bool
   conIsRecord _ = False
 
+-- | Propositional equality predicate for constructors
+sameConstructor :: (Datatype l, Datatype r, Constructor (cl l), Constructor (cr r))
+                => Proxy (cl l) -> Proxy (cr r) -> Maybe (cl l :~: cr r)
+sameConstructor l r | Just Refl <- pd l ` sameDatatype` pd r
+                    , True <- conName cl == conName cr
+                    = Just (unsafeCoerce Refl)
+    where pd :: Proxy (cm m) -> Proxy m
+          pd Proxy = Proxy
+          dummyC :: Proxy (cm m) -> C1 (cm m) a p
+          dummyC Proxy = undefined
+          cl = dummyC l
+          cr = dummyC r
+
 
 -- | Datatype to represent the arity of a tuple.
 data Arity = NoArity | Arity Int