0 | module System.Concurrency.Linear
2 | import Control.Linear.LIO
3 | import System.Concurrency
7 | fork1 : L IO () -@ L IO ThreadID
8 | fork1 act = liftIO1 $
fork $
LIO.run act
13 | concurrently : L IO a -@ L1 IO (L IO a)
14 | concurrently act = do
19 | pure1 $
channelGet ch
34 | concurrently1 : L1 IO a -@ L1 IO (L1 IO a)
35 | concurrently1 act = do
37 | _ <- fork1 $
withChannel ch act
48 | withChannel : Channel t -> L1 IO t -@ L IO ()
49 | withChannel ch = assert_linear $
\ act => do
51 | assert_linear (channelPut ch) a
56 | par1 : L1 IO a -@ L1 IO b -@ L1 IO (LPair a b)
59 | recva <- concurrently1 ioa
60 | recvb <- concurrently1 iob
69 | par : L IO a -@ L IO b -@ L IO (a, b)
71 | (MkBang a # MkBang b) <- par1 (bang x) (bang y)