hset-2.0.0: src/Data/HSet/Get.hs
module Data.HSet.Get
( HGet(..)
, HGettable
) where
import Data.HSet.Type
import Data.HSet.TypeLevel
#if !(MIN_VERSION_base(4, 8, 0))
import Control.Applicative
#endif
{- | Heterogeneous read arbitrarily element from hset
>>> let x = HSCons (10 :: Int) $ HSCons (20 :: Double) HSNil
>>> x
HSCons (10) (HSCons (20.0) (HSNil))
>>> hget x :: Int
10
>>> hget x :: Double
20.0
Note that 'hget' takes specific element from list of uniquely typed
elements depending on what type is required to be returned (return
type polymorphism)
-}
class (i ~ (Index e els)) => HGet els e i | els i -> e where
-- | Gets any data from HSet for you
hget :: HSet els -> e
instance HGet (e ': els) e 'Z where
hget (HSCons e _) = e
instance (('S i) ~ (Index e (e1 ': els)), HGet els e i)
=> HGet (e1 ': els) e ('S i) where
hget (HSCons _ els) = hget els
-- | Enables deriving of the fact that 'e' is contained within 'els' and it's
-- safe to say that 'hget' can be performed on this particular pair.
type HGettable els e = HGet els e (Index e els)