imperative-edsl-0.7: Deep embedding of imperative programs with code generation

Safe HaskellNone
LanguageHaskell2010

Language.Embedded.Concurrent.CMD

Contents

Synopsis

Documentation

type TID = VarId Source #

data ThreadId Source #

Constructors

TIDRun ThreadId (Flag ()) 
TIDComp TID 

type CID = VarId Source #

data Chan t a Source #

A bounded channel.

Constructors

ChanRun (Chan Dynamic) 
ChanComp CID 

data ChanSize exp pred i where Source #

Channel size specification. For each possible element type, it shows how many elements of them could be stored in the given channel at once.

Constructors

OneSize :: (pred a, Integral i) => proxy a -> exp i -> ChanSize exp pred i 
TimesSize :: Integral i => exp i -> ChanSize exp pred i -> ChanSize exp pred i 
PlusSize :: Integral i => ChanSize exp pred i -> ChanSize exp pred i -> ChanSize exp pred i 

timesSizeOf :: (pred a, Integral i) => exp i -> proxy a -> ChanSize exp pred i Source #

Takes n times the size of type refered by proxy.

timesSize :: Integral i => exp i -> ChanSize exp pred i -> ChanSize exp pred i Source #

Multiplies a channel size specification with a scalar.

plusSize :: Integral i => ChanSize exp pred i -> ChanSize exp pred i -> ChanSize exp pred i Source #

Adds two channel size specifications together.

data ThreadCMD fs a where Source #

Constructors

ForkWithId :: (ThreadId -> prog ()) -> ThreadCMD (Param3 prog exp pred) ThreadId 
Kill :: ThreadId -> ThreadCMD (Param3 prog exp pred) () 
Wait :: ThreadId -> ThreadCMD (Param3 prog exp pred) () 
Sleep :: Integral i => exp i -> ThreadCMD (Param3 prog exp pred) () 

Instances

HFunctor * * (* -> *, (k2, *)) (ThreadCMD k2) Source # 

Methods

hfmap :: (forall b. f b -> g b) -> h ((ThreadCMD k2 -> *, k2) f fs) a -> h ((ThreadCMD k2 -> *, k2) g fs) a #

HBifunctor * * (k2, *) (ThreadCMD k2) Source # 

Methods

hbimap :: (Functor f, Functor g) => (forall b. f b -> g b) -> (forall b. i b -> j b) -> h ((* -> *, (k1 -> *, k2)) f ((k1 -> *, k2) i fs)) a -> h ((* -> *, (k1 -> *, k2)) g ((k1 -> *, k2) j fs)) a #

(:<:) (* -> *, (* -> *, (k2, *))) * (ThreadCMD k2) instr => Reexpressible * (k2, *) (ThreadCMD k2) instr env Source # 

Methods

reexpressInstrEnv :: Monad m => (forall b. exp1 b -> ReaderT * env (ProgramT (ThreadCMD k2 -> *, instr) instr ((ThreadCMD k2 -> *, instr) exp2 fs) m) (exp2 b)) -> env ((* -> *, (ThreadCMD k2 -> *, instr)) (ReaderT * env (ProgramT (ThreadCMD k2 -> *, instr) instr ((ThreadCMD k2 -> *, instr) exp2 fs) m)) ((ThreadCMD k2 -> *, instr) exp1 fs)) a -> ReaderT * env (ProgramT (ThreadCMD k2 -> *, instr) instr ((ThreadCMD k2 -> *, instr) exp2 fs) m) a #

DryInterp (* -> *, (k2, *)) (ThreadCMD k2) Source # 

Methods

dryInterp :: MonadSupply m => instr ((* -> *, ThreadCMD k2) m fs) a -> m a Source #

InterpBi (k2, *) * (ThreadCMD k2) IO (Param1 k2 pred) Source # 

Methods

interpBi :: Param1 k2 pred ((IO -> *, (IO -> *, ThreadCMD k2)) m ((IO -> *, ThreadCMD k2) m fs)) a -> m a #

data ChanCMD fs a where Source #

Constructors

NewChan :: ChanSize exp pred i -> ChanCMD (Param3 prog exp pred) (Chan t c) 
CloseChan :: Chan Closeable c -> ChanCMD (Param3 prog exp pred) () 
ReadOK :: Chan Closeable c -> ChanCMD (Param3 prog exp pred) (Val Bool) 
ReadOne :: (Typeable a, pred a) => Chan t c -> ChanCMD (Param3 prog exp pred) (Val a) 
WriteOne :: (Typeable a, pred a) => Chan t c -> exp a -> ChanCMD (Param3 prog exp pred) (Val Bool) 
ReadChan :: (Typeable a, pred a, Ix i, Integral i) => Chan t c -> exp i -> exp i -> Arr i a -> ChanCMD (Param3 prog exp pred) (Val Bool) 
WriteChan :: (Typeable a, pred a, Ix i, Integral i) => Chan t c -> exp i -> exp i -> Arr i a -> ChanCMD (Param3 prog exp pred) (Val Bool) 

Instances

HFunctor k * (* -> *, (* -> Constraint, *)) (ChanCMD (k -> *)) Source # 

Methods

hfmap :: (forall b. f b -> g b) -> h ((ChanCMD (k -> *) -> *, k2) f fs) a -> h ((ChanCMD (k -> *) -> *, k2) g fs) a #

HBifunctor * * (* -> Constraint, *) (ChanCMD (* -> *)) Source # 

Methods

hbimap :: (Functor f, Functor g) => (forall b. f b -> g b) -> (forall b. i b -> j b) -> h ((* -> *, (k1 -> *, k2)) f ((k1 -> *, k2) i fs)) a -> h ((* -> *, (k1 -> *, k2)) g ((k1 -> *, k2) j fs)) a #

(:<:) (* -> *, (* -> *, (* -> Constraint, *))) * (ChanCMD (* -> *)) instr => Reexpressible * (* -> Constraint, *) (ChanCMD (* -> *)) instr env Source # 

Methods

reexpressInstrEnv :: Monad m => (forall b. exp1 b -> ReaderT * env (ProgramT (ChanCMD (* -> *) -> *, instr) instr ((ChanCMD (* -> *) -> *, instr) exp2 fs) m) (exp2 b)) -> env ((* -> *, (ChanCMD (* -> *) -> *, instr)) (ReaderT * env (ProgramT (ChanCMD (* -> *) -> *, instr) instr ((ChanCMD (* -> *) -> *, instr) exp2 fs) m)) ((ChanCMD (* -> *) -> *, instr) exp1 fs)) a -> ReaderT * env (ProgramT (ChanCMD (* -> *) -> *, instr) instr ((ChanCMD (* -> *) -> *, instr) exp2 fs) m) a #

DryInterp (* -> *, (* -> Constraint, *)) (ChanCMD (* -> *)) Source # 

Methods

dryInterp :: MonadSupply m => instr ((* -> *, ChanCMD (* -> *)) m fs) a -> m a Source #

InterpBi (* -> Constraint, *) * (ChanCMD (* -> *)) IO (Param1 (* -> Constraint) pred) Source # 

Methods

interpBi :: Param1 (* -> Constraint) pred ((IO -> *, (IO -> *, ChanCMD (* -> *))) m ((IO -> *, ChanCMD (* -> *)) m fs)) a -> m a #

Orphan instances

FreeExp IO Source # 

Associated Types

type FreePred (IO :: * -> *) :: * -> Constraint Source #

Methods

constExp :: FreePred IO a => a -> IO a Source #

varExp :: FreePred IO a => VarId -> IO a Source #