on 877cb21 help sign in
86 lines 3.1 kB history raw
1--------------------------------------------------------------------------------
2module Hakyll.Core.Provider.Internal
3 ( Provider (..)
4 , newProvider
6 , resourceList
7 , resourceExists
8 , resourceMetadataResource
10 , resourceString
11 , resourceLBS
12 ) where
15--------------------------------------------------------------------------------
16import Control.Applicative ((<$>))
17import qualified Data.ByteString.Lazy as BL
18import Data.IORef
19import Data.Map (Map)
20import qualified Data.Map as M
21import Data.Set (Set)
22import qualified Data.Set as S
23import System.FilePath (addExtension)
26--------------------------------------------------------------------------------
27import Hakyll.Core.Store
28import Hakyll.Core.Util.File
29import Hakyll.Core.Identifier
32--------------------------------------------------------------------------------
33-- | Responsible for retrieving and listing resources
34data Provider = Provider
35 { -- | A list of all files found
36 providerSet :: Set Identifier
37 , -- | Cache keeping track of modified files
38 providerModifiedCache :: IORef (Map Identifier Bool)
39 , -- | Underlying persistent store for caching
40 providerStore :: Store
41 }
44--------------------------------------------------------------------------------
45-- | Create a resource provider
46newProvider :: Store -- ^ Store to use
47 -> (FilePath -> Bool) -- ^ Should we ignore this file?
48 -> FilePath -- ^ Search directory
49 -> IO Provider -- ^ Resulting provider
50newProvider store ignore directory = do
51 list <- map fromFilePath . filter (not . ignore) <$>
52 getRecursiveContents False directory
53 cache <- newIORef M.empty
54 return $ Provider (S.fromList list) cache store
57--------------------------------------------------------------------------------
58resourceList :: Provider -> [Identifier]
59resourceList = S.toList . providerSet
62--------------------------------------------------------------------------------
63-- | Check if a given resource exists
64resourceExists :: Provider -> Identifier -> Bool
65resourceExists provider =
66 (`S.member` providerSet provider) . setVersion Nothing
69--------------------------------------------------------------------------------
70-- | Each resource may have an associated metadata resource (with a @.metadata@
71-- filename)
72resourceMetadataResource :: Identifier -> Identifier
73resourceMetadataResource =
74 fromFilePath . flip addExtension "metadata" . toFilePath
77--------------------------------------------------------------------------------
78-- | Get the raw body of a resource as string
79resourceString :: Identifier -> IO String
80resourceString = readFile . toFilePath
83--------------------------------------------------------------------------------
84-- | Get the raw body of a resource of a lazy bytestring
85resourceLBS :: Identifier -> IO BL.ByteString
86resourceLBS = BL.readFile . toFilePath