sessions-2008.3.30: Session Types for HaskellSource codeContentsIndex
Control.Concurrent.Session.Pid
Description
Defines what a Pid is and provides functionality to create new sessions channels to a given pid. Obviously this is safe/ in some way - in particular, a Pid carries about with it the set of Session Types it is willing to use. This means that you can't try to start any old Session Type with any given Pid. However, it doesn't mean that given an acceptable Session Type, the other thread will ever actually get around to agreeing to create the new session / channel with you.
Synopsis
data Pid where
Pid :: RawPid -> prog -> prog' -> TyMap sessionsToIdx idxsToPairStructs -> Pid prog prog' sessionsToIdx idxsToPairStructs
data InternalPid where
IPid :: Pid prog prog' sessionsToIdx idxsToPairStructs -> [RawPid] -> InternalPid prog prog' sessionsToIdx idxsToPairStructs
makePid :: InternalPid prog prog' sessionsToIdxO idxsToPairStructsO -> TyMap sessionsToIdxN idxsToPairStructsN -> (InternalPid prog prog' sessionsToIdxO idxsToPairStructsO, InternalPid prog prog' sessionsToIdxN idxsToPairStructsN)
rootPid :: (Dual prog prog', DualT prog ~ prog') => TyMap sessionsToIdx idxsToPairStructs -> prog -> InternalPid prog prog' sessionsToIdx idxsToPairStructs
iPidToPid :: InternalPid prog prog' sessionsToIdx idxsToPairStructs -> Pid prog prog' sessionsToIdx idxsToPairStructs
myPid :: InterleavedChain (InternalPid prog prog' sessionsToIdx idxsToPairStructs) from from (Pid prog prog' sessionsToIdx idxsToPairStructs)
newtype InterleavedChain internalPid from to res = InterleavedChain {
runInterleavedChain :: internalPid -> from -> IO (res, to, internalPid)
}
class BuildPidTyMap prog stlst tymap | prog stlst -> tymap where
type BuildPidTyMapT prog stlst
buildPidTyMap :: prog -> stlst -> IO tymap
class CreateSession invert init prog prog' fromO fromI progOut progIn sessionsToIdxMe sessionsToIdxThem idxsToPairStructsMe idxsToPairStructsThem keyToIdxMe idxToValueMe keyToIdxMe' idxToValueMe' idxOfThem where
createSession :: init -> invert -> Pid prog prog' sessionsToIdxThem idxsToPairStructsThem -> InterleavedChain (InternalPid prog prog' sessionsToIdxMe idxsToPairStructsMe) (TyMap keyToIdxMe idxToValueMe) (TyMap keyToIdxMe' idxToValueMe') idxOfThem
class PidEq a b where
(=~=) :: a -> b -> Bool
data MultiReceive where
MultiReceiveNil :: MultiReceive Nil prog prog' sessionsToIdx idxsToPairStructs keyToIdx idxToValue keyToIdx' idxToValue' res
(~|||~) :: MapLookup (TyMap keyToIdx idxToValue) ch (SessionState progS progS' (Cons (Recv t) nxt, fromO, Cons t nxt')) => (ch, InterleavedChain (InternalPid prog prog' sessionsToIdx idxsToPairStructs) (TyMap keyToIdx idxToValue) (TyMap keyToIdx' idxToValue') res) -> MultiReceive chs prog prog' sessionsToIdx idxsToPairStructs keyToIdx idxToValue keyToIdx' idxToValue' res -> MultiReceive (Cons ch chs) prog prog' sessionsToIdx idxsToPairStructs keyToIdx idxToValue keyToIdx' idxToValue' res
multiReceive :: forall chs len keyToIdx idxToValue prog prog' sessionsToIdx idxsToPairStructs keyToIdx' idxToValue' res. (TyListLength chs len, SmallerThanBool (D0 E) len True, SetIncomingNotify (TyMap keyToIdx idxToValue) chs, FindNonEmptyIncoming (TyMap keyToIdx idxToValue) chs, TypeNumberToInt len) => MultiReceive chs prog prog' sessionsToIdx idxsToPairStructs keyToIdx idxToValue keyToIdx' idxToValue' res -> InterleavedChain (InternalPid prog prog' sessionsToIdx idxsToPairStructs) (TyMap keyToIdx idxToValue) (TyMap keyToIdx' idxToValue') res
Documentation
data Pid whereSource
A process ID. This is a tiny bit like ThreadId but rather heavily annotated.
Constructors
Pid :: RawPid -> prog -> prog' -> TyMap sessionsToIdx idxsToPairStructs -> Pid prog prog' sessionsToIdx idxsToPairStructs
show/hide Instances
Eq (Pid prog prog' sessionsToIdx idxsToPairStructs)
Ord (Pid prog prog' sessionsToIdx idxsToPairStructs)
Show (Pid prog prog' sessionsToIdx idxsToPairStructs)
PidEq (Pid progA progA' sessionsToIdxA idxsToPairStructsA) (Pid progB progB' sessionsToIdxB idxsToPairStructsB)
data InternalPid whereSource
Constructors
IPid :: Pid prog prog' sessionsToIdx idxsToPairStructs -> [RawPid] -> InternalPid prog prog' sessionsToIdx idxsToPairStructs
show/hide Instances
Eq (InternalPid prog prog' sessionsToIdx idxsToPairStructs)
Ord (InternalPid prog prog' sessionsToIdx idxsToPairStructs)
makePid :: InternalPid prog prog' sessionsToIdxO idxsToPairStructsO -> TyMap sessionsToIdxN idxsToPairStructsN -> (InternalPid prog prog' sessionsToIdxO idxsToPairStructsO, InternalPid prog prog' sessionsToIdxN idxsToPairStructsN)Source
rootPid :: (Dual prog prog', DualT prog ~ prog') => TyMap sessionsToIdx idxsToPairStructs -> prog -> InternalPid prog prog' sessionsToIdx idxsToPairStructsSource
iPidToPid :: InternalPid prog prog' sessionsToIdx idxsToPairStructs -> Pid prog prog' sessionsToIdx idxsToPairStructsSource
myPid :: InterleavedChain (InternalPid prog prog' sessionsToIdx idxsToPairStructs) from from (Pid prog prog' sessionsToIdx idxsToPairStructs)Source
newtype InterleavedChain internalPid from to res Source
Constructors
InterleavedChain
runInterleavedChain :: internalPid -> from -> IO (res, to, internalPid)
show/hide Instances
class BuildPidTyMap prog stlst tymap | prog stlst -> tymap whereSource
Associated Types
type BuildPidTyMapT prog stlst Source
Methods
buildPidTyMap :: prog -> stlst -> IO tymapSource
class CreateSession invert init prog prog' fromO fromI progOut progIn sessionsToIdxMe sessionsToIdxThem idxsToPairStructsMe idxsToPairStructsThem keyToIdxMe idxToValueMe keyToIdxMe' idxToValueMe' idxOfThem whereSource
Provides the ability to make a new session / channel with the given Pid. Supply the index to the Session Type, whether or not you're locally inverting (dualing) the Session Type, and the Pid, and so long as the Pid supports the dual of your local Session Type, this will block until the Pid gets around to servicing you. Thus this is a synchronous operation and both Pids must know of each other to create a new session / channel between them.
Methods
createSession :: init -> invert -> Pid prog prog' sessionsToIdxThem idxsToPairStructsThem -> InterleavedChain (InternalPid prog prog' sessionsToIdxMe idxsToPairStructsMe) (TyMap keyToIdxMe idxToValueMe) (TyMap keyToIdxMe' idxToValueMe') idxOfThemSource
show/hide Instances
(ProgramToMVarsOutgoingT prog prog ~ progOut, ProgramToMVarsOutgoingT prog' prog' ~ progIn, ProgramToMVarsOutgoing prog prog progOut, ProgramToMVarsOutgoing prog' prog' progIn, SWellFormedConfig init (D0 E) prog, SWellFormedConfig init (D0 E) prog', TyListIndex progOut init (MVar (ProgramCell (Cell fromO))), TyListIndex progIn init (MVar (ProgramCell (Cell fromI))), TyListIndex prog init current', ExpandPids prog current' current, MapLookup (TyMap sessionsToIdxMe idxsToPairStructsMe) init (MVar (Map ((,) RawPid RawPid) (MVar (PairStruct init prog prog' ((,,) (Cons (Jump init) Nil) (Cons (Jump init) Nil) (Cons (Jump init) Nil)))))), MapSize (TyMap keyToIdxMe idxToValueMe) idxOfThem, MapInsert (TyMap keyToIdxMe idxToValueMe) idxOfThem (SessionState prog prog' ((,,) current fromO fromI)) (TyMap keyToIdxMe' idxToValueMe')) => CreateSession False init prog prog' fromO fromI progOut progIn sessionsToIdxMe sessionsToIdxThem idxsToPairStructsMe idxsToPairStructsThem keyToIdxMe idxToValueMe keyToIdxMe' idxToValueMe' idxOfThem
(ProgramToMVarsOutgoingT prog prog ~ progOut, ProgramToMVarsOutgoingT prog' prog' ~ progIn, ProgramToMVarsOutgoing prog prog progOut, ProgramToMVarsOutgoing prog' prog' progIn, SWellFormedConfig init (D0 E) prog, SWellFormedConfig init (D0 E) prog', TyListIndex progOut init (MVar (ProgramCell (Cell fromO))), TyListIndex progIn init (MVar (ProgramCell (Cell fromI))), TyListIndex prog init currentUX, ExpandPids prog currentUX current, TyListIndex prog' init currentUX', ExpandPids prog' currentUX' current', MapLookup (TyMap sessionsToIdxThem idxsToPairStructsThem) init (MVar (Map ((,) RawPid RawPid) (MVar (PairStruct init prog prog' ((,,) (Cons (Jump init) Nil) (Cons (Jump init) Nil) (Cons (Jump init) Nil)))))), MapSize (TyMap keyToIdxMe idxToValueMe) idxOfThem, MapInsert (TyMap keyToIdxMe idxToValueMe) idxOfThem (SessionState prog' prog ((,,) current' fromI fromO)) (TyMap keyToIdxMe' idxToValueMe')) => CreateSession True init prog prog' fromO fromI progOut progIn sessionsToIdxMe sessionsToIdxThem idxsToPairStructsMe idxsToPairStructsThem keyToIdxMe idxToValueMe keyToIdxMe' idxToValueMe' idxOfThem
class PidEq a b whereSource
Provides a way to compare two Pids. Of course, if the Pids have different type params, then they are definitely different, but it's still convenient to be able to do something like (==) on them.
Methods
(=~=) :: a -> b -> BoolSource
show/hide Instances
PidEq (Pid progA progA' sessionsToIdxA idxsToPairStructsA) (Pid progB progB' sessionsToIdxB idxsToPairStructsB)
data MultiReceive whereSource
Constructors
MultiReceiveNil :: MultiReceive Nil prog prog' sessionsToIdx idxsToPairStructs keyToIdx idxToValue keyToIdx' idxToValue' res
(~|||~) :: MapLookup (TyMap keyToIdx idxToValue) ch (SessionState progS progS' (Cons (Recv t) nxt, fromO, Cons t nxt')) => (ch, InterleavedChain (InternalPid prog prog' sessionsToIdx idxsToPairStructs) (TyMap keyToIdx idxToValue) (TyMap keyToIdx' idxToValue') res) -> MultiReceive chs prog prog' sessionsToIdx idxsToPairStructs keyToIdx idxToValue keyToIdx' idxToValue' res -> MultiReceive (Cons ch chs) prog prog' sessionsToIdx idxsToPairStructs keyToIdx idxToValue keyToIdx' idxToValue' resSource
multiReceive :: forall chs len keyToIdx idxToValue prog prog' sessionsToIdx idxsToPairStructs keyToIdx' idxToValue' res. (TyListLength chs len, SmallerThanBool (D0 E) len True, SetIncomingNotify (TyMap keyToIdx idxToValue) chs, FindNonEmptyIncoming (TyMap keyToIdx idxToValue) chs, TypeNumberToInt len) => MultiReceive chs prog prog' sessionsToIdx idxsToPairStructs keyToIdx idxToValue keyToIdx' idxToValue' res -> InterleavedChain (InternalPid prog prog' sessionsToIdx idxsToPairStructs) (TyMap keyToIdx idxToValue) (TyMap keyToIdx' idxToValue') resSource
Produced by Haddock version 2.3.0