@@ -0,0 +1,97 @@
1+-- | Lifted version of "Control.Concurrent.MVar".
2+module Effectful.Concurrent.MVar
3+ ( MVar
4+ , newEmptyMVar
5+ , newMVar
6+ , takeMVar
7+ , putMVar
8+ , readMVar
9+ , swapMVar
10+ , tryTakeMVar
11+ , tryPutMVar
12+ , isEmptyMVar
13+ , withMVar
14+ , withMVarMasked
15+ , modifyMVar
16+ , modifyMVar_
17+ , modifyMVarMasked
18+ , modifyMVarMasked_
19+ , tryReadMVar
20+ , mkWeakMVar
21+ ) where
22+
23+import System.Mem.Weak (Weak)
24+import Control.Concurrent.MVar (MVar)
25+import qualified Control.Concurrent.MVar as M
26+
27+import Effectful.Concurrent.Internal
28+import Effectful.Internal.Effect
29+import Effectful.Internal.Monad
30+
31+-- | Lifted 'M.newEmptyMVar'.
32+newEmptyMVar :: Concurrent :> es => Eff es (MVar a)
33+newEmptyMVar = unsafeEff_ M.newEmptyMVar
34+
35+-- | Lifted 'M.newMVar'.
36+newMVar :: Concurrent :> es => a -> Eff es (MVar a)
37+newMVar = unsafeEff_ . M.newMVar
38+
39+-- | Lifted 'M.takeMVar'.
40+takeMVar :: Concurrent :> es => MVar a -> Eff es a
41+takeMVar = unsafeEff_ . M.takeMVar
42+
43+-- | Lifted 'M.putMVar'.
44+putMVar :: Concurrent :> es => MVar a -> a -> Eff es ()
45+putMVar var = unsafeEff_ . M.putMVar var
46+
47+-- | Lifted 'M.readMVar'.
48+readMVar :: Concurrent :> es => MVar a -> Eff es a
49+readMVar = unsafeEff_ . M.readMVar
50+
51+-- | Lifted 'M.swapMVar'.
52+swapMVar :: Concurrent :> es => MVar a -> a -> Eff es a
53+swapMVar var = unsafeEff_ . M.swapMVar var
54+
55+-- | Lifted 'M.tryTakeMVar'.
56+tryTakeMVar :: Concurrent :> es => MVar a -> Eff es (Maybe a)
57+tryTakeMVar = unsafeEff_ . M.tryTakeMVar
58+
59+-- | Lifted 'M.tryPutMVar'.
60+tryPutMVar :: Concurrent :> es => MVar a -> a -> Eff es Bool
61+tryPutMVar var = unsafeEff_ . M.tryPutMVar var
62+
63+-- | Lifted 'M.isEmptyMVar'.
64+isEmptyMVar :: Concurrent :> es => MVar a -> Eff es Bool
65+isEmptyMVar = unsafeEff_ . M.isEmptyMVar
66+
67+-- | Lifted 'M.tryReadMVar'.
68+tryReadMVar :: Concurrent :> es => MVar a -> Eff es (Maybe a)
69+tryReadMVar = unsafeEff_ . M.tryReadMVar
70+
71+-- | Lifted 'M.withMVar'.
72+withMVar :: Concurrent :> es => MVar a -> (a -> Eff es b) -> Eff es b
73+withMVar var f = unsafeEff $ \es -> M.withMVar var ((`unEff` es) . f)
74+
75+-- | Lifted 'M.withMVarMasked'.
76+withMVarMasked :: Concurrent :> es => MVar a -> (a -> Eff es b) -> Eff es b
77+withMVarMasked var f = unsafeEff $ \es -> M.withMVarMasked var ((`unEff` es) . f)
78+
79+-- | Lifted 'M.modifyMVar_'.
80+modifyMVar_ :: Concurrent :> es => MVar a -> (a -> Eff es a) -> Eff es ()
81+modifyMVar_ var f = unsafeEff $ \es -> M.modifyMVar_ var ((`unEff` es) . f)
82+
83+-- | Lifted 'M.modifyMVar'.
84+modifyMVar :: Concurrent :> es => MVar a -> (a -> Eff es (a, b)) -> Eff es b
85+modifyMVar var f = unsafeEff $ \es -> M.modifyMVar var ((`unEff` es) . f)
86+
87+-- | Lifted 'M.modifyMVarMasked_'.
88+modifyMVarMasked_ :: Concurrent :> es => MVar a -> (a -> Eff es a) -> Eff es ()
89+modifyMVarMasked_ var f = unsafeEff $ \es -> M.modifyMVarMasked_ var ((`unEff` es) . f)
90+
91+-- | Lifted 'M.modifyMVarMasked'.
92+modifyMVarMasked :: Concurrent :> es => MVar a -> (a -> Eff es (a, b)) -> Eff es b
93+modifyMVarMasked var f = unsafeEff $ \es -> M.modifyMVarMasked var ((`unEff` es) . f)
94+
95+-- | Lifted 'M.mkWeakMVar'.
96+mkWeakMVar :: Concurrent :> es => MVar a -> Eff es () -> Eff es (Weak (MVar a))
97+mkWeakMVar var f = unsafeEff $ \es -> M.mkWeakMVar var ((`unEff` es) f)