1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module TCReader where
import Database.TokyoCabinet.Storable
import Control.Monad
import Control.Monad.Reader
import Database.TokyoCabinet
(
TCM
, TCDB
, HDB
, BDB
, FDB
, new
, runTCM
, OpenMode(..)
)
import qualified Database.TokyoCabinet as TC
newtype TCReader tc a =
TCReader { runTCR :: ReaderT tc TCM a } deriving (Monad, MonadReader tc)
runTCReader :: TCReader tc a -> tc -> TCM a
runTCReader = runReaderT . runTCR
open :: (TCDB tc) => String -> [OpenMode] -> TCReader tc Bool
open name mode = do tc <- ask
TCReader $ lift (TC.open tc name mode)
close :: (TCDB tc) => TCReader tc Bool
close = ask >>= (TCReader . lift . TC.close)
get :: (Storable k, Storable v, TCDB tc) => k -> TCReader tc (Maybe v)
get key = do tc <- ask
TCReader $ lift (TC.get tc key)
put :: (Storable k, Storable v, TCDB tc) => k -> v -> TCReader tc Bool
put key val = do tc <- ask
TCReader $ lift (TC.put tc key val)
kvstore :: (Storable k, Storable v, TCDB tc) => [(k, v)] -> TCReader tc Bool
kvstore kv = do open "abcd.tch" [OWRITER, OCREAT]
mapM_ (uncurry put) kv
close
main :: IO ()
main = runTCM $ do h <- new :: TCM HDB
let kv =[ ("foo", 112)
, ("bar", 200)
, ("baz", 300) ] :: [(String, Int)]
runTCReader (kvstore kv) h >> return ()
|