@@ -2,11 +2,7 @@
3{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4module Hakyll.Core.Compiler
4module Hakyll.Core.Compiler
7− , Compiler (..)
5+ ( Compiler
10 , getIdentifier
6 , getIdentifier
11 , getResourceString
7 , getResourceString
@@ -14,16 +10,11 @@ module Hakyll.Core.Compiler
16import Prelude hiding ((.), id)
12import Prelude hiding ((.), id)
17−import Control.Arrow (second, (>>>))
13+import Control.Arrow ((>>>))
18−import Control.Applicative (Applicative, (<$>))
14+import Control.Applicative ((<$>))
19−import Control.Monad.State (State, modify, runState)
15+import Control.Monad.Reader (ask)
20−import Control.Monad.Reader (ReaderT, Reader, ask, runReaderT, runReader)
21import Control.Monad.Trans (liftIO)
16import Control.Monad.Trans (liftIO)
22−import Control.Monad ((<=<), liftM2)
24−import qualified Data.Set as S
25−import Control.Category (Category, (.), id)
17+import Control.Category (Category, (.))
26−import Control.Arrow (Arrow, arr, first)
28import Data.Binary (Binary)
19import Data.Binary (Binary)
29import Data.Typeable (Typeable)
20import Data.Typeable (Typeable)
@@ -33,85 +24,16 @@ import Hakyll.Core.Identifier.Pattern
33import Hakyll.Core.CompiledItem
24import Hakyll.Core.CompiledItem
34import Hakyll.Core.Writable
25import Hakyll.Core.Writable
35import Hakyll.Core.ResourceProvider
26import Hakyll.Core.ResourceProvider
36−
27+import Hakyll.Core.Compiler.Internal
37−-- | A set of dependencies
39−type Dependencies = Set Identifier
41−-- | A lookup with which we can get dependencies
43−type DependencyLookup = Identifier -> CompiledItem
45−-- | Environment in which a compiler runs
47−data CompilerEnvironment = CompilerEnvironment
48− { compilerIdentifier :: Identifier -- ^ Target identifier
49− , compilerResourceProvider :: ResourceProvider -- ^ Resource provider
50− , compilerDependencyLookup :: DependencyLookup -- ^ Dependency lookup
53−-- | The compiler monad
55−newtype CompilerM a = CompilerM
56− { unCompilerM :: ReaderT CompilerEnvironment IO a
57− } deriving (Monad, Functor, Applicative)
59−-- | The compiler arrow
61−data Compiler a b = Compiler
62− { compilerDependencies :: Reader ResourceProvider Dependencies
63− , compilerJob :: a -> CompilerM b
66−instance Category Compiler where
67− id = Compiler (return S.empty) return
68− (Compiler d1 j1) . (Compiler d2 j2) =
69− Compiler (liftM2 S.union d1 d2) (j1 <=< j2)
71−instance Arrow Compiler where
72− arr f = Compiler (return S.empty) (return . f)
73− first (Compiler d j) = Compiler d $ \(x, y) -> do
77−-- | Run a compiler, yielding the resulting target and it's dependencies
79−runCompiler :: Compiler () a
84−runCompiler compiler identifier provider lookup' =
85− runReaderT (unCompilerM $ compilerJob compiler ()) env
87− env = CompilerEnvironment
88− { compilerIdentifier = identifier
89− , compilerResourceProvider = provider
90− , compilerDependencyLookup = lookup'
93−getDependencies :: Compiler () a
96−getDependencies compiler provider =
97− runReader (compilerDependencies compiler) provider
99−addDependencies :: (ResourceProvider -> [Identifier])
101−addDependencies deps = Compiler (S.fromList . deps <$> ask) return
103−fromCompilerM :: (a -> CompilerM b)
105−fromCompilerM = Compiler (return S.empty)
107getIdentifier :: Compiler a Identifier
29getIdentifier :: Compiler a Identifier
108−getIdentifier = fromCompilerM $ const $ CompilerM $
30+getIdentifier = fromJob $ const $ CompilerM $
109 compilerIdentifier <$> ask
31 compilerIdentifier <$> ask
111getResourceString :: Compiler a String
33getResourceString :: Compiler a String
112getResourceString = getIdentifier >>> getResourceString'
34getResourceString = getIdentifier >>> getResourceString'
114− getResourceString' = fromCompilerM $ \id' -> CompilerM $ do
36+ getResourceString' = fromJob $ \id' -> CompilerM $ do
115 provider <- compilerResourceProvider <$> ask
37 provider <- compilerResourceProvider <$> ask
116 liftIO $ resourceString provider id'
38 liftIO $ resourceString provider id'
@@ -123,7 +45,7 @@ require :: (Binary a, Typeable a, Writable a)
123 -> (b -> a -> c)
45 -> (b -> a -> c)
124 -> Compiler b c
46 -> Compiler b c
125require identifier f =
47require identifier f =
126− addDependencies (const [identifier]) >>> fromCompilerM require'
48+ fromDependencies (const [identifier]) >>> fromJob require'
128 require' x = CompilerM $ do
50 require' x = CompilerM $ do
129 lookup' <- compilerDependencyLookup <$> ask
51 lookup' <- compilerDependencyLookup <$> ask
@@ -137,7 +59,7 @@ requireAll :: (Binary a, Typeable a, Writable a)
137 -> (b -> [a] -> c)
59 -> (b -> [a] -> c)
138 -> Compiler b c
60 -> Compiler b c
139requireAll pattern f =
61requireAll pattern f =
140− addDependencies getDeps >>> fromCompilerM requireAll'
62+ fromDependencies getDeps >>> fromJob requireAll'
142 getDeps = matches pattern . resourceList
64 getDeps = matches pattern . resourceList
143 requireAll' x = CompilerM $ do
65 requireAll' x = CompilerM $ do