{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}

module Data.RequireSelector (RequireSelector) where

import GHC.Generics

-- | There are intentionally no members of this class, so that placing
-- it in a context will always cause an error.
class IntentionallyCauseError a

-- | The point of this class is to ensure that you are using data
-- types defined with record selectors (i.e., @data Foo = Foo { unFoo
-- :: Int }@ as opposed to @data Foo = Foo Int@).
--
-- Unfortunately, "GHC.Generics" makes the 'NoSelector' type a member
-- of the 'Selector' class.  Hence, if you want to ensure a type @a@
-- is /not/ 'NoSelector', use the context @(RequireSelector a) =>@.
--
-- If you see a compilation error involving @RequireSelector@ or
-- @IntentionallyCauseError@, it means you failed to define one of
-- your datatypes using record selector syntax.
class RequireSelector a
instance (IntentionallyCauseError NoSelector) => RequireSelector NoSelector
instance RequireSelector a