module Data.Singletons.Exports (
KindIs(..), Sing, SingI(..), SingE(..), SingRep, KindOf, Demote,
SingInstance(..), SingKind(..), If, Head, Tail
) where
#if __GLASGOW_HASKELL__ >= 707
import GHC.TypeLits ( KindIs(..), Sing, SingI(..), SingE(..),
SingRep, KindOf, Demote )
#else
data KindIs (k :: *) = KindParam
type KindOf (a :: k) = (KindParam :: KindIs k)
data family Sing (a :: k)
class SingI (a :: k) where
sing :: Sing a
class (kparam ~ KindParam) => SingE (kparam :: KindIs k) where
type DemoteRep kparam :: *
fromSing :: Sing (a :: k) -> DemoteRep kparam
class (SingI a, SingE (KindOf a)) => SingRep (a :: k)
instance (SingI a, SingE (KindOf a)) => SingRep (a :: k)
type Demote (a :: k) = DemoteRep (KindParam :: KindIs k)
#endif
data SingInstance (a :: k) where
SingInstance :: SingRep a => SingInstance a
class (kparam ~ KindParam) => SingKind (kparam :: KindIs k) where
singInstance :: forall (a :: k). Sing a -> SingInstance a
type family If (a :: Bool) (b :: k) (c :: k) :: k
type instance If 'True b c = b
type instance If 'False b c = c
type family Head (a :: [k]) :: k
type instance Head (h ': t) = h
type family Tail (a :: [k]) :: [k]
type instance Tail (h ': t) = t