Idris2/tests/allschemes/channels006/Main.idr

51 lines
1008 B
Idris
Raw Normal View History

module Main
import System
import System.Concurrency
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
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
extraSleep 10000
consumer : Channel Nat -> IO ()
consumer ch =
do recv
recv
recv
recv
2022-10-03 23:25:05 +03:00
where
recv : IO ()
recv =
do extraSleep 20000
2022-10-03 23:25:05 +03:00
v <- channelGet ch
putStrLn $ "< " ++ show v
main : IO ()
main =
do ch <- makeChannel
p <- fork $ producer ch
c <- fork $ consumer ch
threadWait c
threadWait p
putStrLn "done"