@@ -11,7 +11,8 @@ module Development.IDE.Core.Debouncer
11
11
import Control.Concurrent.Async
12
12
import Control.Concurrent.Extra
13
13
import Control.Exception
14
- import Control.Monad.Extra
14
+ import Control.Monad (join )
15
+ import Data.Foldable (traverse_ )
15
16
import Data.HashMap.Strict (HashMap )
16
17
import qualified Data.HashMap.Strict as Map
17
18
import Data.Hashable
@@ -40,18 +41,18 @@ newAsyncDebouncer = Debouncer . asyncRegisterEvent <$> newVar Map.empty
40
41
-- to mask if required.
41
42
asyncRegisterEvent :: (Eq k , Hashable k ) => Var (HashMap k (Async () )) -> Seconds -> k -> IO () -> IO ()
42
43
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)
46
47
fire
47
48
asyncRegisterEvent d delay k fire = do
48
49
a <- asyncWithUnmask $ \ unmask -> unmask $ do
49
50
sleep delay
50
51
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)
55
56
56
57
-- | Debouncer used in the DAML CLI compiler that emits events immediately.
57
58
noopDebouncer :: Debouncer k
0 commit comments