@@ -6,10 +6,11 @@ module Hakyll.Core.Compiler
66 , CompilerM
77 , Compiler (..)
88 , runCompiler
9+ , getDependencies
910 , getIdentifier
1011 , getResourceString
1112 , require
12− -- , requireAll
13+ , requireAll
1314 -- , compileFromString
1415 ) where
1516
@@ -17,9 +18,9 @@ import Prelude hiding ((.), id)
1718import Control.Arrow (second, (>>>))
1819import Control.Applicative (Applicative, (<$>))
1920import Control.Monad.State (State, modify, runState)
20−import Control.Monad.Reader (ReaderT, ask, runReaderT)
21+import Control.Monad.Reader (ReaderT, Reader, ask, runReaderT, runReader)
2122import Control.Monad.Trans (liftIO)
22−import Control.Monad ((<=<))
23+import Control.Monad ((<=<), liftM2)
2324import Data.Set (Set)
2425import qualified Data.Set as S
2526import Control.Category (Category, (.), id)
@@ -59,18 +60,17 @@ newtype CompilerM a = CompilerM
5960-- | The compiler arrow
6061--
6162data Compiler a b = Compiler
62− { -- TODO: Reader ResourceProvider Dependencies
63− compilerDependencies :: Dependencies
63+ { compilerDependencies :: Reader ResourceProvider Dependencies
6464 , compilerJob :: a -> CompilerM b
6565 }
6666
6767instance Category Compiler where
68− id = Compiler S.empty return
68+ id = Compiler (return S.empty) return
6969 (Compiler d1 j1) . (Compiler d2 j2) =
70− Compiler (d1 `S.union` d2) (j1 <=< j2)
70+ Compiler (liftM2 S.union d1 d2) (j1 <=< j2)
7171
7272instance Arrow Compiler where
73− arr f = Compiler S.empty (return . f)
73+ arr f = Compiler (return S.empty) (return . f)
7474 first (Compiler d j) = Compiler d $ \(x, y) -> do
7575 x' <- j x
7676 return (x', y)
@@ -91,13 +91,19 @@ runCompiler compiler identifier provider lookup' =
9191 , compilerDependencyLookup = lookup'
9292 }
9393
94−addDependency :: Identifier
95− -> Compiler b b
96−addDependency id' = Compiler (S.singleton id') return
94+getDependencies :: Compiler () a
95+ -> ResourceProvider
96+ -> Dependencies
97+getDependencies compiler provider =
98+ runReader (compilerDependencies compiler) provider
99+
100+addDependencies :: (ResourceProvider -> [Identifier])
101+ -> Compiler b b
102+addDependencies deps = Compiler (S.fromList . deps <$> ask) return
97103
98104fromCompilerM :: (a -> CompilerM b)
99105 -> Compiler a b
100−fromCompilerM = Compiler S.empty
106+fromCompilerM = Compiler (return S.empty)
101107
102108getIdentifier :: Compiler () Identifier
103109getIdentifier = fromCompilerM $ const $ CompilerM $
@@ -115,26 +121,32 @@ getResourceString = getIdentifier >>> getResourceString'
115121--
116122require :: (Binary a, Typeable a, Writable a)
117123 => Identifier
118− -> (a -> b -> c)
124+ -> (b -> a -> c)
119125 -> Compiler b c
120−require identifier f = addDependency identifier >>> fromCompilerM require'
126+require identifier f =
127+ addDependencies (const [identifier]) >>> fromCompilerM require'
121128 where
122129 require' x = CompilerM $ do
123130 lookup' <- compilerDependencyLookup <$> ask
124− return $ f (unCompiledItem $ lookup' identifier) x
131+ return $ f x $ unCompiledItem $ lookup' identifier
125132
126−{-
127133-- | Require a number of targets. Using this function ensures automatic handling
128134-- of dependencies
129135--
130136requireAll :: (Binary a, Typeable a, Writable a)
131137 => Pattern
132− -> Compiler [a]
133−requireAll pattern = CompilerM $ do
134− provider <- compilerResourceProvider <$> ask
135− r <- unCompilerM $ mapM require $ matches pattern $ resourceList provider
136− return $ sequence r
138+ -> (b -> [a] -> c)
139+ -> Compiler b c
140+requireAll pattern f =
141+ addDependencies getDeps >>> fromCompilerM requireAll'
142+ where
143+ getDeps = matches pattern . resourceList
144+ requireAll' x = CompilerM $ do
145+ deps <- getDeps . compilerResourceProvider <$> ask
146+ lookup' <- compilerDependencyLookup <$> ask
147+ return $ f x $ map (unCompiledItem . lookup') deps
137148
149+{-
138150-- | Construct a target from a string, this string being the content of the
139151-- resource.
140152--