rd      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                      MConvert a type-level number to an Int. Of course, we can only go this way... " !"#$%&'()*+,-./0"/0-.+,)*'(%&#$!" " !""#$$%&&'(()**+,,-../00=Reverse a list. A*Take from the head of a list. Mirrors the Prelude function  . C*Drop from the head of a list. Mirrors the Prelude function  . E'Append two lists together. Mirrors the Prelude function '(++)'. GBUpdate a list but allow the type of the new value to be different ! from the type of the old value. IAIndex or update a list. When updating, the type of the new value 0 must be the same as the type of the old value. MFind the length of a list. %123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU%POMNQRSTULIJKGHABCDEF=>?@9:785634;<12%1223445667889::;<<=>>?@@ABBCDDEFFGHHIJKJKLMNNOPQRSTUXFind the size of a map. Z?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. VWXYZ[\]^_`abc`ab^_\]Z[XYcVWVWWXYYZ[[\]]^__`aabcnAAn 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. defghijklmnopqrstuvwxyrstnopqklmijghdefuvwxydefefghhijjklmlmnopqopqrststuvwxy0z{|}~0}~|z{0z{{|}~~@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. =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. 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.  +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.  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. >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                  z  !"#$%&'()*+,-./0OPQRbdefghijklmnopqrstuvwxy     R ORPQ/0-.+,)*'(%&#$!" b !"#$%&'()*+,--..//001122334455667789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrrstuvwxxyz{|}~              sessions-2008.5.12$Control.Concurrent.Session.Base.Bool&Control.Concurrent.Session.Base.Number$Control.Concurrent.Session.Base.List#Control.Concurrent.Session.Base.Map&Control.Concurrent.Session.Base.SMonad&Control.Concurrent.Session.SessionType Control.Concurrent.Session.Types+Control.Concurrent.Session.SessionTypeMonad"Control.Concurrent.Session.RuntimeControl.Concurrent.Session.Pid'Control.Concurrent.Session.Interleaving)Control.Concurrent.Session.Network.Socketbase Data.List mtl-1.1.0.2Control.Monad.State.LazyControl.Concurrent.SessionNotNotTtyNotIftyIfOrtyOrAndtyAndFalseFFTrueTT:.:$TypeNumberToInt tyNumToIntTyNumSmallerThanBool isSmallerThan SmallerThanAddtyAddPredtyPredSucctySuccD9D8D7D6D5D4D3D2D1D0E TySubList isTySubListTyListSortNumstyListSortNums TyListToSet tyListToSet TyListConsSet tyListConsSet TyListMemberisTyListMember TyListDelete tyListDelete TyListReverse tyListReverse TyListElem tyListElem TyListTake tyListTake TyListDrop tyListDrop TyListAppend tyListAppendTyListUpdateVartyListUpdateVar TyListIndex tyListIndex tyListUpdateTyList TyListLength tyListLengthConsNilnilcons modifyConstyHeadtyTail MapDelete mapDeleteMapSizemapSize MapUpdate mapUpdate MapLookup mapLookup MapInsert mapInsertTyMapTMemptyMap tyMapKeys SMonadStatesgetsputSMonadIOsliftIO SMonadTranssliftSStateT runSStateTSMonad~>>~>>=sreturnSChain runSChain ssequence_ ssequencesjoinsmapMsmapM_ExpandExpandTOutgoingChoiceSWellFormedConfigMakeListOfJumpsmakeListOfJumpsSNoJumpsBeyondSValidSessionType STerminal SNonTerminalSListOfSessionTypes SListOfJumpsDualDualTdualOfferSelectJumpRecvSend RecvSession SendSessionRecvPidSendPidEndendsendPidrecvPid sendSession recvSessionjumpselectoffer~>~|~testWellformed PairStructPS SpecialNormal SpecialPidSpecialSessionInterleavedChainrunInterleavedChainPidEq=~= InternalPidIPidPidRawPid SessionChainrunSessionChain SessionStateProgramToMVarsOutgoingProgramToMVarsOutgoingTprogramToMVarsOutgoing ProgramCellCell SelectCell pidToRawPid iPidToPid TyListSnd tyListSnd BuildBranches buildBranches BranchesListBLConsBLNil SessionTypebuildSessionType TypeStatenewLabel declareLabel.=sendrecv currentLabelmakeSessionTypenotDualCompatibleTypesconvert OfferImpls OfferImplsNil~||~carefullySwapToNextCellsjumpssendsrecvsoffersselectrun MultiReceiveMultiReceiveNil CreateSession createSessionBuildInvertedSessionsSetBuildInvertedSessionsSetTbuildInvertedSessionsSet BuildPidTyMapBuildPidTyMapT buildPidTyMapmakePidrootPidmyPid~|||~ multiReceiveForkfork withChannelrunInterleavedsjumpChssendChsrecvChsofferCh sselectChscloseCh sendChannel recvChannelCreateSessionOverNetworkcreateSessionOverNetworkrunOverNetworkGHC.ListtakedropState withThenClosecreateSessionThenClose forkThenClose