module Language.Embedded.Concurrent (
ThreadId (..),
ChanBound, Chan (..),
ThreadCMD,
ChanCMD,
Closeable, Uncloseable,
fork, forkWithId, asyncKillThread, killThread, waitThread,
newChan, newCloseableChan, readChan, writeChan,
closeChan, lastChanReadOK,
) where
import Control.Monad.Operational.Higher
import Language.Embedded.Expression
import Language.Embedded.Concurrent.CMD
import Language.Embedded.Concurrent.Backend.C ()
fork :: (ThreadCMD :<: instr)
=> ProgramT instr (Param2 exp pred) m ()
-> ProgramT instr (Param2 exp pred) m ThreadId
fork = forkWithId . const
forkWithId :: (ThreadCMD :<: instr)
=> (ThreadId -> ProgramT instr (Param2 exp pred) m ())
-> ProgramT instr (Param2 exp pred) m ThreadId
forkWithId = singleton . inj . ForkWithId
asyncKillThread :: (ThreadCMD :<: instr)
=> ThreadId -> ProgramT instr (Param2 exp pred) m ()
asyncKillThread = singleton . inj . Kill
killThread :: (ThreadCMD :<: instr, Monad m)
=> ThreadId -> ProgramT instr (Param2 exp pred) m ()
killThread t = do
singleton . inj $ Kill t
waitThread t
waitThread :: (ThreadCMD :<: instr)
=> ThreadId -> ProgramT instr (Param2 exp pred) m ()
waitThread = singleton . inj . Wait
newChan :: (pred a, ChanCMD :<: instr)
=> exp ChanBound
-> ProgramT instr (Param2 exp pred) m (Chan Uncloseable a)
newChan = singleInj . NewChan
newCloseableChan :: (pred a, ChanCMD :<: instr)
=> exp ChanBound
-> ProgramT instr (Param2 exp pred) m (Chan Closeable a)
newCloseableChan = singleInj . NewChan
readChan :: (pred a, FreeExp exp, VarPred exp a, ChanCMD :<: instr, Monad m)
=> Chan t a
-> ProgramT instr (Param2 exp pred) m (exp a)
readChan = fmap valToExp . singleInj . ReadChan
writeChan :: (pred a,
FreeExp exp,
VarPred exp Bool,
ChanCMD :<: instr,
Monad m
)
=> Chan t a
-> exp a
-> ProgramT instr (Param2 exp pred) m (exp Bool)
writeChan c = fmap valToExp . singleInj . WriteChan c
lastChanReadOK :: (FreeExp exp, VarPred exp Bool, ChanCMD :<: instr, Monad m)
=> Chan Closeable a
-> ProgramT instr (Param2 exp pred) m (exp Bool)
lastChanReadOK = fmap valToExp . singleInj . ReadOK
closeChan :: (ChanCMD :<: instr)
=> Chan Closeable a
-> ProgramT instr (Param2 exp pred) m ()
closeChan = singleInj . CloseChan