mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-26 13:11:30 +03:00
29 lines
690 B
Idris
29 lines
690 B
Idris
|
import Data.List
|
||
|
import System.Concurrency
|
||
|
|
||
|
consumer : Channel Nat -> IO ()
|
||
|
consumer c =
|
||
|
do (S k) <- channelGet c
|
||
|
| Z => pure ()
|
||
|
consumer c
|
||
|
|
||
|
producer : Channel Nat -> IO ()
|
||
|
producer c = ignore $ traverse (\n => channelPut c n) [1..100]
|
||
|
|
||
|
nConsumers : Nat
|
||
|
nConsumers = 3
|
||
|
|
||
|
nProducers : Nat
|
||
|
nProducers = 5
|
||
|
|
||
|
main : IO ()
|
||
|
main =
|
||
|
do c <- makeChannel
|
||
|
cTIDs <- for (replicate nConsumers 0) $ \_ => fork (consumer c)
|
||
|
pTIDs <- for (replicate nProducers 0) $ \_ => fork (producer c)
|
||
|
ignore $ traverse (\t => threadWait t) pTIDs
|
||
|
ignore $ for (replicate nConsumers 0) $ \_ => channelPut c Z
|
||
|
ignore $ traverse (\t => threadWait t) cTIDs
|
||
|
putStrLn "SUCCESS!!!"
|
||
|
|