2010-12-25 17:15:44 +00:00
|
|
|
-- | A Compiler manages targets and dependencies between targets.
|
|
|
|
--
|
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
|
|
module Hakyll.Core.Compiler
|
2010-12-30 16:47:31 +00:00
|
|
|
( Compiler
|
2010-12-29 21:59:38 +00:00
|
|
|
, getIdentifier
|
|
|
|
, getResourceString
|
2010-12-25 17:15:44 +00:00
|
|
|
, require
|
2010-12-30 09:02:25 +00:00
|
|
|
, requireAll
|
2010-12-25 17:15:44 +00:00
|
|
|
) where
|
|
|
|
|
2010-12-29 21:59:38 +00:00
|
|
|
import Prelude hiding ((.), id)
|
2010-12-30 16:47:31 +00:00
|
|
|
import Control.Arrow ((>>>))
|
|
|
|
import Control.Applicative ((<$>))
|
|
|
|
import Control.Monad.Reader (ask)
|
2010-12-29 21:59:38 +00:00
|
|
|
import Control.Monad.Trans (liftIO)
|
2010-12-30 16:47:31 +00:00
|
|
|
import Control.Category (Category, (.))
|
2010-12-29 21:59:38 +00:00
|
|
|
|
2010-12-28 10:12:45 +00:00
|
|
|
import Data.Binary (Binary)
|
2010-12-29 21:59:38 +00:00
|
|
|
import Data.Typeable (Typeable)
|
2010-12-25 17:15:44 +00:00
|
|
|
|
|
|
|
import Hakyll.Core.Identifier
|
2010-12-29 14:33:22 +00:00
|
|
|
import Hakyll.Core.Identifier.Pattern
|
2010-12-28 10:12:45 +00:00
|
|
|
import Hakyll.Core.CompiledItem
|
|
|
|
import Hakyll.Core.Writable
|
2010-12-29 14:33:22 +00:00
|
|
|
import Hakyll.Core.ResourceProvider
|
2010-12-30 16:47:31 +00:00
|
|
|
import Hakyll.Core.Compiler.Internal
|
2010-12-29 21:59:38 +00:00
|
|
|
|
2010-12-30 09:11:37 +00:00
|
|
|
getIdentifier :: Compiler a Identifier
|
2010-12-30 16:47:31 +00:00
|
|
|
getIdentifier = fromJob $ const $ CompilerM $
|
2010-12-29 21:59:38 +00:00
|
|
|
compilerIdentifier <$> ask
|
|
|
|
|
2010-12-30 09:11:37 +00:00
|
|
|
getResourceString :: Compiler a String
|
2010-12-29 21:59:38 +00:00
|
|
|
getResourceString = getIdentifier >>> getResourceString'
|
|
|
|
where
|
2010-12-30 16:47:31 +00:00
|
|
|
getResourceString' = fromJob $ \id' -> CompilerM $ do
|
2010-12-29 21:59:38 +00:00
|
|
|
provider <- compilerResourceProvider <$> ask
|
|
|
|
liftIO $ resourceString provider id'
|
2010-12-25 17:15:44 +00:00
|
|
|
|
|
|
|
-- | Require another target. Using this function ensures automatic handling of
|
|
|
|
-- dependencies
|
|
|
|
--
|
2010-12-28 10:12:45 +00:00
|
|
|
require :: (Binary a, Typeable a, Writable a)
|
|
|
|
=> Identifier
|
2010-12-30 09:02:25 +00:00
|
|
|
-> (b -> a -> c)
|
2010-12-29 21:59:38 +00:00
|
|
|
-> Compiler b c
|
2010-12-30 09:02:25 +00:00
|
|
|
require identifier f =
|
2010-12-30 16:47:31 +00:00
|
|
|
fromDependencies (const [identifier]) >>> fromJob require'
|
2010-12-29 21:59:38 +00:00
|
|
|
where
|
|
|
|
require' x = CompilerM $ do
|
|
|
|
lookup' <- compilerDependencyLookup <$> ask
|
2010-12-30 09:02:25 +00:00
|
|
|
return $ f x $ unCompiledItem $ lookup' identifier
|
2010-12-25 17:15:44 +00:00
|
|
|
|
2010-12-29 14:33:22 +00:00
|
|
|
-- | Require a number of targets. Using this function ensures automatic handling
|
|
|
|
-- of dependencies
|
|
|
|
--
|
|
|
|
requireAll :: (Binary a, Typeable a, Writable a)
|
|
|
|
=> Pattern
|
2010-12-30 09:02:25 +00:00
|
|
|
-> (b -> [a] -> c)
|
|
|
|
-> Compiler b c
|
|
|
|
requireAll pattern f =
|
2010-12-30 16:47:31 +00:00
|
|
|
fromDependencies getDeps >>> fromJob requireAll'
|
2010-12-30 09:02:25 +00:00
|
|
|
where
|
|
|
|
getDeps = matches pattern . resourceList
|
|
|
|
requireAll' x = CompilerM $ do
|
|
|
|
deps <- getDeps . compilerResourceProvider <$> ask
|
|
|
|
lookup' <- compilerDependencyLookup <$> ask
|
|
|
|
return $ f x $ map (unCompiledItem . lookup') deps
|