{-# LANGUAGE LambdaCase #-} import Data.Vector.Growable import Control.Concurrent.Async (mapConcurrently_) import Control.Concurrent (yield, threadDelay) import Control.Monad (unless) main :: IO () main = do vec <- new :: IO (GrowableIOVector Int) let step i = atomicPush vec i let popper count = atomicPop vec >>= \case Nothing -> yield >> popper count Just (-1) -> do putStrLn $ "Count: " <> show count unless (count == 5608) $ fail "this is not expected" Just _ -> popper $! count + 1 mapConcurrently_ id $ popper (0 :: Int) : [ mapM_ step [0..i * 200] | i <- [0..7] ] ++ [ threadDelay 1000000 >> atomicPush vec (-1)]