dX      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    MConvert a type-level number to an Int. Of course, we can only go this way... " !"#$%&'()*+,-./0"/0-.+,)*'(%&#$!" BReverse a list. F*Take from the head of a list. Mirrors the Prelude function  . H*Drop from the head of a list. Mirrors the Prelude function  . J'Append two lists together. Mirrors the Prelude function '(++)'. LBUpdate a list but allow the type of the new value to be different ! from the type of the old value. NAIndex or update a list. When updating, the type of the new value 0 must be the same as the type of the old value. RFind the length of a list. %123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU%UTRS12345QNOPLMFGHIJKBCDE@A>?<=:;89674VWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!VWXYZ[\]^_`abcdefghijklmnopqryFind the size of a map. ?Update a map. The key must already be in the map. The value is A the type of the value, if you see what I mean and so obviously, 8 updating the map means changing the type of the value. .lookup in a map. Will call fail in Monad if it' s not there. :Insert into a map. Remember, the values are irrelevant, it's only C the types that matter. Inserting a key that already exists is not  permitted. AAn extension of the typical Monad such that you track additional  from and to- parameters. Thus you can think of this like     where the type of the    varies.  BUse to construct OfferImpls. This function automatically adds the  necessary - to the start of each branch implementation. APerform a jump. Now you may think that you should indicate where ) you want to jump to. But of course, that's actually specified by  the session type so you don'#t have to specify it at all in the  implementation. ASend a value to the other party. Of course, the value must be of 1 the correct type indicated in the session type. 9Recieve a value from the other party. This will block as ? necessary. The type of the value received is specified by the ) session type. No magic coercion needed. AOffer a number of branches. This is basically an external choice  - the other party uses ! to decide which branch to take. E Use OfferImpls in order to construct the list of implementations of B branches. Note that every implementation must result in the same & final state and emit the same value. Select which branch we'(re taking at a branch point. Use a type  number (!Control.Concurrent.Session.Number) to indicate the branch  to take. =Run! Provide a program and a start point within that program  (which is automatically  ed to), the two implementations E which must be duals of each other, run them, have them communicate, A wait until they both finish and die and then return the results  from both of them. =The representation of a computation that performs work using D session types. Again, really quite similar to a more-parameterized  State monad. @Use OfferImpls to construct the implementations of the branches  of an offer. Really, it's just a slightly fancy list.  +Provides the ability to make a new session / channel with the B 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 C Type, this will block until the Pid gets around to servicing you. A Thus this is a synchronous operation and both Pids must know of $ each other to create a new session / channel between them. @Provides a way to compare two Pids. Of course, if the Pids have B different type params, then they are definitely different, but it's @ still convenient to be able to do something like (==) on them. MA process ID. This is a tiny bit like ThreadId but rather heavily annotated.  >Perform the given actions on the given channel. Note that the 2 value emitted by the actions will be passed out. @Run the root. Use this to start up a family from a single root. Convenience combination of   and  Convenience combination of   and  Convenience combination of   and  Convenience combination of   and  Convenience combination of   and   Think of this as spawn or fork - it creates a child thread C which must be prepared to communicate with you. You get a channel E set up to the child which is emitted by this function. The child is B first told about the channel back to you and your Pid. The child E can go off and do what ever it wants, including creating additional C channels. The child starts off knowing with only one open channel  which is to the parent. v  !"#$%&'()*+,-./012TUWXYZ[\]^_`dmnopqrstuvwxyz{|}~S yz{|}~rstuvwxYZqpo[X\]mWn^_d`T2U1/0-.+,)*'(%&#$!"  !"#$%&'()**++,,--..//001122334456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{v|}~|              gstu  sessions-2008.4.2Control.Concurrent.Session.BoolControl.Concurrent.Session!Control.Concurrent.Session.NumberControl.Concurrent.Session.List&Control.Concurrent.Session.SessionTypeControl.Concurrent.Session.Map!Control.Concurrent.Session.SMonad"Control.Concurrent.Session.RuntimeControl.Concurrent.Session.Pid'Control.Concurrent.Session.InterleavingbaseGHC.List mtl-1.1.0.2Control.Monad.State.LazyNotNotTtyNotIftyIfOrtyOrAndtyAndFalseFFTrueTT:.:$TypeNumberToInt tyNumToIntTyNumSmallerThanBool isSmallerThan SmallerThanAddtyAddPredtyPredSucctySuccD9D8D7D6D5D4D3D2D1D0Enilcons modifyConstyHeadtyTail TyListMapFunc tyListMapFunc TyListMap tyListMapTyListSortNumstyListSortNums TyListToSet tyListToSet TyListConsSet tyListConsSet TyListMemberisTyListMember TyListReverse tyListReverse TyListElem tyListElem TyListTake tyListTake TyListDrop tyListDrop TyListAppend tyListAppendTyListUpdateVartyListUpdateVar TyListIndex tyListIndex tyListUpdateTyList TyListLength tyListLengthConsNilOutgoingDualTendsendPidrecvPidjumpselectoffer~>~|~testWellformed ExpandPids expandPidsChoiceSWellFormedConfigMakeListOfJumpsmakeListOfJumpsSNoJumpsBeyondSValidSessionType STerminal SNonTerminalSListOfSessionTypes SListOfJumpsDualdualOfferSelectJumpRecv RecvDoubleRecvStrRecvCharRecvBoolRecvIntSend SendDoubleSendStrSendCharSendBoolSendIntRecvPidSendPidEndemptyMap tyMapKeys MapDelete mapDeleteMapSizemapSize MapUpdate mapUpdate MapLookup mapLookup MapInsert mapInsertTyMapTM ssequence_ ssequencesjoinsmapMsmapM_ SMonadStatesgetsputSMonadIOsliftIO SMonadTranssliftSStateT runSStateTSMonad~>>~>>=sreturnSChain runSChainProgramToMVarsOutgoingT~||~sjumpssendsrecvsoffersselectrun SessionChainrunSessionChain SessionStateProgramToMVarsOutgoingprogramToMVarsOutgoing ProgramCellCell OfferImpls OfferImplsNilBuildPidTyMapT iPidToPidmakePidrootPidmyPid~|||~ multiReceive MultiReceiveMultiReceiveNil CreateSession createSession BuildPidTyMap buildPidTyMapInterleavedChainrunInterleavedChainPidEq=~= InternalPidIPidPid withChannelrunInterleavedsjumpChssendChsrecvChsofferCh sselectChscloseCh withThenClosecreateSessionThenClose forkThenCloseForkforktakedropState