module Language.Embedded.Concurrent
( ThreadId (..)
, Chan (..)
, ChanSize (..)
, ThreadCMD
, ChanCMD
, Closeable, Uncloseable
, fork, forkWithId, asyncKillThread, killThread, waitThread, delayThread
, timesSizeOf, timesSize, plusSize
, newChan, newCloseableChan
, readChan, writeChan
, readChanBuf, writeChanBuf
, closeChan, lastChanReadOK
, newChan', newCloseableChan'
, readChan', writeChan'
, readChanBuf', writeChanBuf'
) where
import Control.Monad.Operational.Higher
import Data.Ix
import Data.Typeable
import Language.Embedded.Concurrent.Backend.C ()
import Language.Embedded.Concurrent.CMD
import Language.Embedded.Expression
import Language.Embedded.Imperative.CMD (Arr)
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
delayThread :: (Integral i, ThreadCMD :<: instr)
=> exp i -> ProgramT instr (Param2 exp pred) m ()
delayThread = singleton . inj . Sleep
newChan :: forall a i exp pred instr m
. (pred a, Integral i, ChanCMD :<: instr)
=> exp i
-> ProgramT instr (Param2 exp pred) m (Chan Uncloseable a)
newChan n = newChan' $ n `timesSizeOf` (Proxy :: Proxy a)
newCloseableChan :: forall a i exp pred instr m
. (pred a, Integral i, ChanCMD :<: instr)
=> exp i
-> ProgramT instr (Param2 exp pred) m (Chan Closeable a)
newCloseableChan n = newCloseableChan' $ n `timesSizeOf` (Proxy :: Proxy a)
readChan :: ( Typeable a, pred a
, FreeExp exp, FreePred exp a
, ChanCMD :<: instr, Monad m )
=> Chan t a
-> ProgramT instr (Param2 exp pred) m (exp a)
readChan = readChan'
readChanBuf :: ( Typeable a, pred a
, Ix i, Integral i
, FreeExp exp, FreePred exp Bool
, ChanCMD :<: instr, Monad m )
=> Chan t a
-> exp i
-> exp i
-> Arr i a
-> ProgramT instr (Param2 exp pred) m (exp Bool)
readChanBuf = readChanBuf'
writeChan :: ( Typeable a, pred a
, FreeExp exp, FreePred exp Bool
, ChanCMD :<: instr, Monad m )
=> Chan t a
-> exp a
-> ProgramT instr (Param2 exp pred) m (exp Bool)
writeChan = writeChan'
writeChanBuf :: ( Typeable a, pred a
, Ix i, Integral i
, FreeExp exp, FreePred exp Bool
, ChanCMD :<: instr, Monad m )
=> Chan t a
-> exp i
-> exp i
-> Arr i a
-> ProgramT instr (Param2 exp pred) m (exp Bool)
writeChanBuf = writeChanBuf'
lastChanReadOK :: (FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m)
=> Chan Closeable c
-> ProgramT instr (Param2 exp pred) m (exp Bool)
lastChanReadOK = fmap valToExp . singleInj . ReadOK
closeChan :: (ChanCMD :<: instr)
=> Chan Closeable c
-> ProgramT instr (Param2 exp pred) m ()
closeChan = singleInj . CloseChan
newChan' :: (Integral i, ChanCMD :<: instr)
=> ChanSize exp pred i
-> ProgramT instr (Param2 exp pred) m (Chan Uncloseable a)
newChan' = singleInj . NewChan
newCloseableChan' :: (Integral i, ChanCMD :<: instr)
=> ChanSize exp pred i
-> ProgramT instr (Param2 exp pred) m (Chan Closeable a)
newCloseableChan' = singleInj . NewChan
readChan' :: ( Typeable a, pred a
, FreeExp exp, FreePred exp a
, ChanCMD :<: instr, Monad m )
=> Chan t c
-> ProgramT instr (Param2 exp pred) m (exp a)
readChan' = fmap valToExp . singleInj . ReadOne
readChanBuf' :: ( Typeable a, pred a
, Ix i, Integral i
, FreeExp exp, FreePred exp Bool
, ChanCMD :<: instr, Monad m )
=> Chan t c
-> exp i
-> exp i
-> Arr i a
-> ProgramT instr (Param2 exp pred) m (exp Bool)
readChanBuf' ch off sz arr = fmap valToExp . singleInj $ ReadChan ch off sz arr
writeChan' :: ( Typeable a, pred a
, FreeExp exp, FreePred exp Bool
, ChanCMD :<: instr, Monad m )
=> Chan t c
-> exp a
-> ProgramT instr (Param2 exp pred) m (exp Bool)
writeChan' c = fmap valToExp . singleInj . WriteOne c
writeChanBuf' :: ( Typeable a, pred a
, Ix i, Integral i
, FreeExp exp, FreePred exp Bool
, ChanCMD :<: instr, Monad m )
=> Chan t c
-> exp i
-> exp i
-> Arr i a
-> ProgramT instr (Param2 exp pred) m (exp Bool)
writeChanBuf' ch off sz arr = fmap valToExp . singleInj $ WriteChan ch off sz arr