packages feed

calamity-0.1.9.4: src/Calamity/Internal/ConstructorName.hs

-- | Get the constructor name of something
module Calamity.Internal.ConstructorName
    ( CtorName(..)
    , GCtorName(..) ) where

import           GHC.Generics

class GCtorName f where
  gctorName :: f a -> String

instance Constructor c => GCtorName (C1 c f) where
  gctorName = conName

instance GCtorName f => GCtorName (D1 d f) where
  gctorName (M1 a) = gctorName a

instance (GCtorName f, GCtorName g) => GCtorName (f :+: g) where
  gctorName (L1 a) = gctorName a
  gctorName (R1 a) = gctorName a

class CtorName a where
  ctorName :: a -> String
  default ctorName :: (Generic a, GCtorName (Rep a)) => a -> String
  ctorName = gctorName . from