hakyll/src/Hakyll/Core/Compiler.hs

69 lines
2.1 KiB
Haskell
Raw Normal View History

2010-12-25 17:15:44 +00:00
-- | A Compiler manages targets and dependencies between targets.
--
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Hakyll.Core.Compiler
( 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)
import Control.Arrow ((>>>))
import Control.Applicative ((<$>))
import Control.Monad.Reader (ask)
2010-12-29 21:59:38 +00:00
import Control.Monad.Trans (liftIO)
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
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
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
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 =
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 =
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