2022-09-30 07:18:15 +03:00
|
|
|
module Main
|
|
|
|
|
|
|
|
import System
|
|
|
|
import System.Concurrency
|
2022-10-05 14:03:20 +03:00
|
|
|
import System.Info
|
|
|
|
|
|
|
|
-- Taken from tests/chez/futures001
|
|
|
|
|
|
|
|
-- Issue in MacOS brew chez related to clock ( https://github.com/Homebrew/homebrew-core/pull/10159 )
|
|
|
|
-- Windows seems to be really flaky with usleep
|
|
|
|
extraSleep : (us : Int) -> So (us >= 0) => IO ()
|
|
|
|
extraSleep us =
|
|
|
|
if (os == "darwin" || isWindows)
|
|
|
|
then sleep (us `div` 10000)
|
|
|
|
else usleep us
|
2022-09-30 07:18:15 +03:00
|
|
|
|
|
|
|
producer : Channel Nat -> IO ()
|
|
|
|
producer ch =
|
|
|
|
do send 1
|
|
|
|
send 2
|
|
|
|
send 3
|
|
|
|
send 4
|
2022-10-03 23:25:05 +03:00
|
|
|
where
|
|
|
|
send : Nat -> IO ()
|
|
|
|
send i =
|
|
|
|
do putStrLn $ "> " ++ show i
|
|
|
|
channelPut ch i
|
2022-10-05 14:03:20 +03:00
|
|
|
extraSleep 10000
|
2022-09-30 07:18:15 +03:00
|
|
|
|
|
|
|
consumer : Channel Nat -> IO ()
|
|
|
|
consumer ch =
|
|
|
|
do recv
|
|
|
|
recv
|
|
|
|
recv
|
|
|
|
recv
|
2022-10-03 23:25:05 +03:00
|
|
|
where
|
|
|
|
recv : IO ()
|
|
|
|
recv =
|
2022-10-05 14:03:20 +03:00
|
|
|
do extraSleep 20000
|
2022-10-03 23:25:05 +03:00
|
|
|
v <- channelGet ch
|
|
|
|
putStrLn $ "< " ++ show v
|
2022-09-30 07:18:15 +03:00
|
|
|
|
|
|
|
main : IO ()
|
|
|
|
main =
|
|
|
|
do ch <- makeChannel
|
|
|
|
p <- fork $ producer ch
|
|
|
|
c <- fork $ consumer ch
|
|
|
|
threadWait c
|
|
|
|
threadWait p
|
|
|
|
putStrLn "done"
|