forbidden-fruit-0.1.0: src/Control/Imperative/Hash/Class.hs
-----------------------------------------------------------
-- |
-- Module : Control.Imperative.Hash.Class
-- Copyright : (C) 2015, Yu Fukuzawa
-- License : BSD3
-- Maintainer : minpou.primer@email.com
-- Stability : experimental
-- Portability : portable
--
-----------------------------------------------------------
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Control.Imperative.Hash.Class
( -- * 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
-- | Base class for mutable hashtables.
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
{-# INLINE newSizedHash #-}
unsafeLookupHash h k = fromJust <$> HIO.lookup h k
{-# INLINE unsafeLookupHash #-}
lookupHash = HIO.lookup
{-# INLINE lookupHash #-}
insertHash = HIO.insert
{-# INLINE insertHash #-}
deleteHash = HIO.delete
{-# INLINE deleteHash #-}
fromListHash = HIO.fromList
{-# INLINE fromListHash #-}
toListHash = HIO.toList
{-# INLINE toListHash #-}
instance MHash (ST s) where
type HashEntity (ST s) = HST.HashTable s
newSizedHash = HST.newSized
{-# INLINE newSizedHash #-}
unsafeLookupHash h k = fromJust <$> HST.lookup h k
{-# INLINE unsafeLookupHash #-}
lookupHash = HST.lookup
{-# INLINE lookupHash #-}
insertHash = HST.insert
{-# INLINE insertHash #-}
deleteHash = HST.delete
{-# INLINE deleteHash #-}
fromListHash = HC.fromList
{-# INLINE fromListHash #-}
toListHash = HC.toList
{-# INLINE toListHash #-}