import Prelude hiding (read) import Data.STM.RollingQueue (RollingQueue) import qualified Data.STM.RollingQueue as RQ import Control.Concurrent.STM import Control.Monad dump :: Show a => RollingQueue a -> String -> IO () dump rq label = do putStrLn $ label ++ ":" RQ.dump rq putStrLn "" main :: IO () main = do rq <- RQ.newIO 5 :: IO (RollingQueue Int) dump rq "newIO 5" let empty = do atomically $ do Nothing <- RQ.tryRead rq True <- RQ.isEmpty rq 0 <- RQ.length rq return () dump rq "read rq, isEmpty" write x = do atomically $ do RQ.write rq x False <- RQ.isEmpty rq return () dump rq $ "write rq " ++ show x read = do p <- atomically $ do False <- RQ.isEmpty rq RQ.read rq dump rq $ "read rq " ++ show p setLimit n = do atomically $ RQ.setLimit rq n dump rq $ "setLimit rq " ++ show n empty mapM_ write [1..10] replicateM_ 5 read empty mapM_ write [11..16] read 4 <- atomically $ RQ.length rq 5 <- atomically $ RQ.getLimit rq setLimit 3 setLimit 10 mapM_ write [17..30] replicateM_ 3 read setLimit (-5) 0 <- atomically $ RQ.getLimit rq forM_ [31..35] $ \i -> do atomically $ RQ.write rq i True <- atomically $ RQ.isEmpty rq dump rq $ "write rq " ++ show i ++ " (limit is 0)" empty setLimit 1 write 36 read write 37 read write 38 write 39 read empty