File tree Expand file tree Collapse file tree 2 files changed +23
-5
lines changed Expand file tree Collapse file tree 2 files changed +23
-5
lines changed Original file line number Diff line number Diff line change @@ -96,9 +96,9 @@ tryPeekTQueueDefault (TQueue queue) = do
96
96
97
97
flushTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m [a ]
98
98
flushTQueueDefault (TQueue queue) = do
99
- xs <- uncurry (++ ) <$> readTVar queue
99
+ (xs, ys ) <- readTVar queue
100
100
writeTVar queue ([] , [] )
101
- pure xs
101
+ pure (xs <> reverse ys)
102
102
103
103
unGetTQueueDefault :: MonadSTM m => TQueueDefault m a -> a -> STM m ()
104
104
unGetTQueueDefault (TQueue queue) a = do
Original file line number Diff line number Diff line change @@ -177,7 +177,11 @@ tests =
177
177
prop_registerDelayCancellable_IO
178
178
]
179
179
, testGroup " MonadSTM"
180
- [ testProperty " flushTQueue empties the queue" prop_flushTQueue ]
180
+ [ testGroup " flushTQueue"
181
+ [ testProperty " empties the queue" prop_flushTQueueEmpties
182
+ , testProperty " maintains FIFO order" prop_flushTQueueOrder
183
+ ]
184
+ ]
181
185
]
182
186
183
187
--
@@ -1350,8 +1354,9 @@ prop_registerDelayCancellable_IO =
1350
1354
cancelTimeout
1351
1355
awaitTimeout
1352
1356
1353
- prop_flushTQueue :: Property
1354
- prop_flushTQueue =
1357
+ -- | Test that 'flushTQueue' empties the queue.
1358
+ prop_flushTQueueEmpties :: Property
1359
+ prop_flushTQueueEmpties =
1355
1360
ioProperty emptyQueueAfterFlush
1356
1361
.&&. runSimOrThrow emptyQueueAfterFlush
1357
1362
@@ -1363,6 +1368,19 @@ emptyQueueAfterFlush = do
1363
1368
_ <- flushTQueue q
1364
1369
isEmptyTQueue q
1365
1370
1371
+ -- | Test that 'flushTQueue' returns values in FIFO order.
1372
+ prop_flushTQueueOrder :: [Int ] -> Property
1373
+ prop_flushTQueueOrder entries =
1374
+ ioProperty (writeAndFlushQueue entries >>= \ actual -> pure $ actual === entries)
1375
+ .&&. runSimOrThrow (writeAndFlushQueue entries) === entries
1376
+
1377
+ writeAndFlushQueue :: MonadSTM m => [Int ] -> m [Int ]
1378
+ writeAndFlushQueue entries =
1379
+ atomically $ do
1380
+ q <- newTQueue
1381
+ forM_ entries $ writeTQueue q
1382
+ flushTQueue q
1383
+
1366
1384
--
1367
1385
-- Utils
1368
1386
--
You can’t perform that action at this time.
0 commit comments