singlethongs-0.1: lib/Singlethongs/Internal.hs
{-# LANGUAGE GADTs, KindSignatures, PolyKinds, TypeFamilies, RankNTypes #-}
module Singlethongs.Internal
( Sing
, SingI(sing)
, SomeSing(SomeSing)
, withSomeSing
, SingKind(Demote, fromSing, toSing)
) where
data family Sing (a :: k)
class SingI (a :: k) where
sing :: Sing a
data SomeSing k where
SomeSing :: Sing (a :: k) -> SomeSing k
withSomeSing :: SingKind k => Demote k -> (forall (a :: k). Sing a -> r) -> r
withSomeSing x f = case toSing x of SomeSing x' -> f x'
{-# INLINE withSomeSing #-}
class SingKind k where
type Demote k :: *
fromSing :: Sing (a :: k) -> Demote k
toSing :: Demote k -> SomeSing k