{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Barbie.Internal.Dicts
( DictOf(..)
, packDict
, requiringDict
)
where
import Data.Functor.Classes(Show1(..))
data DictOf c f a where
PackedDict :: c (f a) => DictOf c f a
instance Eq (DictOf c f a) where
_ == _ = True
instance Show (DictOf c f a) where
showsPrec _ PackedDict = showString "PackedDict"
instance Show1 (DictOf c f) where
liftShowsPrec _ _ = showsPrec
packDict :: c (f a) => DictOf c f a
packDict = PackedDict
requiringDict :: (c (f a) => r) -> (DictOf c f a -> r)
requiringDict r = \PackedDict -> r