úÎaXVë      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§ ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á MConvert a type-level number to an Int. Of course, we can only go this way...      !"#$%&'()*+,- !"#$%&'(*,-9Reverse a list. =*Take from the head of a list. Mirrors the Prelude function  . ?*Drop from the head of a list. Mirrors the Prelude function Ă . A'Append two lists together. Mirrors the Prelude function '(++)'. CBUpdate a list but allow the type of the new value to be different ! from the type of the old value. EAIndex or update a list. When updating, the type of the new value 0 must be the same as the type of the old value. IFind the length of a list. ./0123456789:;<=>?@ABCDEFGHIJKLLKIJ./012HEFGCD=>?@AB9:;<7856340MNOPQRSTUVÄWXYZ[\]^_`abĹcĆdÇefghijklmnopqrstuvwČMNOPQRSTUVWXYZ[\]^_`abcdelsuwzFind 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 A the types that matter. Inserting a key that already exists will  update the value. xyz{|}~€‚ƒ ‚ƒx€~|}z{y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. šşťź˝žżŔÁ šŔÁşťź˝žżo ()*+./KLNOPQRSTUW`abcdefghijklmnopqrstuvwx„…†‡ˆ‰Š‹ËŒŽ‘Ě’”•–—˜™š¤Ś§ŤŹ­ŽŻ°ą˛ł´ˇšşťź˝žżŔÁV*+()¤ĽŚ”•˜™–—šwlmnopqrefghijkuvstdcbPOQR`NaSTWUK/L. xˇ°ą˛Ž§ŻŹ­Ťł´Í  !!""##$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmniopqrstouuvvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š››œžŸ Ą˘Ł¤ Ľ Ś § ¨ Š Ş Ť Ź ­ Ž Ž Ż ° ą ˛ ł ´ ´ ľ ś ˇ ¸ š ş ť ź ˝ ž żZfghw Ŕ Ŕ‹‘Ásessions-2008.3.23!Control.Concurrent.Session.NumberControl.Concurrent.Session.BoolControl.Concurrent.SessionControl.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.LazyTypeNumberToInt tyNumToIntTyNum SmallerThanAddtyAddPredtyPredSucctySuccD9D8D7D6D5D4D3D2D1D0ENottyNotIftyIfOrtyOrAndtyAndFalseFFTrueTT:.:$nilcons modifyConstyHeadtyTail TyListToSet tyListToSet TyListConsSet tyListConsSet TyListMemberisTyListMember TyListReverse tyListReverse TyListElem tyListElem TyListTake tyListTake TyListDrop tyListDrop TyListAppend tyListAppendTyListUpdateVartyListUpdateVar TyListIndex tyListIndex tyListUpdateTyList TyListLength tyListLengthConsNilOutgoingDualTendjumpselectoffer~>~|~testWellformedChoiceSWellFormedConfigMakeListOfJumpsmakeListOfJumpsSNoJumpsBeyondSValidSessionType STerminal SNonTerminalSListOfSessionTypes SListOfJumpsDualdualOfferSelectJumpRecv RecvDoubleRecvStrRecvCharRecvBoolRecvIntSend SendDoubleSendStrSendCharSendBoolSendIntRecvPidSendPidEndemptyMap tyMapKeysMapSizemapSize MapUpdate mapUpdate MapLookup mapLookup MapInsert mapInsertTyMapTM SMonadStatesgetsputSMonadIOsliftIO SMonadTranssliftSStateT runSStateTSMonad~>>~>>=sreturnSChain runSChainProgramToMVarsOutgoingT~||~sjumpssendsrecvsoffersselectrun SessionChainrunSessionChain SessionStateProgramToMVarsOutgoingprogramToMVarsOutgoing ProgramCellCell OfferImpls OfferCons OfferImplsNilBuildPidTyMapT iPidToPidmakePidrootPidmyPid CreateSession createSession BuildPidTyMap buildPidTyMapInterleavedChainrunInterleavedChainPidEq=~= InternalPidIPidPid withChannelrunInterleavedsjumpChssendChsrecvChsofferCh sselectChForkforktakedropState