module Data.Graph.Dynamic.Internal.HashTable
( HashTable
, new
, insert
, delete
, lookup
, toList
) where
import Control.Monad.Primitive (PrimMonad (..), stToPrim)
import Data.Hashable (Hashable)
import qualified Data.HashTable.ST.Cuckoo as Cuckoo
import Prelude hiding (lookup)
type HashTable s k v = Cuckoo.HashTable s k v
new :: PrimMonad m => m (HashTable (PrimState m) k v)
new = stToPrim Cuckoo.new
{-# INLINE new #-}
insert
:: (Eq k, Hashable k, PrimMonad m)
=> HashTable (PrimState m) k v -> k -> v -> m ()
insert ht k v = stToPrim (Cuckoo.insert ht k v)
{-# INLINE insert #-}
delete
:: (Eq k, Hashable k, PrimMonad m)
=> HashTable (PrimState m) k v -> k -> m ()
delete ht k = stToPrim (Cuckoo.delete ht k)
{-# INLINE delete #-}
lookup
:: (Eq k, Hashable k, PrimMonad m)
=> HashTable (PrimState m) k v -> k -> m (Maybe v)
lookup ht k = stToPrim (Cuckoo.lookup ht k)
{-# INLINE lookup #-}
toList
:: PrimMonad m
=> HashTable (PrimState m) k v -> m [(k, v)]
toList ht = stToPrim $ Cuckoo.foldM (\acc kv -> return (kv : acc)) [] ht