packages feed

data-vector-growable-0.0.1: tests/push.hs

{-# 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)]