@@ -17,8 +17,11 @@ module Hakyll.Core.Resource.Provider
1717 , resourceModified
1818 ) where
1919
20+import Control.Concurrent (MVar, readMVar, modifyMVar_)
2021import Control.Monad ((<=<))
2122import Data.Word (Word8)
23+import Data.Map (Map)
24+import qualified Data.Map as M
2225
2326import qualified Data.ByteString.Lazy as LB
2427import OpenSSL.Digest.ByteString.Lazy (digest)
@@ -37,6 +40,8 @@ data ResourceProvider = ResourceProvider
3740 resourceString :: Resource -> IO String
3841 , -- | Retrieve a certain resource as lazy bytestring
3942 resourceLazyByteString :: Resource -> IO LB.ByteString
43+ , -- | Cache keeping track of modified items
44+ resourceModifiedCache :: MVar (Map Resource Bool)
4045 }
4146
4247-- | Check if a given identifier has a resource
@@ -53,6 +58,24 @@ resourceDigest provider = digest MD5 <=< resourceLazyByteString provider
5358--
5459resourceModified :: ResourceProvider -> Resource -> Store -> IO Bool
5560resourceModified provider resource store = do
61+ cache <- readMVar mvar
62+ case M.lookup resource cache of
63+ -- Already in the cache
64+ Just m -> return m
65+ -- Not yet in the cache, check digests (if it exists)
66+ Nothing -> do
67+ m <- if resourceExists provider (unResource resource)
68+ then digestModified provider resource store
69+ else return False
70+ modifyMVar_ mvar (return . M.insert resource m)
71+ return m
72+ where
73+ mvar = resourceModifiedCache provider
74+
75+-- | Check if a resource digest was modified
76+--
77+digestModified :: ResourceProvider -> Resource -> Store -> IO Bool
78+digestModified provider resource store = do
5679 -- Get the latest seen digest from the store
5780 lastDigest <- storeGet store itemName $ unResource resource
5881 -- Calculate the digest for the resource
@@ -65,4 +88,4 @@ resourceModified provider resource store = do
6588 else do storeSet store itemName (unResource resource) newDigest
6689 return True
6790 where
68− itemName = "Hakyll.Core.ResourceProvider.resourceModified"
91+ itemName = "Hakyll.Core.ResourceProvider.digestModified"