{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Test.Util.SOP
( constrName
, constrNames
) where
import Data.Proxy
import Generics.SOP qualified as SOP
constrInfo ::
SOP.HasDatatypeInfo a =>
proxy a ->
SOP.NP SOP.ConstructorInfo (SOP.Code a)
constrInfo = SOP.constructorInfo . SOP.datatypeInfo
constrName :: forall a. SOP.HasDatatypeInfo a => a -> String
constrName a =
SOP.hcollapse $ SOP.hliftA2 go (constrInfo p) (SOP.unSOP (SOP.from a))
where
go :: SOP.ConstructorInfo b -> SOP.NP SOP.I b -> SOP.K String b
go nfo _ = SOP.K $ SOP.constructorName nfo
p = Proxy @a
constrNames :: SOP.HasDatatypeInfo a => proxy a -> [String]
constrNames p =
SOP.hcollapse $ SOP.hmap go (constrInfo p)
where
go :: SOP.ConstructorInfo a -> SOP.K String a
go nfo = SOP.K $ SOP.constructorName nfo