Hi,
I'm getting strange behavior when using the 'many' combinator to read zero or more items off of a TQueue with readTQueue. The script that exhibits this behavior is as follows:
import Control.Concurrent.STM
import Control.Concurrent
import Control.Monad
import Control.Applicative
main = do
q <- newTQueueIO
atomically $ writeTQueue q True
atomically $ writeTQueue q False
forever $ do
xs <- atomically $ many $ readTQueue q
print xs
threadDelay 500000
I'd expect the output of the script to be:
[True,False]
[]
[]
...
However, that is not the case: the actual output of the script is:
[True,False]
[True,False]
[True,False]
...
This means that TQueue is incompatible with TChan, since if TQueue is replaced by TChan then the script behaves as one would expect.
If 1 element (say, True) is written into the TQueue instead of 2, then the output of the script is:
[True]
[]
[]
...
Which is expected behavior, but inconsistent with the behavior when the TQueue has 2 or more elements in it.
Is this considered a bug, or undocumented behavior of TQueue?