module Data.HSet.SubHSet
( SubHSet(..)
, SubHSettable
, hnarrow
, hgetTagged
) where
import Data.HSet.Get
import Data.HSet.Type
import Data.HSet.TypeLevel
import Data.Tagged
#if !(MIN_VERSION_base(4, 8, 0))
import Control.Applicative
#endif
class (eq ~ TEq els els2)
=> SubHSet els els2 eq where
subHSet :: HSet els -> HSet els2
instance (eq ~ TEq els '[]) => SubHSet els '[] eq where
subHSet _ = HSNil
instance ( HGettable els el, 'False ~ Elem el els2
, SubHSet els els2 subeq
, 'False ~ TEq els (el ': els2) )
=> SubHSet els (el ': els2) 'False where
subHSet h = HSCons (hget h :: el) (subHSet h :: HSet els2)
instance ( HGettable els el, 'False ~ Elem el els2
, SubHSet els els2 subeq
, els ~ (el ': els2)
, 'True ~ TEq els (el ': els2) )
=> SubHSet els (el ': els2) 'True where
subHSet h = h
type SubHSettable els1 els2 = (SubHSet els1 els2 (TEq els1 els2))
hnarrow :: (SubHSettable els subels)
=> proxy subels -> HSet els -> HSet subels
hnarrow _ = subHSet
hgetTagged :: forall proxy label e els
. (HGettable els (Tagged label e))
=> proxy label
-> HSet els
-> e
hgetTagged _ hset =
let x = hget hset
in unTagged (x :: Tagged label e)