on master help sign in
Migrate Reader → Reader, State in Run module
c6710acJasper Van der Jeugt
src/Hakyll/Core/Run.hs+26−13
@@ -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
44+
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
48+
49+ evalStateT state' state
46 where
50 where
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
55+ }
56+
57+ state = HakyllState
51− , hakyllModified = S.empty
58+ { hakyllModified = S.empty
52− , hakyllObsolete = S.empty
59+ , hakyllObsolete = S.empty
60+ , hakyllGraph = mempty
53 }
61 }
54
62
55data HakyllEnvironment = HakyllEnvironment
63data HakyllEnvironment = HakyllEnvironment
56 { hakyllRoute :: Route
64 { hakyllRoute :: Route
57 , hakyllResourceProvider :: ResourceProvider
65 , hakyllResourceProvider :: ResourceProvider
58 , hakyllStore :: Store
66 , hakyllStore :: Store
67+ }
68+
69+data HakyllState = HakyllState
59− , hakyllModified :: Set Identifier
70+ { hakyllModified :: Set Identifier
60− , hakyllObsolete :: Set Identifier
71+ , hakyllObsolete :: Set Identifier
72+ , hakyllGraph :: DirectedGraph Identifier
61 }
73 }
62
74
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)
66
78
67-- | Return a set of modified identifiers
79-- | Return a set of modified identifiers
@@ -104,9 +116,9 @@ addNewCompilers oldCompilers newCompilers = Hakyll $ do
104
116
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
110
122
111 let modified' = oldModified `S.union` newModified
123 let modified' = oldModified `S.union` newModified
112
124
@@ -122,12 +134,13 @@ addNewCompilers oldCompilers newCompilers = Hakyll $ do
122
134
123 liftIO $ putStrLn "Adding compilers..."
135 liftIO $ putStrLn "Adding compilers..."
124
136
137+ modify $ updateState modified' obsolete
138+
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
128 where
141 where
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
133 }
146 }
@@ -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
146
159
147 let -- Determine the URL
160 let -- Determine the URL
148 url = runRoute route' id'
161 url = runRoute route' id'