Skip to content

Commit 41850eb

Browse files
committed
Tighten the Debouncer
1 parent ac3943c commit 41850eb

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

ghcide/src/Development/IDE/Core/Debouncer.hs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ module Development.IDE.Core.Debouncer
1111
import Control.Concurrent.Async
1212
import Control.Concurrent.Extra
1313
import Control.Exception
14-
import Control.Monad.Extra
14+
import Control.Monad (join)
15+
import Data.Foldable (traverse_)
1516
import Data.HashMap.Strict (HashMap)
1617
import qualified Data.HashMap.Strict as Map
1718
import Data.Hashable
@@ -40,18 +41,18 @@ newAsyncDebouncer = Debouncer . asyncRegisterEvent <$> newVar Map.empty
4041
-- to mask if required.
4142
asyncRegisterEvent :: (Eq k, Hashable k) => Var (HashMap k (Async ())) -> Seconds -> k -> IO () -> IO ()
4243
asyncRegisterEvent d 0 k fire = do
43-
modifyVar_ d $ \m -> mask_ $ do
44-
whenJust (Map.lookup k m) cancel
45-
pure $ Map.delete k m
44+
join $ modifyVar d $ \m -> do
45+
(cancel, !m') <- evaluate $ Map.alterF (\prev -> (traverse_ cancel prev, Nothing)) k m
46+
return (m', cancel)
4647
fire
4748
asyncRegisterEvent d delay k fire = do
4849
a <- asyncWithUnmask $ \unmask -> unmask $ do
4950
sleep delay
5051
fire
51-
modifyVar_ d (pure . Map.delete k)
52-
modifyVar_ d $ \m -> mask_ $ do
53-
whenJust (Map.lookup k m) cancel
54-
pure $ Map.insert k a m
52+
modifyVar_ d (evaluate . Map.delete k)
53+
join $ modifyVar d $ \m -> mask_ $ do
54+
(cancel, !m') <- evaluate $ Map.alterF (\prev -> (traverse_ cancel prev, Just a)) k m
55+
return (m', cancel)
5556

5657
-- | Debouncer used in the DAML CLI compiler that emits events immediately.
5758
noopDebouncer :: Debouncer k

0 commit comments

Comments
 (0)