@@ -136,23 +136,24 @@ builder db@Database{..} stack keys = withRunInIO $ \(RunInIO run) -> do
136
136
isDirty :: Foldable t => Result -> t (a , Result ) -> Bool
137
137
isDirty me = any (\ (_,dep) -> resultBuilt me < resultChanged dep)
138
138
139
- refreshDeps :: Database -> Stack -> Key -> Result -> [KeySet ] -> AIO (IO Result )
140
- refreshDeps db stack key result = \ case
139
+ refreshDeps :: KeySet -> Database -> Stack -> Key -> Result -> [KeySet ] -> AIO (IO Result )
140
+ refreshDeps visited db stack key result = \ case
141
141
-- no more deps to refresh
142
142
[] -> pure $ compute db stack key RunDependenciesSame (Just result)
143
143
(dep: deps) -> do
144
- res <- builder db stack (toListKeySet dep)
144
+ let newVisited = dep <> visited
145
+ res <- builder db stack (toListKeySet (dep `differenceKeySet` visited))
145
146
case res of
146
147
Left res -> if isDirty result res
147
148
-- restart the computation if any of the deps are dirty
148
149
then asyncWithCleanUp $ liftIO $ compute db stack key RunDependenciesChanged (Just result)
149
150
-- else kick the rest of the deps
150
- else refreshDeps db stack key result deps
151
+ else refreshDeps newVisited db stack key result deps
151
152
Right iores -> asyncWithCleanUp $ liftIO $ do
152
153
res <- iores
153
154
if isDirty result res
154
155
then compute db stack key RunDependenciesChanged (Just result)
155
- else join $ runAIO $ refreshDeps db stack key result deps
156
+ else join $ runAIO $ refreshDeps newVisited db stack key result deps
156
157
157
158
-- | Refresh a key:
158
159
-- * If no dirty dependencies and we have evaluated the key previously, then we refresh it in the current thread.
@@ -162,7 +163,7 @@ refresh :: Database -> Stack -> Key -> Maybe Result -> AIO (IO Result)
162
163
-- refresh _ st k _ | traceShow ("refresh", st, k) False = undefined
163
164
refresh db stack key result = case (addStack key stack, result) of
164
165
(Left e, _) -> throw e
165
- (Right stack, Just me@ Result {resultDeps = ResultDeps deps}) -> refreshDeps db stack key me (reverse deps)
166
+ (Right stack, Just me@ Result {resultDeps = ResultDeps deps}) -> refreshDeps mempty db stack key me (reverse deps)
166
167
(Right stack, _) ->
167
168
asyncWithCleanUp $ liftIO $ compute db stack key RunDependenciesChanged result
168
169
0 commit comments