summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/ResourceProvider/Internal.hs
diff options
context:
space:
mode:
authorJasper Van der Jeugt <m@jaspervdj.be>2012-11-09 16:34:45 +0100
committerJasper Van der Jeugt <m@jaspervdj.be>2012-11-09 16:34:45 +0100
commit1319bbfe4ab3ddd321bcbb902bba7392ad868324 (patch)
tree5fdcad316015db237b18ff7e22e0e73c5044cc6f /src/Hakyll/Core/ResourceProvider/Internal.hs
parentdac3fac342c2fb8610b6f1d83cbfd97a70cf17f1 (diff)
downloadhakyll-1319bbfe4ab3ddd321bcbb902bba7392ad868324.tar.gz
Remove Resource type
Diffstat (limited to 'src/Hakyll/Core/ResourceProvider/Internal.hs')
-rw-r--r--src/Hakyll/Core/ResourceProvider/Internal.hs86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/Hakyll/Core/ResourceProvider/Internal.hs b/src/Hakyll/Core/ResourceProvider/Internal.hs
new file mode 100644
index 0000000..1f8f776
--- /dev/null
+++ b/src/Hakyll/Core/ResourceProvider/Internal.hs
@@ -0,0 +1,86 @@
+--------------------------------------------------------------------------------
+module Hakyll.Core.ResourceProvider.Internal
+ ( ResourceProvider (..)
+ , newResourceProvider
+
+ , 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 ResourceProvider = ResourceProvider
+ { -- | A list of all files found
+ resourceSet :: Set (Identifier ())
+ , -- | Cache keeping track of modified files
+ resourceModifiedCache :: IORef (Map (Identifier ()) Bool)
+ , -- | Underlying persistent store for caching
+ resourceStore :: Store
+ }
+
+
+--------------------------------------------------------------------------------
+-- | Create a resource provider
+newResourceProvider :: Store -- ^ Store to use
+ -> (FilePath -> Bool) -- ^ Should we ignore this file?
+ -> FilePath -- ^ Search directory
+ -> IO ResourceProvider -- ^ Resulting provider
+newResourceProvider store ignore directory = do
+ list <- map parseIdentifier . filter (not . ignore) <$>
+ getRecursiveContents False directory
+ cache <- newIORef M.empty
+ return $ ResourceProvider (S.fromList list) cache store
+
+
+--------------------------------------------------------------------------------
+resourceList :: ResourceProvider -> [Identifier ()]
+resourceList = S.toList . resourceSet
+
+
+--------------------------------------------------------------------------------
+-- | Check if a given resiyrce exists
+resourceExists :: ResourceProvider -> Identifier a -> Bool
+resourceExists provider =
+ (`S.member` resourceSet provider) . setGroup Nothing . castIdentifier
+
+
+--------------------------------------------------------------------------------
+-- | Each resource may have an associated metadata resource (with a @.metadata@
+-- filename)
+resourceMetadataResource :: Identifier a -> Identifier ()
+resourceMetadataResource =
+ parseIdentifier . flip addExtension "metadata" . toFilePath
+
+
+--------------------------------------------------------------------------------
+-- | Get the raw body of a resource as string
+resourceString :: Identifier a -> IO String
+resourceString = readFile . toFilePath
+
+
+--------------------------------------------------------------------------------
+-- | Get the raw body of a resource of a lazy bytestring
+resourceLBS :: Identifier a -> IO BL.ByteString
+resourceLBS = BL.readFile . toFilePath