packages feed

consistent-0.0.1: test/main.hs

module Main where

import Control.Concurrent
import Control.Concurrent.Async.Lifted
import Control.Concurrent.Consistent
-- import Control.Exception
import Control.Monad hiding (forM_, mapM_)
import Control.Monad.IO.Class
import Debug.Trace
import Prelude hiding (log)
import Prelude hiding (log, mapM_)
--import Test.Hspec

-- tryAny :: IO a -> IO (Either SomeException a)
-- tryAny = try

-- main :: IO ()
-- main = hspec $ do
--     describe "simple logging" $ do
--         it "logs output" $ True `shouldBe` True

main :: IO ()
main = do
    test <- async $ void $ runConsistentT $ do
        u <- newCVar 0
        v <- newCVar 0
        mapConcurrently worker $
            flip map [1..100 :: Int] $ \i -> (u, v, i)
    wait test
  where
    worker (pu, pv, i) = do
        u <- dupCVar pu
        v <- dupCVar pv
        replicateM_ 100 $ do
            consistently $ do
                x <- readCVar u
                writeCVar u i
                y <- readCVar v
                writeCVar v i
                trace (show (x, y)) $ return ()
            liftIO $ threadDelay (i * 1000)