summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/ResourceProvider/MetadataCache.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hakyll/Core/ResourceProvider/MetadataCache.hs')
-rw-r--r--src/Hakyll/Core/ResourceProvider/MetadataCache.hs62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/Hakyll/Core/ResourceProvider/MetadataCache.hs b/src/Hakyll/Core/ResourceProvider/MetadataCache.hs
new file mode 100644
index 0000000..85062a0
--- /dev/null
+++ b/src/Hakyll/Core/ResourceProvider/MetadataCache.hs
@@ -0,0 +1,62 @@
+--------------------------------------------------------------------------------
+module Hakyll.Core.ResourceProvider.MetadataCache
+ ( resourceMetadata
+ , resourceBody
+ , resourceInvalidateMetadataCache
+ ) where
+
+
+--------------------------------------------------------------------------------
+import Hakyll.Core.Identifier
+import Hakyll.Core.Metadata
+import Hakyll.Core.ResourceProvider.Internal
+import Hakyll.Core.ResourceProvider.Metadata
+import qualified Hakyll.Core.Store as Store
+
+
+--------------------------------------------------------------------------------
+resourceMetadata :: ResourceProvider -> Identifier a -> IO Metadata
+resourceMetadata rp r = do
+ load rp r
+ Store.Found md <- Store.get (resourceStore rp)
+ [name, toFilePath r, "metadata"]
+ return md
+
+
+--------------------------------------------------------------------------------
+resourceBody :: ResourceProvider -> Identifier a -> IO String
+resourceBody rp r = do
+ load rp r
+ Store.Found bd <- Store.get (resourceStore rp)
+ [name, toFilePath r, "body"]
+ maybe (resourceString r) return bd
+
+
+--------------------------------------------------------------------------------
+resourceInvalidateMetadataCache :: ResourceProvider -> Identifier a -> IO ()
+resourceInvalidateMetadataCache rp r = do
+ Store.delete (resourceStore rp) [name, toFilePath r, "metadata"]
+ Store.delete (resourceStore rp) [name, toFilePath r, "body"]
+
+
+--------------------------------------------------------------------------------
+load :: ResourceProvider -> Identifier a -> IO ()
+load rp r = do
+ mmd <- Store.get store mdk :: IO (Store.Result Metadata)
+ case mmd of
+ -- Already loaded
+ Store.Found _ -> return ()
+ -- Not yet loaded
+ _ -> do
+ (metadata, body) <- loadMetadata rp r
+ Store.set store mdk metadata
+ Store.set store bk body
+ where
+ store = resourceStore rp
+ mdk = [name, toFilePath r, "metadata"]
+ bk = [name, toFilePath r, "body"]
+
+
+--------------------------------------------------------------------------------
+name :: String
+name = "Hakyll.Core.Resource.Provider.MetadataCache"