@@ -114,6 +114,9 @@ class ( Monad stm
114
114
stateTVar :: TVar_ stm s -> (s -> (a , s )) -> stm a
115
115
stateTVar = stateTVarDefault
116
116
117
+ swapTVar :: TVar_ stm a -> a -> stm a
118
+ swapTVar = swapTVarDefault
119
+
117
120
check :: Bool -> stm ()
118
121
check True = return ()
119
122
check _ = retry
@@ -161,6 +164,11 @@ stateTVarDefault var f = do
161
164
writeTVar var s'
162
165
return a
163
166
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
164
172
165
173
type TVar m = TVar_ (STM m )
166
174
type TMVar m = TMVar_ (STM m )
@@ -176,13 +184,17 @@ class (Monad m, MonadSTMTx (STM m)) => MonadSTM m where
176
184
-- Helpful derived functions with default implementations
177
185
178
186
newTVarIO :: a -> m (TVar m a )
187
+ readTVarIO :: TVar m a -> m a
179
188
newTMVarIO :: a -> m (TMVar m a )
180
189
newEmptyTMVarIO :: m (TMVar m a )
190
+ newTQueueIO :: m (TQueue m a )
181
191
newTBQueueIO :: Natural -> m (TBQueue m a )
182
192
183
193
newTVarIO = atomically . newTVar
194
+ readTVarIO = atomically . readTVar
184
195
newTMVarIO = atomically . newTMVar
185
196
newEmptyTMVarIO = atomically newEmptyTMVar
197
+ newTQueueIO = atomically newTQueue
186
198
newTBQueueIO = atomically . newTBQueue
187
199
188
200
@@ -247,6 +259,7 @@ instance MonadSTMTx STM.STM where
247
259
modifyTVar = STM. modifyTVar
248
260
modifyTVar' = STM. modifyTVar'
249
261
stateTVar = STM. stateTVar
262
+ swapTVar = STM. swapTVar
250
263
check = STM. check
251
264
newTMVar = STM. newTMVar
252
265
newEmptyTMVar = STM. newEmptyTMVar
@@ -283,8 +296,11 @@ instance MonadSTM IO where
283
296
atomically = wrapBlockedIndefinitely . STM. atomically
284
297
285
298
newTVarIO = STM. newTVarIO
299
+ readTVarIO = STM. readTVarIO
286
300
newTMVarIO = STM. newTMVarIO
287
301
newEmptyTMVarIO = STM. newEmptyTMVarIO
302
+ newTQueueIO = STM. newTQueueIO
303
+ newTBQueueIO = STM. newTBQueueIO
288
304
289
305
-- | noop instance
290
306
--
@@ -326,8 +342,11 @@ instance MonadSTM m => MonadSTM (ReaderT r m) where
326
342
type STM (ReaderT r m ) = STM m
327
343
atomically = lift . atomically
328
344
newTVarIO = lift . newTVarM
345
+ readTVarIO = lift . readTVarIO
329
346
newTMVarIO = lift . newTMVarM
330
347
newEmptyTMVarIO = lift newEmptyTMVarM
348
+ newTQueueIO = lift newTQueueIO
349
+ newTBQueueIO = lift . newTBQueueIO
331
350
332
351
--
333
352
-- Default TMVar implementation in terms of TVars (used by sim)
0 commit comments