v]f#      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                  ! "      MConvert a type-level number to an Int. Of course, we can only go this way... " !"#$%&'()*+,-./0"/0-.+,)*'(%&#$!" " !""#$$%&&'(()**+,,-../00AReverse a list. E*Take from the head of a list. Mirrors the Prelude function # . G*Drop from the head of a list. Mirrors the Prelude function $ . I'Append two lists together. Mirrors the Prelude function '(++)'. KBUpdate a list but allow the type of the new value to be different ! from the type of the old value. MAIndex or update a list. When updating, the type of the new value 0 must be the same as the type of the old value. QFind the length of a list. )123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY)TSQRUVWXYPMNOKLEFGHIJABCD=>;<9:78?@563412)1223445667889::;<<=>>?@@ABBCDDEFFGHHIJJKLLMNONOPQRRSTUVWXY^Find 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. b.lookup in a map. Will call fail in Monad if it' s not there. e: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. Z[\]^_`abcdefghijghiefbcd`a^_j\]Z[Z[[\]]^__`aabcdcdeffghhijuAAn 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. klmnopqrstuvwxyz{|}~yz{uvwxrstpqnoklm|}~klmlmnoopqqrststuvwxvwxyz{z{|}~000@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   '()  !"" ! !!"  !"#$%&'()*+,-./0STUViklmnopqrstuvwxyz{|}~ '() !"Y SVTU/0-.+,)*'(%&#$!" i *+,-./ !"#$%&'()*+,-..//0011223344556677889:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyzz{|}~                                  sessions-2008.7.18$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.SessionSystem.SessionNotNotTtyNotIftyIfOrtyOrAndtyAndFalseFFTrueTT:.:$TypeNumberToInt tyNumToIntTyNumSmallerThanBool isSmallerThan SmallerThanAddtyAddPredtyPredSucctySuccD9D8D7D6D5D4D3D2D1D0E TyListZip tyListZip TyListToList tyListToList TySubList isTySubListTyListSortNumstyListSortNums TyListToSet tyListToSet TyListConsSet tyListConsSet TyListMemberisTyListMember TyListDelete tyListDelete TyListReverse tyListReverse TyListElem tyListElem TyListTake tyListTake TyListDrop tyListDrop TyListAppend tyListAppendTyListUpdateVartyListUpdateVar TyListIndex tyListIndex tyListUpdateTyList TyListLength tyListLengthConsNilnilcons modifyConstyHeadtyTailMapSelectToListmapSelectToList MapDelete mapDeleteMapSizemapSize MapUpdate mapUpdate MapLookup mapLookupmapUpdateValue 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~||~carefullySwapToNextCellsjumpssendsrecv srecvTestsrecvTestTimeOutsoffersselectrun MultiReceive multiReceivePlainMultiReceiveplainMultiReceiveCombinedMultiRecvcombinedMultiRecvMultiReceiveListMultiReceiveNil CreateSession createSessionBuildInvertedSessionsSetBuildInvertedSessionsSetTbuildInvertedSessionsSet BuildPidTyMapBuildPidTyMapT buildPidTyMapmakePidrootPidmyPid~|||~ForkforkMapChannelsRecmapChannelsRec withChannelwithChannelRecrunInterleavedsjumpChssendChsrecvChsofferCh sselectChscloseCh sendChannel recvChannelCreateSessionOverNetworkcreateSessionOverNetworkrunOverNetworkGHC.ListtakedropState withThenClosecreateSessionThenClose forkThenCloselineSessionRawmakeLineOutputChannelmakeLineInputChannelstdoutLineOutputChannelstdinLineInputChannel