summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Hakyll/Core/Provider/MetadataCache.hs10
-rw-r--r--src/Hakyll/Core/Store.hs21
-rw-r--r--tests/Hakyll/Core/Store/Tests.hs16
3 files changed, 40 insertions, 7 deletions
diff --git a/src/Hakyll/Core/Provider/MetadataCache.hs b/src/Hakyll/Core/Provider/MetadataCache.hs
index 077bad2..031960c 100644
--- a/src/Hakyll/Core/Provider/MetadataCache.hs
+++ b/src/Hakyll/Core/Provider/MetadataCache.hs
@@ -8,7 +8,7 @@ module Hakyll.Core.Provider.MetadataCache
--------------------------------------------------------------------------------
import qualified Data.Map as M
-
+import Control.Monad (unless)
--------------------------------------------------------------------------------
import Hakyll.Core.Identifier
@@ -49,12 +49,8 @@ resourceInvalidateMetadataCache p r = do
--------------------------------------------------------------------------------
load :: Provider -> Identifier -> IO ()
load p r = do
- mmd <- Store.get store mdk :: IO (Store.Result Metadata)
- case mmd of
- -- Already loaded
- Store.Found _ -> return ()
- -- Not yet loaded
- _ -> do
+ mmof <- Store.isMember store mdk
+ unless mmof $ do
(md, body) <- loadMetadata p r
Store.set store mdk md
Store.set store bk body
diff --git a/src/Hakyll/Core/Store.hs b/src/Hakyll/Core/Store.hs
index 1208c84..b2c61a0 100644
--- a/src/Hakyll/Core/Store.hs
+++ b/src/Hakyll/Core/Store.hs
@@ -9,6 +9,7 @@ module Hakyll.Core.Store
, new
, set
, get
+ , isMember
, delete
, hash
) where
@@ -101,6 +102,16 @@ cacheLookup (Store _ (Just lru)) key = do
--------------------------------------------------------------------------------
+cacheIsMember :: Store -> String -> IO Bool
+cacheIsMember (Store _ Nothing) _ = return False
+cacheIsMember (Store _ (Just lru)) key = do
+ res <- Lru.lookup key lru
+ case res of
+ Nothing -> return False
+ _ -> return True
+
+
+--------------------------------------------------------------------------------
-- | Auxiliary: delete an item from the in-memory cache
cacheDelete :: Store -> String -> IO ()
cacheDelete (Store _ Nothing) _ = return ()
@@ -152,6 +163,16 @@ get store identifier = do
--------------------------------------------------------------------------------
+-- | Strict function
+isMember :: Store -> [String] -> IO Bool
+isMember store identifier = do
+ inCache <- cacheIsMember store key
+ if inCache then return True else doesFileExist path
+ where
+ key = hash identifier
+ path = storeDirectory store </> key
+
+--------------------------------------------------------------------------------
-- | Delete an item
delete :: Store -> [String] -> IO ()
delete store identifier = do
diff --git a/tests/Hakyll/Core/Store/Tests.hs b/tests/Hakyll/Core/Store/Tests.hs
index 95140e3..389d7fd 100644
--- a/tests/Hakyll/Core/Store/Tests.hs
+++ b/tests/Hakyll/Core/Store/Tests.hs
@@ -26,6 +26,7 @@ tests = testGroup "Hakyll.Core.Store.Tests"
[ testProperty "simple get . set" simpleSetGet
, testProperty "persistent get . set" persistentSetGet
, testCase "WrongType get . set" wrongType
+ , testCase "isMembertest . set" isMembertest
]
@@ -68,3 +69,18 @@ wrongType = do
t == typeOf (undefined :: String)
_ -> False
cleanTestEnv
+
+
+--------------------------------------------------------------------------------
+
+isMembertest :: H.Assertion
+isMembertest = do
+ store <- newTestStore
+ Store.set store ["foo", "bar"] ("qux" :: String)
+ --value <- Store.get store ["foo", "bar"] :: IO (Store.Result Int)
+ good <- Store.isMember store ["foo", "bar"]
+
+ bad <- Store.isMember store ["foo", "baz"]
+ H.assert good
+ H.assert (not bad)
+ cleanTestEnv \ No newline at end of file