class (Typeable a) => PairClass a where
pair_iType :: a -> Type
pair_iType = const $ mkType "Pair"
pair_fetch :: a -> Eval VPair
pair_fetch pv = do
key <- pair_fetchKey pv
val <- pair_fetchVal pv
return (key, val)
pair_fetchKey :: a -> Eval VScalar
pair_fetchVal :: a -> Eval VScalar
pair_fetchVal pv = do
readIVar =<< pair_fetchElem pv
pair_storeVal :: a -> Val -> Eval ()
pair_storeVal pv val = do
sv <- pair_fetchElem pv
writeIVar sv val
pair_fetchElem :: a -> Eval (IVar VScalar)
pair_fetchElem pv = do
return $ proxyScalar (pair_fetchVal pv) (pair_storeVal pv)
instance PairClass VPair where
pair_fetchKey = return . fst
pair_fetchVal = return . snd
pair_storeVal pv val = do
ref <- fromVal (snd pv)
writeRef ref val
pair_fetch pv = do
key <- pair_fetchKey pv
val <- pair_fetchVal pv
return (key, val)
pair_fetchElem pv = do
return $ proxyScalar (pair_fetchVal pv) (pair_storeVal pv)
instance PairClass IPairHashSlice where
pair_iType = const $ mkType "Pair::HashSlice"
pair_fetchKey = return . VStr . fst
pair_fetchElem = return . snd