packages feed

rolling-queue-0.1: testing/trivial.hs

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