diff options
Diffstat (limited to 'src/Hakyll/Core/Provider/Internal.hs')
-rw-r--r-- | src/Hakyll/Core/Provider/Internal.hs | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/Hakyll/Core/Provider/Internal.hs b/src/Hakyll/Core/Provider/Internal.hs new file mode 100644 index 0000000..54332a9 --- /dev/null +++ b/src/Hakyll/Core/Provider/Internal.hs @@ -0,0 +1,86 @@ +-------------------------------------------------------------------------------- +module Hakyll.Core.Provider.Internal + ( Provider (..) + , newProvider + + , resourceList + , resourceExists + , resourceMetadataResource + + , 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.Store +import Hakyll.Core.Util.File +import Hakyll.Core.Identifier + + +-------------------------------------------------------------------------------- +-- | Responsible for retrieving and listing resources +data Provider = Provider + { -- | A list of all files found + providerSet :: Set Identifier + , -- | Cache keeping track of modified files + providerModifiedCache :: IORef (Map Identifier Bool) + , -- | Underlying persistent store for caching + providerStore :: Store + } + + +-------------------------------------------------------------------------------- +-- | Create a resource provider +newProvider :: Store -- ^ Store to use + -> (FilePath -> Bool) -- ^ Should we ignore this file? + -> FilePath -- ^ Search directory + -> IO Provider -- ^ Resulting provider +newProvider store ignore directory = do + list <- map fromFilePath . filter (not . ignore) <$> + getRecursiveContents False directory + cache <- newIORef M.empty + return $ Provider (S.fromList list) cache store + + +-------------------------------------------------------------------------------- +resourceList :: Provider -> [Identifier] +resourceList = S.toList . providerSet + + +-------------------------------------------------------------------------------- +-- | Check if a given resource exists +resourceExists :: Provider -> Identifier -> Bool +resourceExists provider = + (`S.member` providerSet provider) . setVersion Nothing + + +-------------------------------------------------------------------------------- +-- | Each resource may have an associated metadata resource (with a @.metadata@ +-- filename) +resourceMetadataResource :: Identifier -> Identifier +resourceMetadataResource = + fromFilePath . flip addExtension "metadata" . toFilePath + + +-------------------------------------------------------------------------------- +-- | Get the raw body of a resource as string +resourceString :: Identifier -> IO String +resourceString = readFile . toFilePath + + +-------------------------------------------------------------------------------- +-- | Get the raw body of a resource of a lazy bytestring +resourceLBS :: Identifier -> IO BL.ByteString +resourceLBS = BL.readFile . toFilePath |