module Control.Imperative.Hash.Class
(
MHash(..)
, HashKey
) where
import Control.Applicative
import Control.Monad.ST
import Data.Hashable
import qualified Data.HashTable.Class as HC
import qualified Data.HashTable.IO as HIO
import qualified Data.HashTable.ST.Basic as HST
import Data.Maybe
class (Eq k, Hashable k) => HashKey k
instance (Eq k, Hashable k) => HashKey k
class Monad m => MHash m where
type HashEntity m :: * -> * -> *
newSizedHash :: Int -> m (HashEntity m k v)
unsafeLookupHash :: HashKey k => HashEntity m k v -> k -> m v
lookupHash :: HashKey k => HashEntity m k v -> k -> m (Maybe v)
insertHash :: HashKey k => HashEntity m k v -> k -> v -> m ()
deleteHash :: HashKey k => HashEntity m k v -> k -> m ()
fromListHash :: HashKey k => [(k, v)] -> m (HashEntity m k v)
toListHash :: HashKey k => HashEntity m k v -> m [(k, v)]
instance MHash IO where
type HashEntity IO = HST.HashTable RealWorld
newSizedHash = HIO.newSized
unsafeLookupHash h k = fromJust <$> HIO.lookup h k
lookupHash = HIO.lookup
insertHash = HIO.insert
deleteHash = HIO.delete
fromListHash = HIO.fromList
toListHash = HIO.toList
instance MHash (ST s) where
type HashEntity (ST s) = HST.HashTable s
newSizedHash = HST.newSized
unsafeLookupHash h k = fromJust <$> HST.lookup h k
lookupHash = HST.lookup
insertHash = HST.insert
deleteHash = HST.delete
fromListHash = HC.fromList
toListHash = HC.toList