-- | Descriptive type errors for generic representation assertion failures.
--
-- These are potentially useful separately from the asserts, in places where
-- we're unable to perform asserts which evaluate to 'Constraint's e.g. type
-- families, so we expose them neatly here.
module Generic.Data.Rep.Error where
import GHC.TypeError
import GHC.TypeLits ( type Symbol )
-- polymorphic kind keeps us extra useful -- we only use as 'Constraint', but
-- library users may want to use this in type families
type GAssertError :: ka -> Symbol -> k
type GAssertError a msg = TypeError
('Text "Assertion on generic representation failed for type: "
:<>: 'ShowType a
:$$: 'Text "Message: " :<>: 'Text msg)
type GAssertErrorVoid a =
GAssertError a "not non-void type (>=1 constructor)"
type GAssertErrorSum a =
GAssertError a "not non-sum type (1 constructor)"
type GAssertErrorNotSum a =
GAssertError a "not sum type (>=2 constructors)"
type GAssertErrorNotEnum a =
GAssertError a "not enum type (all empty constructors)"