@@ -41,27 +41,39 @@ hakyll rules = do
41 provider <- fileResourceProvider
41 provider <- fileResourceProvider
42 let ruleSet = runRules rules provider
42 let ruleSet = runRules rules provider
43 compilers = rulesCompilers ruleSet
43 compilers = rulesCompilers ruleSet
45+ -- Extract the reader/state
44− runReaderT (unHakyll (addNewCompilers [] compilers)) $
46+ reader = unHakyll $ addNewCompilers [] compilers
45− env ruleSet provider store
47+ state' = runReaderT reader $ env ruleSet provider store
49+ evalStateT state' state
47 env ruleSet provider store = HakyllEnvironment
51 env ruleSet provider store = HakyllEnvironment
48 { hakyllRoute = rulesRoute ruleSet
52 { hakyllRoute = rulesRoute ruleSet
49 , hakyllResourceProvider = provider
53 , hakyllResourceProvider = provider
50 , hakyllStore = store
54 , hakyllStore = store
51− , hakyllModified = S.empty
58+ { hakyllModified = S.empty
52− , hakyllObsolete = S.empty
59+ , hakyllObsolete = S.empty
60+ , hakyllGraph = mempty
55data HakyllEnvironment = HakyllEnvironment
63data HakyllEnvironment = HakyllEnvironment
56 { hakyllRoute :: Route
64 { hakyllRoute :: Route
57 , hakyllResourceProvider :: ResourceProvider
65 , hakyllResourceProvider :: ResourceProvider
58 , hakyllStore :: Store
66 , hakyllStore :: Store
69+data HakyllState = HakyllState
59− , hakyllModified :: Set Identifier
70+ { hakyllModified :: Set Identifier
60− , hakyllObsolete :: Set Identifier
71+ , hakyllObsolete :: Set Identifier
72+ , hakyllGraph :: DirectedGraph Identifier
63newtype Hakyll a = Hakyll
75newtype Hakyll a = Hakyll
64− { unHakyll :: ReaderT HakyllEnvironment IO a
76+ { unHakyll :: ReaderT HakyllEnvironment (StateT HakyllState IO) a
65 } deriving (Functor, Applicative, Monad)
77 } deriving (Functor, Applicative, Monad)
67-- | Return a set of modified identifiers
79-- | Return a set of modified identifiers
@@ -104,9 +116,9 @@ addNewCompilers oldCompilers newCompilers = Hakyll $ do
105 -- Check which items are up-to-date. This only needs to happen for the new
117 -- Check which items are up-to-date. This only needs to happen for the new
106 -- compilers
118 -- compilers
107− oldModified <- hakyllModified <$> ask
119+ oldModified <- hakyllModified <$> get
108 newModified <- liftIO $ modified provider store $ map fst newCompilers
120 newModified <- liftIO $ modified provider store $ map fst newCompilers
109− oldObsolete <- hakyllObsolete <$> ask
121+ oldObsolete <- hakyllObsolete <$> get
111 let modified' = oldModified `S.union` newModified
123 let modified' = oldModified `S.union` newModified
@@ -122,12 +134,13 @@ addNewCompilers oldCompilers newCompilers = Hakyll $ do
123 liftIO $ putStrLn "Adding compilers..."
135 liftIO $ putStrLn "Adding compilers..."
137+ modify $ updateState modified' obsolete
125 -- Now run the ordered list of compilers
139 -- Now run the ordered list of compilers
126− local (updateEnv modified' obsolete) $
127− unHakyll $ runCompilers orderedCompilers
140+ unHakyll $ runCompilers orderedCompilers
129 -- Add the modified information for the new compilers
142 -- Add the modified information for the new compilers
130− updateEnv modified' obsolete env = env
143+ updateState modified' obsolete state = state
131 { hakyllModified = modified'
144 { hakyllModified = modified'
132 , hakyllObsolete = obsolete
145 , hakyllObsolete = obsolete
@@ -142,7 +155,7 @@ runCompilers ((id', compiler) : compilers) = Hakyll $ do
142 route' <- hakyllRoute <$> ask
155 route' <- hakyllRoute <$> ask
143 provider <- hakyllResourceProvider <$> ask
156 provider <- hakyllResourceProvider <$> ask
144 store <- hakyllStore <$> ask
157 store <- hakyllStore <$> ask
145− modified' <- hakyllModified <$> ask
158+ modified' <- hakyllModified <$> get
147 let -- Determine the URL
160 let -- Determine the URL
148 url = runRoute route' id'
161 url = runRoute route' id'