packages feed

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