{-# 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) pack = u2b > C.pack unpack = C.unpack > b2u cache_file = G.cache_uri set k v = TC.runTCM $ putsample cache_file [(k.pack, v.pack)] get k = do v <- TC.runTCM $ getsample cache_file (k.pack) return $ v ^ unpack 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 String) -> (a -> IO String) -> a -> (IO String) 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