21 lines
631 B
Haskell
21 lines
631 B
Haskell
|
module Generic where
|
||
|
|
||
|
import GHC.Generics
|
||
|
import ClassyPrelude.Yesod
|
||
|
|
||
|
constrName :: (HasConstructor (Rep a), Generic a)=> a -> String
|
||
|
constrName = genericConstrName . from
|
||
|
|
||
|
class HasConstructor (f :: * -> *) where
|
||
|
genericConstrName :: f x -> String
|
||
|
|
||
|
instance HasConstructor f => HasConstructor (D1 c f) where
|
||
|
genericConstrName (M1 x) = genericConstrName x
|
||
|
|
||
|
instance (HasConstructor x, HasConstructor y) => HasConstructor (x :+: y) where
|
||
|
genericConstrName (L1 l) = genericConstrName l
|
||
|
genericConstrName (R1 r) = genericConstrName r
|
||
|
|
||
|
instance Constructor c => HasConstructor (C1 c f) where
|
||
|
genericConstrName x = conName x
|