1
1
{-# LANGUAGE FlexibleContexts #-}
2
+ {-# LANGUAGE NamedFieldPuns #-}
3
+ {-# LANGUAGE OverloadedRecordDot #-}
2
4
{-# LANGUAGE OverloadedStrings #-}
3
5
{-# LANGUAGE RankNTypes #-}
4
6
{-# LANGUAGE ScopedTypeVariables #-}
5
7
{-# LANGUAGE TupleSections #-}
6
8
{-# LANGUAGE TypeApplications #-}
7
9
{-# LANGUAGE TypeFamilies #-}
10
+ {-# LANGUAGE NoFieldSelectors #-}
8
11
9
12
module Driver where
10
13
@@ -92,11 +95,11 @@ runTask sourceDirectories files prettyError task = do
92
95
-------------------------------------------------------------------------------
93
96
-- Incremental execution
94
97
data State err = State
95
- { _startedVar :: ! (IORef (DHashMap Query MemoEntry ))
96
- , _hashesVar :: ! (IORef (DHashMap Query (Const Int )))
97
- , _reverseDependenciesVar :: ! (IORef (ReverseDependencies Query ))
98
- , _tracesVar :: ! (IORef (Traces Query (Const Int )))
99
- , _errorsVar :: ! (IORef (DHashMap Query (Const [err ])))
98
+ { startedVar :: ! (IORef (DHashMap Query MemoEntry ))
99
+ , hashesVar :: ! (IORef (DHashMap Query (Const Int )))
100
+ , reverseDependenciesVar :: ! (IORef (ReverseDependencies Query ))
101
+ , tracesVar :: ! (IORef (Traces Query (Const Int )))
102
+ , errorsVar :: ! (IORef (DHashMap Query (Const [err ])))
100
103
}
101
104
102
105
initialState :: IO (State err )
@@ -106,19 +109,19 @@ initialState = do
106
109
reverseDependenciesVar <- newIORef mempty
107
110
tracesVar <- newIORef mempty
108
111
errorsVar <- newIORef mempty
109
- return
112
+ pure
110
113
State
111
- { _startedVar = startedVar
112
- , _hashesVar = hashesVar
113
- , _reverseDependenciesVar = reverseDependenciesVar
114
- , _tracesVar = tracesVar
115
- , _errorsVar = errorsVar
114
+ { startedVar
115
+ , hashesVar
116
+ , reverseDependenciesVar
117
+ , tracesVar
118
+ , errorsVar
116
119
}
117
120
118
121
encodeState :: Persist err => State (err , doc ) -> IO ByteString
119
122
encodeState state = do
120
- traces <- readIORef $ _tracesVar state
121
- errors <- readIORef $ _errorsVar state
123
+ traces <- readIORef state. tracesVar
124
+ errors <- readIORef state. errorsVar
122
125
pure $
123
126
Persist. encode (traces, DHashMap. map (\ (Const errDocs) -> Const $ fst <$> errDocs) errors)
124
127
@@ -127,8 +130,8 @@ decodeState bs = do
127
130
s <- initialState
128
131
case Persist. decode bs of
129
132
Right (traces, errors) -> do
130
- void $ atomicWriteIORef (_tracesVar s) traces
131
- void $ atomicWriteIORef (_errorsVar s) errors
133
+ void $ atomicWriteIORef s . tracesVar traces
134
+ void $ atomicWriteIORef s . errorsVar errors
132
135
Left _ ->
133
136
pure ()
134
137
pure s
@@ -149,19 +152,19 @@ runIncrementalTask
149
152
runIncrementalTask state changedFiles sourceDirectories files prettyError prune task =
150
153
handleEx $ do
151
154
do
152
- reverseDependencies <- readIORef $ _reverseDependenciesVar state
153
- started <- readIORef $ _startedVar state
154
- hashes <- readIORef $ _hashesVar state
155
+ reverseDependencies <- readIORef state. reverseDependenciesVar
156
+ started <- readIORef state. startedVar
157
+ hashes <- readIORef state. hashesVar
155
158
156
159
case DHashMap. lookup Query. InputFiles started of
157
160
Just (Done inputFiles) -> do
158
161
-- TODO find a nicer way to do this
159
162
builtinFile <- Paths. getDataFileName " builtin/Builtin.vix"
160
163
if inputFiles /= HashSet. insert builtinFile (HashSet. fromMap $ void files)
161
164
then do
162
- atomicWriteIORef (_reverseDependenciesVar state) mempty
163
- atomicWriteIORef (_startedVar state) mempty
164
- atomicWriteIORef (_hashesVar state) mempty
165
+ atomicWriteIORef state. reverseDependenciesVar mempty
166
+ atomicWriteIORef state. startedVar mempty
167
+ atomicWriteIORef state. hashesVar mempty
165
168
else do
166
169
changedFiles' <- flip filterM (toList changedFiles) $ \ file ->
167
170
pure $ case (HashMap. lookup file files, DHashMap. lookup (Query. FileRope file) started, DHashMap. lookup (Query. FileText file) started) of
@@ -187,15 +190,15 @@ runIncrementalTask state changedFiles sourceDirectories files prettyError prune
187
190
-- Text.hPutStrLn stderr $ "Hashes " <> show (DHashMap.size hashes) <> " -> " <> show (DHashMap.size hashes')
188
191
-- Text.hPutStrLn stderr $ "ReverseDependencies " <> show (Map.size reverseDependencies) <> " -> " <> show (Map.size reverseDependencies')
189
192
190
- atomicWriteIORef (_startedVar state) started'
191
- atomicWriteIORef (_hashesVar state) hashes'
192
- atomicWriteIORef (_reverseDependenciesVar state) reverseDependencies'
193
+ atomicWriteIORef state. startedVar started'
194
+ atomicWriteIORef state. hashesVar hashes'
195
+ atomicWriteIORef state. reverseDependenciesVar reverseDependencies'
193
196
194
197
-- printVar <- newMVar 0
195
198
_ -> do
196
- atomicWriteIORef (_reverseDependenciesVar state) mempty
197
- atomicWriteIORef (_startedVar state) mempty
198
- atomicWriteIORef (_hashesVar state) mempty
199
+ atomicWriteIORef state. reverseDependenciesVar mempty
200
+ atomicWriteIORef state. startedVar mempty
201
+ atomicWriteIORef state. hashesVar mempty
199
202
200
203
threadDepsVar <- newIORef mempty
201
204
let readSourceFile_ file
@@ -219,24 +222,24 @@ runIncrementalTask state changedFiles sourceDirectories files prettyError prune
219
222
writeErrors :: Writer TaskKind Query a -> [Error ] -> Task Query ()
220
223
writeErrors (Writer key) errs = do
221
224
errs' <- mapM (prettyError <=< Error.Hydrated. fromError) errs
222
- atomicModifyIORef' (_errorsVar state) $
225
+ atomicModifyIORef' state. errorsVar $
223
226
(,() ) . if null errs' then DHashMap. delete key else DHashMap. insert key (Const errs')
224
227
225
228
rules :: Rules Query
226
229
rules =
227
- memoiseWithCycleDetection (_startedVar state) threadDepsVar
228
- $ trackReverseDependencies (_reverseDependenciesVar state)
230
+ memoiseWithCycleDetection state. startedVar threadDepsVar
231
+ $ trackReverseDependencies state. reverseDependenciesVar
229
232
$ verifyTraces
230
- (_tracesVar state)
233
+ state. tracesVar
231
234
( \ query value -> do
232
- hashed <- readIORef $ _hashesVar state
235
+ hashed <- readIORef state. hashesVar
233
236
case DHashMap. lookup query hashed of
234
237
Just h ->
235
238
pure h
236
239
Nothing -> do
237
240
let h =
238
241
Const $ has' @ Hashable @ Identity query $ hash $ Identity value
239
- atomicModifyIORef' (_hashesVar state) $
242
+ atomicModifyIORef' state. hashesVar $
240
243
(,() ) . DHashMap. insert query h
241
244
pure h
242
245
)
@@ -245,14 +248,14 @@ runIncrementalTask state changedFiles sourceDirectories files prettyError prune
245
248
$ Rules. rules sourceDirectories (HashSet. fromMap $ void files) readSourceFile_
246
249
-- result <- Rock.runMemoisedTask (_startedVar state) rules task
247
250
result <- Rock. runTask rules task
248
- started <- readIORef $ _startedVar state
251
+ started <- readIORef state. startedVar
249
252
errorsMap <- case prune of
250
253
Don'tPrune ->
251
- readIORef $ _errorsVar state
254
+ readIORef state. errorsVar
252
255
Prune -> do
253
- atomicModifyIORef' (_tracesVar state) $
256
+ atomicModifyIORef' state. tracesVar $
254
257
(,() ) . DHashMap. intersectionWithKey (\ _ _ t -> t) started
255
- atomicModifyIORef' (_errorsVar state) $ \ errors -> do
258
+ atomicModifyIORef' state. errorsVar $ \ errors -> do
256
259
let errors' = DHashMap. intersectionWithKey (\ _ _ e -> e) started errors
257
260
(errors', errors')
258
261
let errors = do
0 commit comments