Skip to content

Commit 6c94505

Browse files
committed
remove whole pass from incStep
1 parent 3d6d44a commit 6c94505

File tree

2 files changed

+31
-22
lines changed

2 files changed

+31
-22
lines changed

hls-graph/src/Development/IDE/Graph/Internal/Database.hs

+18-18
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import Control.Monad.Trans.Reader
2727
import qualified Control.Monad.Trans.State.Strict as State
2828
import Data.Dynamic
2929
import Data.Either
30-
import Data.Foldable (traverse_)
30+
import Data.Foldable (for_, traverse_)
3131
import Data.HashSet (HashSet)
3232
import qualified Data.HashSet as HSet
3333
import Data.IORef.Extra
@@ -51,27 +51,27 @@ newDatabase databaseExtra databaseRules = do
5151

5252
-- | Increment the step and mark dirty
5353
incDatabase :: Database -> Maybe [Key] -> STM ()
54-
-- all keys are dirty
55-
incDatabase db Nothing = incDatabaseGen (const True) db
5654
-- only some keys are dirty
5755
incDatabase db (Just kk) = do
56+
modifyTVar' (databaseStep db) $ \(Step i) -> Step $ i + 1
5857
transitiveDirtyKeys <- transitiveDirtySet db kk
59-
incDatabaseGen (`HSet.member` transitiveDirtyKeys) db
58+
for_ transitiveDirtyKeys $ \k ->
59+
SMap.focus updateDirty k (databaseValues db)
6060

61-
incDatabaseGen :: (Key -> Bool) -> Database -> STM ()
62-
incDatabaseGen pred db = do
61+
-- all keys are dirty
62+
incDatabase db Nothing = do
6363
modifyTVar' (databaseStep db) $ \(Step i) -> Step $ i + 1
6464
let list = SMap.listT (databaseValues db)
65-
reset k (KeyDetails status rdeps) =
65+
flip ListT.traverse_ list $ \(k,_) -> do
66+
SMap.focus updateDirty k (databaseValues db)
67+
68+
updateDirty :: Monad m => Focus.Focus KeyDetails m ()
69+
updateDirty = Focus.adjust $ \(KeyDetails status rdeps) ->
6670
let status'
67-
| Running _ _ x <- status = Dirty x
68-
| Clean x <- status
69-
, pred k = Dirty (Just x)
71+
| Running _ _ _ x <- status = Dirty x
72+
| Clean x <- status = Dirty (Just x)
7073
| otherwise = status
7174
in KeyDetails status' rdeps
72-
flip ListT.traverse_ list $ \(k,v) -> do
73-
SMap.insert (reset k v) k (databaseValues db)
74-
7575
-- | Unwrap and build a list of keys in parallel
7676
build
7777
:: forall key value . (RuleResult key ~ value, Typeable key, Show key, Hashable key, Eq key, Typeable value)
@@ -92,19 +92,19 @@ builder
9292
builder db@Database{..} keys = withRunInIO $ \(RunInIO run) -> do
9393
-- Things that I need to force before my results are ready
9494
toForce <- liftIO $ newTVarIO []
95-
results <- liftIO $ atomically $ do
96-
for keys $ \id -> do
95+
current <- liftIO $ readTVarIO databaseStep
96+
results <- liftIO $ atomically $ for keys $ \id -> do
9797
-- Spawn the id if needed
9898
status <- SMap.lookup id databaseValues
99-
val <- case maybe (Dirty Nothing) keyStatus status of
99+
val <- case viewDirty current $ maybe (Dirty Nothing) keyStatus status of
100100
Clean r -> pure r
101-
Running force val _ -> do
101+
Running _ force val _ -> do
102102
modifyTVar' toForce (Wait force :)
103103
pure val
104104
Dirty s -> do
105105
let act = run (refresh db id s)
106106
(force, val) = splitIO (join act)
107-
SMap.focus (updateStatus $ Running force val s) id databaseValues
107+
SMap.focus (updateStatus $ Running current force val s) id databaseValues
108108
modifyTVar' toForce (Spawn force:)
109109
pure val
110110

hls-graph/src/Development/IDE/Graph/Internal/Types.hs

+13-4
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,21 @@ getDatabaseValues = atomically
113113
data Status
114114
= Clean Result
115115
| Dirty (Maybe Result)
116-
| Running (IO ()) Result (Maybe Result)
116+
| Running {
117+
runningStep :: !Step,
118+
runningWait :: !(IO ()),
119+
runningResult :: Result,
120+
runningPrev :: !(Maybe Result)
121+
}
122+
123+
viewDirty :: Step -> Status -> Status
124+
viewDirty currentStep (Running s _ _ re) | currentStep /= s = Dirty re
125+
viewDirty _ other = other
117126

118127
getResult :: Status -> Maybe Result
119-
getResult (Clean re) = Just re
120-
getResult (Dirty m_re) = m_re
121-
getResult (Running _ _ m_re) = m_re
128+
getResult (Clean re) = Just re
129+
getResult (Dirty m_re) = m_re
130+
getResult (Running _ _ _ m_re) = m_re -- watch out: this returns the previous result
122131

123132
data Result = Result {
124133
resultValue :: !Value,

0 commit comments

Comments
 (0)