summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/Compiler.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hakyll/Core/Compiler.hs')
-rw-r--r--src/Hakyll/Core/Compiler.hs189
1 files changed, 0 insertions, 189 deletions
diff --git a/src/Hakyll/Core/Compiler.hs b/src/Hakyll/Core/Compiler.hs
deleted file mode 100644
index 42b24d6..0000000
--- a/src/Hakyll/Core/Compiler.hs
+++ /dev/null
@@ -1,189 +0,0 @@
---------------------------------------------------------------------------------
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-module Hakyll.Core.Compiler
- ( Compiler
- , getUnderlying
- , getUnderlyingExtension
- , makeItem
- , getRoute
- , getResourceBody
- , getResourceString
- , getResourceLBS
- , getResourceFilePath
-
- , Internal.Snapshot
- , saveSnapshot
- , Internal.load
- , Internal.loadSnapshot
- , Internal.loadBody
- , Internal.loadSnapshotBody
- , Internal.loadAll
- , Internal.loadAllSnapshots
-
- , cached
- , unsafeCompiler
- , debugCompiler
- ) where
-
-
---------------------------------------------------------------------------------
-import Control.Monad (when, unless)
-import Data.Binary (Binary)
-import Data.ByteString.Lazy (ByteString)
-import Data.Typeable (Typeable)
-import System.Environment (getProgName)
-import System.FilePath (takeExtension)
-
-
---------------------------------------------------------------------------------
-import Hakyll.Core.Compiler.Internal
-import qualified Hakyll.Core.Compiler.Require as Internal
-import Hakyll.Core.Dependencies
-import Hakyll.Core.Identifier
-import Hakyll.Core.Item
-import Hakyll.Core.Logger as Logger
-import Hakyll.Core.Provider
-import Hakyll.Core.Routes
-import qualified Hakyll.Core.Store as Store
-
-
---------------------------------------------------------------------------------
--- | Get the underlying identifier.
-getUnderlying :: Compiler Identifier
-getUnderlying = compilerUnderlying <$> compilerAsk
-
-
---------------------------------------------------------------------------------
--- | Get the extension of the underlying identifier. Returns something like
--- @".html"@
-getUnderlyingExtension :: Compiler String
-getUnderlyingExtension = takeExtension . toFilePath <$> getUnderlying
-
-
---------------------------------------------------------------------------------
-makeItem :: a -> Compiler (Item a)
-makeItem x = do
- identifier <- getUnderlying
- return $ Item identifier x
-
-
---------------------------------------------------------------------------------
--- | Get the route for a specified item
-getRoute :: Identifier -> Compiler (Maybe FilePath)
-getRoute identifier = do
- provider <- compilerProvider <$> compilerAsk
- routes <- compilerRoutes <$> compilerAsk
- -- Note that this makes us dependend on that identifier: when the metadata
- -- of that item changes, the route may change, hence we have to recompile
- (mfp, um) <- compilerUnsafeIO $ runRoutes routes provider identifier
- when um $ compilerTellDependencies [IdentifierDependency identifier]
- return mfp
-
-
---------------------------------------------------------------------------------
--- | Get the full contents of the matched source file as a string,
--- but without metadata preamble, if there was one.
-getResourceBody :: Compiler (Item String)
-getResourceBody = getResourceWith resourceBody
-
-
---------------------------------------------------------------------------------
--- | Get the full contents of the matched source file as a string.
-getResourceString :: Compiler (Item String)
-getResourceString = getResourceWith resourceString
-
-
---------------------------------------------------------------------------------
--- | Get the full contents of the matched source file as a lazy bytestring.
-getResourceLBS :: Compiler (Item ByteString)
-getResourceLBS = getResourceWith resourceLBS
-
-
---------------------------------------------------------------------------------
--- | Get the file path of the resource we are compiling
-getResourceFilePath :: Compiler FilePath
-getResourceFilePath = do
- provider <- compilerProvider <$> compilerAsk
- id' <- compilerUnderlying <$> compilerAsk
- return $ resourceFilePath provider id'
-
-
---------------------------------------------------------------------------------
--- | Overloadable function for 'getResourceString' and 'getResourceLBS'
-getResourceWith :: (Provider -> Identifier -> IO a) -> Compiler (Item a)
-getResourceWith reader = do
- provider <- compilerProvider <$> compilerAsk
- id' <- compilerUnderlying <$> compilerAsk
- let filePath = toFilePath id'
- if resourceExists provider id'
- then compilerUnsafeIO $ Item id' <$> reader provider id'
- else fail $ error' filePath
- where
- error' fp = "Hakyll.Core.Compiler.getResourceWith: resource " ++
- show fp ++ " not found"
-
-
---------------------------------------------------------------------------------
--- | Save a snapshot of the item. This function returns the same item, which
--- convenient for building '>>=' chains.
-saveSnapshot :: (Binary a, Typeable a)
- => Internal.Snapshot -> Item a -> Compiler (Item a)
-saveSnapshot snapshot item = do
- store <- compilerStore <$> compilerAsk
- logger <- compilerLogger <$> compilerAsk
- compilerUnsafeIO $ do
- Logger.debug logger $ "Storing snapshot: " ++ snapshot
- Internal.saveSnapshot store snapshot item
-
- -- Signal that we saved the snapshot.
- Compiler $ \_ -> return $ CompilerSnapshot snapshot (return item)
-
-
---------------------------------------------------------------------------------
-cached :: (Binary a, Typeable a)
- => String
- -> Compiler a
- -> Compiler a
-cached name compiler = do
- id' <- compilerUnderlying <$> compilerAsk
- store <- compilerStore <$> compilerAsk
- provider <- compilerProvider <$> compilerAsk
-
- -- Give a better error message when the resource is not there at all.
- unless (resourceExists provider id') $ fail $ itDoesntEvenExist id'
-
- let modified = resourceModified provider id'
- if modified
- then do
- x <- compiler
- compilerUnsafeIO $ Store.set store [name, show id'] x
- return x
- else do
- compilerTellCacheHits 1
- x <- compilerUnsafeIO $ Store.get store [name, show id']
- progName <- compilerUnsafeIO getProgName
- case x of Store.Found x' -> return x'
- _ -> fail $ error' progName
- where
- error' progName =
- "Hakyll.Core.Compiler.cached: Cache corrupt! " ++
- "Try running: " ++ progName ++ " clean"
-
- itDoesntEvenExist id' =
- "Hakyll.Core.Compiler.cached: You are trying to (perhaps " ++
- "indirectly) use `cached` on a non-existing resource: there " ++
- "is no file backing " ++ show id'
-
-
---------------------------------------------------------------------------------
-unsafeCompiler :: IO a -> Compiler a
-unsafeCompiler = compilerUnsafeIO
-
-
---------------------------------------------------------------------------------
--- | Compiler for debugging purposes
-debugCompiler :: String -> Compiler ()
-debugCompiler msg = do
- logger <- compilerLogger <$> compilerAsk
- compilerUnsafeIO $ Logger.debug logger msg