summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/Provider/Internal.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hakyll/Core/Provider/Internal.hs')
-rw-r--r--src/Hakyll/Core/Provider/Internal.hs86
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