module PIL.Repr.P6Hash (P6Hash, create, prims) where import PIL.Native.Types import PIL.Native.Coerce import PIL.Repr.Internals import Data.Map as Map -- Implement with skip-index later -- just a Seq for now type P6Hash = TVar (Map Native Native) create :: Native -> STM P6Hash create = newTVar . seqToMap prims :: MapOf (P6Hash -> ObjectPrim) prims = mkMap [ ("fetch", _fetch) , ("store", _store) , ("replace", _replace) , ("as_seq", _as_seq) ] _as_seq tvar _ = fmap (toNative . mapToList) (readTVar tvar) _fetch tvar args = fmap (\hv -> (Map.!) hv (_0 args)) (readTVar tvar) _store tvar args = do av <- readTVar tvar writeTVar tvar (Map.insert (fromNative (_0 args)) (_1 args) av) return nil _replace tvar args = do writeTVar tvar (seqToMap $ _0 args) return nil mapToList = foldr (\(x,y) z -> (x:y:z)) [] . Map.toAscList seqToMap = Map.fromList . roll . fromNative roll [] = [] roll [_] = error "odd number of hash elements" roll (k:v:xs) = ((k, v):roll xs)