MicroHs-0.13.0.0: tests/MVar.hs
module MVar where
import Control.Concurrent
import Control.Concurrent.MVar
delay :: Int -> IO ()
delay i = loop i `seq` return ()
loop :: Int -> Int
loop i = if i == 0 then 0 else loop $! (i-1)
fun :: MVar Int -> IO ()
fun mv = do
putStrLn "fun A"
i <- takeMVar mv
print i
putStrLn "fun B"
main :: IO ()
main = do
test1
putStrLn "---"
test2
test1 :: IO ()
test1 = do
putStrLn "test1 A"
mvar <- newEmptyMVar
forkIO (fun mvar)
putStrLn "test1 B"
delay 100000
putStrLn "test1 C"
putMVar mvar 999
putStrLn "test1 D"
putMVar mvar 888
putStrLn "test1 E"
forkIO (delay 100000 >> fun mvar)
putMVar mvar 777
putStrLn "test1 F"
delay 100000
fun mvar
delay 100000
putStrLn "test1 G"
test2 :: IO ()
test2 = do
mvar1 <- newEmptyMVar
tryTakeMVar mvar1 >>= print
putStrLn "test2 A"
putMVar mvar1 (111::Int)
putStrLn "test2 B"
tryPutMVar mvar1 222 >>= print
tryTakeMVar mvar1 >>= print
tryPutMVar mvar1 333 >>= print
mvar2 <- newMVar (333::Int)
tryReadMVar mvar2 >>= print
tryReadMVar mvar2 >>= print