on dbd670c help sign in
hakyll/src/Hakyll/Core/Provider/MetadataCache.hs
68 lines 2.4 kB history raw
1--------------------------------------------------------------------------------
2module Hakyll.Core.Provider.MetadataCache
3 ( resourceMetadata
4 , resourceBody
5 , resourceInvalidateMetadataCache
6 ) where
9--------------------------------------------------------------------------------
10import qualified Data.Map as M
13--------------------------------------------------------------------------------
14import Hakyll.Core.Identifier
15import Hakyll.Core.Metadata
16import Hakyll.Core.Provider.Internal
17import Hakyll.Core.Provider.Metadata
18import qualified Hakyll.Core.Store as Store
21--------------------------------------------------------------------------------
22resourceMetadata :: Provider -> Identifier -> IO Metadata
23resourceMetadata p r
24 | not (resourceExists p r) = return M.empty
25 | otherwise = do
26 load p r
27 Store.Found md <- Store.get (providerStore p)
28 [name, toFilePath r, "metadata"]
29 return md
32--------------------------------------------------------------------------------
33resourceBody :: Provider -> Identifier -> IO String
34resourceBody p r = do
35 load p r
36 Store.Found bd <- Store.get (providerStore p)
37 [name, toFilePath r, "body"]
38 maybe (resourceString p r) return bd
41--------------------------------------------------------------------------------
42resourceInvalidateMetadataCache :: Provider -> Identifier -> IO ()
43resourceInvalidateMetadataCache p r = do
44 Store.delete (providerStore p) [name, toFilePath r, "metadata"]
45 Store.delete (providerStore p) [name, toFilePath r, "body"]
48--------------------------------------------------------------------------------
49load :: Provider -> Identifier -> IO ()
50load p r = do
51 mmd <- Store.get store mdk :: IO (Store.Result Metadata)
52 case mmd of
53 -- Already loaded
54 Store.Found _ -> return ()
55 -- Not yet loaded
56 _ -> do
57 (metadata, body) <- loadMetadata p r
58 Store.set store mdk metadata
59 Store.set store bk body
60 where
61 store = providerStore p
62 mdk = [name, toFilePath r, "metadata"]
63 bk = [name, toFilePath r, "body"]
66--------------------------------------------------------------------------------
67name :: String
68name = "Hakyll.Core.Resource.Provider.MetadataCache"