forked from haskell/haskell-language-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStrict.hs
35 lines (30 loc) · 1.15 KB
/
Strict.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
module Control.Concurrent.Strict
(modifyVar', modifyVarIO'
,modifyVar, modifyVar_
,module Control.Concurrent.Extra
) where
import Control.Concurrent.Extra hiding (modifyVar, modifyVar',
modifyVar_)
import qualified Control.Concurrent.Extra as Extra
import Control.Exception (evaluate)
import Control.Monad (void)
import Data.Tuple.Extra (dupe)
-- | Strict modification that returns the new value
modifyVar' :: Extra.Var a -> (a -> a) -> IO a
modifyVar' var upd = modifyVarIO' var (pure . upd)
-- | Strict modification that returns the new value
modifyVarIO' :: Extra.Var a -> (a -> IO a) -> IO a
modifyVarIO' var upd = do
res <- Extra.modifyVar var $ \v -> do
v' <- upd v
pure $ dupe v'
evaluate res
modifyVar :: Extra.Var a -> (a -> IO (a, b)) -> IO b
modifyVar var upd = do
(new, res) <- Extra.modifyVar var $ \old -> do
(new,res) <- upd old
return (new, (new, res))
void $ evaluate new
return res
modifyVar_ :: Extra.Var a -> (a -> IO a) -> IO ()
modifyVar_ var upd = void $ modifyVarIO' var upd