@@ -64,7 +64,7 @@ import qualified Control.Concurrent.STM.TMVar as STM
64
64
import qualified Control.Concurrent.STM.TQueue as STM
65
65
import qualified Control.Concurrent.STM.TSem as STM
66
66
import qualified Control.Concurrent.STM.TVar as STM
67
- import Control.Monad (MonadPlus (.. ), when )
67
+ import Control.Monad (MonadPlus (.. ), unless , when )
68
68
import qualified Control.Monad.STM as STM
69
69
70
70
import Control.Monad.Cont (ContT (.. ))
@@ -151,6 +151,7 @@ class ( Monad m
151
151
tryReadTQueue :: TQueue m a -> STM m (Maybe a )
152
152
peekTQueue :: TQueue m a -> STM m a
153
153
tryPeekTQueue :: TQueue m a -> STM m (Maybe a )
154
+ flushTQueue :: TQueue m a -> STM m [a ]
154
155
writeTQueue :: TQueue m a -> a -> STM m ()
155
156
isEmptyTQueue :: TQueue m a -> STM m Bool
156
157
unGetTQueue :: TQueue m a -> a -> STM m ()
@@ -285,6 +286,10 @@ class ( Monad m
285
286
=> TQueue m a -> STM m (Maybe a)
286
287
tryPeekTQueue = tryPeekTQueueDefault
287
288
289
+ default flushTQueue :: TQueue m ~ TQueueDefault m
290
+ => TQueue m a -> STM m [a]
291
+ flushTQueue = flushTQueueDefault
292
+
288
293
default newTBQueue :: TBQueue m ~ TBQueueDefault m
289
294
=> Natural -> STM m (TBQueue m a)
290
295
newTBQueue = newTBQueueDefault
@@ -683,7 +688,7 @@ instance MonadSTM IO where
683
688
tryReadTQueue = STM. tryReadTQueue
684
689
peekTQueue = STM. peekTQueue
685
690
tryPeekTQueue = STM. tryPeekTQueue
686
- flushTBQueue = STM. flushTBQueue
691
+ flushTQueue = STM. flushTQueue
687
692
writeTQueue = STM. writeTQueue
688
693
isEmptyTQueue = STM. isEmptyTQueue
689
694
unGetTQueue = STM. unGetTQueue
@@ -693,6 +698,7 @@ instance MonadSTM IO where
693
698
peekTBQueue = STM. peekTBQueue
694
699
tryPeekTBQueue = STM. tryPeekTBQueue
695
700
writeTBQueue = STM. writeTBQueue
701
+ flushTBQueue = STM. flushTBQueue
696
702
lengthTBQueue = STM. lengthTBQueue
697
703
isEmptyTBQueue = STM. isEmptyTBQueue
698
704
isFullTBQueue = STM. isFullTBQueue
@@ -940,6 +946,15 @@ tryPeekTQueueDefault (TQueue read _write) = do
940
946
(x: _) -> return (Just x)
941
947
_ -> return Nothing
942
948
949
+
950
+ flushTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m [a ]
951
+ flushTQueueDefault (TQueue read write) = do
952
+ xs <- readTVar read
953
+ ys <- readTVar write
954
+ unless (null xs) $ writeTVar read []
955
+ unless (null ys) $ writeTVar write []
956
+ return (xs ++ reverse ys)
957
+
943
958
unGetTQueueDefault :: MonadSTM m => TQueueDefault m a -> a -> STM m ()
944
959
unGetTQueueDefault (TQueue read _write) a = modifyTVar read (a: )
945
960
@@ -1346,6 +1361,7 @@ instance MonadSTM m => MonadSTM (ContT r m) where
1346
1361
tryReadTQueue = WrappedSTM . tryReadTQueue
1347
1362
peekTQueue = WrappedSTM . peekTQueue
1348
1363
tryPeekTQueue = WrappedSTM . tryPeekTQueue
1364
+ flushTQueue = WrappedSTM . flushTQueue
1349
1365
writeTQueue v = WrappedSTM . writeTQueue v
1350
1366
isEmptyTQueue = WrappedSTM . isEmptyTQueue
1351
1367
unGetTQueue = WrappedSTM .: unGetTQueue
@@ -1420,6 +1436,7 @@ instance MonadSTM m => MonadSTM (ReaderT r m) where
1420
1436
tryReadTQueue = WrappedSTM . tryReadTQueue
1421
1437
peekTQueue = WrappedSTM . peekTQueue
1422
1438
tryPeekTQueue = WrappedSTM . tryPeekTQueue
1439
+ flushTQueue = WrappedSTM . flushTQueue
1423
1440
writeTQueue v = WrappedSTM . writeTQueue v
1424
1441
isEmptyTQueue = WrappedSTM . isEmptyTQueue
1425
1442
unGetTQueue = WrappedSTM .: unGetTQueue
@@ -1494,6 +1511,7 @@ instance (Monoid w, MonadSTM m) => MonadSTM (WriterT w m) where
1494
1511
tryReadTQueue = WrappedSTM . tryReadTQueue
1495
1512
peekTQueue = WrappedSTM . peekTQueue
1496
1513
tryPeekTQueue = WrappedSTM . tryPeekTQueue
1514
+ flushTQueue = WrappedSTM . flushTQueue
1497
1515
writeTQueue v = WrappedSTM . writeTQueue v
1498
1516
isEmptyTQueue = WrappedSTM . isEmptyTQueue
1499
1517
unGetTQueue = WrappedSTM .: unGetTQueue
@@ -1568,6 +1586,7 @@ instance MonadSTM m => MonadSTM (StateT s m) where
1568
1586
tryReadTQueue = WrappedSTM . tryReadTQueue
1569
1587
peekTQueue = WrappedSTM . peekTQueue
1570
1588
tryPeekTQueue = WrappedSTM . tryPeekTQueue
1589
+ flushTQueue = WrappedSTM . flushTQueue
1571
1590
writeTQueue v = WrappedSTM . writeTQueue v
1572
1591
isEmptyTQueue = WrappedSTM . isEmptyTQueue
1573
1592
unGetTQueue = WrappedSTM .: unGetTQueue
@@ -1642,6 +1661,7 @@ instance MonadSTM m => MonadSTM (ExceptT e m) where
1642
1661
tryReadTQueue = WrappedSTM . tryReadTQueue
1643
1662
peekTQueue = WrappedSTM . peekTQueue
1644
1663
tryPeekTQueue = WrappedSTM . tryPeekTQueue
1664
+ flushTQueue = WrappedSTM . flushTQueue
1645
1665
writeTQueue v = WrappedSTM . writeTQueue v
1646
1666
isEmptyTQueue = WrappedSTM . isEmptyTQueue
1647
1667
unGetTQueue = WrappedSTM .: unGetTQueue
@@ -1716,6 +1736,7 @@ instance (Monoid w, MonadSTM m) => MonadSTM (RWST r w s m) where
1716
1736
tryReadTQueue = WrappedSTM . tryReadTQueue
1717
1737
peekTQueue = WrappedSTM . peekTQueue
1718
1738
tryPeekTQueue = WrappedSTM . tryPeekTQueue
1739
+ flushTQueue = WrappedSTM . flushTQueue
1719
1740
writeTQueue v = WrappedSTM . writeTQueue v
1720
1741
isEmptyTQueue = WrappedSTM . isEmptyTQueue
1721
1742
unGetTQueue = WrappedSTM .: unGetTQueue
0 commit comments