{-# LANGUAGE TypeFamilies, RankNTypes,TypeSynonymInstances, MultiParamTypeClasses,FlexibleInstances #-} module Database.Junk.HashTable (HT (..)) where import Control.Monad.Trans (lift) import qualified Data.Hashable as HS (Hashable) import qualified Data.HashTable.Class as H (HashTable) import qualified Data.HashTable.IO as H import Data.Conduit (yield, ($=)) import qualified Data.Conduit.List as C (concatMapM) import Database.KVS newtype HT h k v = HT { unHT :: H.IOHashTable h k v } instance (Eq k, H.HashTable h, HS.Hashable k) => KVS (HT h k v) IO k v where insert = H.insert . unHT accept c k f g = H.lookup (unHT c) k >>= maybe f g delete (HT ht) k = H.delete ht k >> return Nothing instance (Eq k, H.HashTable h, HS.Hashable k) => EnumeratableKVS (HT h k v) IO k v where elemsWithKey (HT c) = yield c $= C.concatMapM (lift . H.toList)