Skip to content

Commit e9a96f7

Browse files
committed
io-sim-classes: added missing api
* swapTVar * readTVarIO * newTQueueIO both MonadSTM and MonadSTM.Strict modules are updated.
1 parent 1b8f364 commit e9a96f7

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

io-sim-classes/src/Control/Monad/Class/MonadSTM.hs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ class ( Monad stm
114114
stateTVar :: TVar_ stm s -> (s -> (a, s)) -> stm a
115115
stateTVar = stateTVarDefault
116116

117+
swapTVar :: TVar_ stm a -> a -> stm a
118+
swapTVar = swapTVarDefault
119+
117120
check :: Bool -> stm ()
118121
check True = return ()
119122
check _ = retry
@@ -161,6 +164,11 @@ stateTVarDefault var f = do
161164
writeTVar var s'
162165
return a
163166

167+
swapTVarDefault :: MonadSTMTx stm => TVar_ stm a -> a -> stm a
168+
swapTVarDefault var new = do
169+
old <- readTVar var
170+
writeTVar var new
171+
return old
164172

165173
type TVar m = TVar_ (STM m)
166174
type TMVar m = TMVar_ (STM m)
@@ -176,13 +184,17 @@ class (Monad m, MonadSTMTx (STM m)) => MonadSTM m where
176184
-- Helpful derived functions with default implementations
177185

178186
newTVarIO :: a -> m (TVar m a)
187+
readTVarIO :: TVar m a -> m a
179188
newTMVarIO :: a -> m (TMVar m a)
180189
newEmptyTMVarIO :: m (TMVar m a)
190+
newTQueueIO :: m (TQueue m a)
181191
newTBQueueIO :: Natural -> m (TBQueue m a)
182192

183193
newTVarIO = atomically . newTVar
194+
readTVarIO = atomically . readTVar
184195
newTMVarIO = atomically . newTMVar
185196
newEmptyTMVarIO = atomically newEmptyTMVar
197+
newTQueueIO = atomically newTQueue
186198
newTBQueueIO = atomically . newTBQueue
187199

188200

@@ -247,6 +259,7 @@ instance MonadSTMTx STM.STM where
247259
modifyTVar = STM.modifyTVar
248260
modifyTVar' = STM.modifyTVar'
249261
stateTVar = STM.stateTVar
262+
swapTVar = STM.swapTVar
250263
check = STM.check
251264
newTMVar = STM.newTMVar
252265
newEmptyTMVar = STM.newEmptyTMVar
@@ -283,8 +296,10 @@ instance MonadSTM IO where
283296
atomically = wrapBlockedIndefinitely . STM.atomically
284297

285298
newTVarIO = STM.newTVarIO
299+
readTVarIO = STM.readTVarIO
286300
newTMVarIO = STM.newTMVarIO
287301
newEmptyTMVarIO = STM.newEmptyTMVarIO
302+
newTQueueIO = STM.newTQueueIO
288303
newTBQueueIO = STM.newTBQueueIO
289304

290305
-- | noop instance
@@ -327,8 +342,10 @@ instance MonadSTM m => MonadSTM (ReaderT r m) where
327342
type STM (ReaderT r m) = STM m
328343
atomically = lift . atomically
329344
newTVarIO = lift . newTVarM
345+
readTVarIO = lift . readTVarIO
330346
newTMVarIO = lift . newTMVarM
331347
newEmptyTMVarIO = lift newEmptyTMVarM
348+
newTQueueIO = lift newTQueueIO
332349
newTBQueueIO = lift . newTBQueueIO
333350

334351
--

io-sim-classes/src/Control/Monad/Class/MonadSTM/Strict.hs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ module Control.Monad.Class.MonadSTM.Strict
2222
, newTVarIO
2323
, newTVarWithInvariantIO
2424
, readTVar
25+
, readTVarIO
2526
, writeTVar
2627
, modifyTVar
2728
, stateTVar
29+
, swapTVar
2830
-- * 'StrictTMVar'
2931
, StrictTMVar
3032
, labelTMVar
@@ -57,8 +59,9 @@ import Control.Monad.Class.MonadSTM as X hiding (LazyTMVar, LazyTVar,
5759
labelTMVar, labelTMVarIO, modifyTVar, newEmptyTMVar,
5860
newEmptyTMVarIO, newEmptyTMVarM, newTMVar, newTMVarIO,
5961
newTMVarM, newTVar, newTVarIO, newTVarM, putTMVar,
60-
readTMVar, readTVar, stateTVar, swapTMVar, takeTMVar,
61-
tryPutTMVar, tryReadTMVar, tryTakeTMVar, writeTVar)
62+
readTMVar, readTVarIO, readTVar, stateTVar, swapTVar,
63+
swapTMVar, takeTMVar, tryPutTMVar, tryReadTMVar,
64+
tryTakeTMVar, writeTVar)
6265
import qualified Control.Monad.Class.MonadSTM as Lazy
6366
import GHC.Stack
6467

@@ -98,6 +101,7 @@ toLazyTVar StrictTVar { tvar } = tvar
98101

99102
newTVar :: MonadSTM m => a -> STM m (StrictTVar m a)
100103
newTVar !a = StrictTVar (const Nothing) <$> Lazy.newTVar a
104+
101105
newTVarIO :: MonadSTM m => a -> m (StrictTVar m a)
102106
newTVarIO = newTVarWithInvariantIO (const Nothing)
103107

@@ -123,6 +127,9 @@ newTVarWithInvariantM = newTVarWithInvariantIO
123127
readTVar :: MonadSTM m => StrictTVar m a -> STM m a
124128
readTVar StrictTVar { tvar } = Lazy.readTVar tvar
125129

130+
readTVarIO :: MonadSTM m => StrictTVar m a -> m a
131+
readTVarIO StrictTVar { tvar } = Lazy.readTVarIO tvar
132+
126133
writeTVar :: (MonadSTM m, HasCallStack) => StrictTVar m a -> a -> STM m ()
127134
writeTVar StrictTVar { tvar, invariant } !a =
128135
checkInvariant (invariant a) $
@@ -138,6 +145,13 @@ stateTVar v f = do
138145
writeTVar v a'
139146
return b
140147

148+
swapTVar :: MonadSTM m => StrictTVar m a -> a -> STM m a
149+
swapTVar v a' = do
150+
a <- readTVar v
151+
writeTVar v a'
152+
return a
153+
154+
141155
updateTVar :: MonadSTM m => StrictTVar m a -> (a -> (a, b)) -> STM m b
142156
updateTVar = stateTVar
143157
{-# DEPRECATED updateTVar "Use stateTVar" #-}

0 commit comments

Comments
 (0)