module Hakyll.Core.Provider.Internal
( Provider (..)
, newProvider
, resourceList
, resourceExists
, resourceMetadataResource
, resourceFilePath
, resourceString
, resourceLBS
) where
import Control.Applicative ((<$>))
import qualified Data.ByteString.Lazy as BL
import Data.IORef
import Data.Map (Map)
import qualified Data.Map as M
import Data.Set (Set)
import qualified Data.Set as S
import System.FilePath (addExtension, (</>))
import Hakyll.Core.Identifier
import Hakyll.Core.Store
import Hakyll.Core.Util.File
data Provider = Provider
{
providerDirectory :: FilePath
,
providerSet :: Set Identifier
,
providerModifiedCache :: IORef (Map Identifier Bool)
,
providerStore :: Store
}
newProvider :: Store
-> (FilePath -> Bool)
-> FilePath
-> IO Provider
newProvider store ignore directory = do
list <- map fromFilePath . filter (not . ignore) <$>
getRecursiveContents directory
cache <- newIORef M.empty
return $ Provider directory (S.fromList list) cache store
resourceList :: Provider -> [Identifier]
resourceList = S.toList . providerSet
resourceExists :: Provider -> Identifier -> Bool
resourceExists provider =
(`S.member` providerSet provider) . setVersion Nothing
resourceMetadataResource :: Identifier -> Identifier
resourceMetadataResource =
fromFilePath . flip addExtension "metadata" . toFilePath
resourceFilePath :: Provider -> Identifier -> FilePath
resourceFilePath p i = providerDirectory p </> toFilePath i
resourceString :: Provider -> Identifier -> IO String
resourceString p i = readFile $ resourceFilePath p i
resourceLBS :: Provider -> Identifier -> IO BL.ByteString
resourceLBS p i = BL.readFile $ resourceFilePath p i