packages feed

bamboo-2009.5.23: src/Bamboo/Type/Cache.hs

{-# LANGUAGE NoImplicitPrelude #-}
module Bamboo.Type.Cache (cache, cache'') where

import Bamboo.Helper.Env hiding (body, name, get)
import qualified Bamboo.Config.Global as G

import qualified Data.ByteString.Char8 as C
import qualified Database.TokyoCabinet as TC
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Lazy.Char8 as L
import qualified Data.ByteString.Char8 as S
    
cache_file = G.cache_uri

set k v = TC.runTCM $ putsample cache_file [(k.l2s, v.l2s)]
get k = do
  v <- TC.runTCM $ getsample cache_file (k.l2s)
  return $ v ^ s2l

cache g f x =
  if G.use_cache 
    then cache' g f x
    else f x

cache'' _ f x = f x

-- etag generator -> value function -> model -> value
cache' :: (a -> IO L.ByteString) -> (a -> IO L.ByteString) -> a -> (IO L.ByteString)
cache' g f x = do
  k <- g x
  c <- get k
  case c of 
    Nothing -> do
      v <- f x
      set k v
      return v
    Just v -> do
      -- putStrLn $ "Cached: " ++ (v.take 20.u2b)
      return v


putsample :: String -> [(ByteString, ByteString)] -> TC.TCM Bool
putsample file kv =
    do tc <- TC.new :: TC.TCM TC.HDB -- alternatively you can use BDB or FDB
       TC.open tc file [TC.OWRITER, TC.OCREAT]
       mapM (uncurry $ TC.put tc) kv
       TC.close tc

getsample :: String -> ByteString -> TC.TCM (Maybe ByteString)
getsample file key =
    do tc <- TC.new :: TC.TCM TC.HDB -- alternatively you can use BDB or FDB
       TC.open tc file [TC.OREADER]
       val <- TC.get tc key
       TC.close tc
       return val