File: TCReader.hs

package info (click to toggle)
tokyocabinet-haskell 0.0.5-5
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 308 kB
  • sloc: haskell: 2,276; makefile: 3
file content (53 lines) | stat: -rw-r--r-- 1,495 bytes parent folder | download | duplicates (3)
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 ()