720u      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst*MConvert a type-level number to an Int. Of course, we can only go this way... uvwx yz{|}~           Index or update a list !"#$Find the length of a list. %&'()*+ !"#$%&'()*+ ()&'$%*+# !" !"!"#$%%&''())*+*,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU*,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU*MNOFLKJIHG?EDCBA@=>P;<Q9:R7865432ST10U./,-*,--.//01234567889::;<<=>>?EDCBA@@ABCDEFLKJIHGGHIJKLMNNOPQRSTUVWXYZ[\]^_`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. abcdefVWXYZ[\]^_`abcdefdef`abc]^_[\YZVWXVWXWXYZZ[\\]^_^_`abcabcdefefg=The representation of a computation that performs work using D session types. Again, really quite similar to a more-parameterized  State monad. hijkl@Use OfferImpls to construct the implementations of the branches  of an offer. Really, it's just a slightly fancy list. mnBUse to construct OfferImpls. This function automatically adds the  necessary o- to the start of each branch implementation. oAPerform a jump. Now you may think that you should indicate where ) you want to jump to. But of coures, that's actually specified by  the session type so you don'#t have to specify it at all in the  implementation. pASend a value to the other party. Of course, the value must be of 1 the correct type indicated in the session type. q9Recieve 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. rAOffer a number of branches. This is basically an external choice  - the other party uses s! 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. sSelect which branch we'(re taking at a branch point. Use a type  number (!Control.Concurrent.Session.Number) to indicate the branch  to take. t=Run! Provide a program and a start point within that program  (which is automatically o 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. ghijklmnopqrstlmnjghiopqrstkghihijklmmnopqrstP &(*+0789;=?@ABCDEFGHIJKLMOPQRSTUVWXYZ[\]^_`abcdeflmnopqrst?lmnorspqtMFLKJIHG?EDCBA@=;9POQR78ST0U&+(*       !""##$%&'(()*+,-./0122334456789:5;<=>?@;AABCDEFGHIJKLMNOPPQRSTUVVWXXYZ[\]^_`abcdefghijklmnopqopqZrsstutvwxyzsessions-2008.2.23!Control.Concurrent.Session.NumberControl.Concurrent.Session.List&Control.Concurrent.Session.SessionType!Control.Concurrent.Session.SMonad"Control.Concurrent.Session.RuntimeControl.Concurrent.SessionTypeNumberToInt tyNumToIntTyNum SmallerThanAddtyAddPredtyPredSucctySuccD9D8D7D6D5D4D3D2D1D0EElem tyListElem tyListUpdateTyList ListLength listLengthConsNilnilcons OnlyOutgoing onlyOutgoingChoiceSWellFormedConfigSNoJumpsBeyondSValidSessionType STerminal SNonTerminalSListOfSessionTypes SListOfJumpsDualdualOfferSelectJumpRecv RecvDoubleRecvStrRecvCharRecvBoolRecvIntSend SendDoubleSendStrSendCharSendBoolSendIntEndendjumpselectoffer~>~|~testWellformed SMonadStatesgetsputSMonadIOsliftIO SMonadTranssliftSStateT runSStateTSMonad~>>~>>=sreturnSChain runSChain SessionChainrunSessionChain SessionStateProgramToMVarsOutgoing OfferImpls OfferImplsNil~||~sjumpssendsrecvsoffersselectrunStripLeadingZerostyStripLeadingZerosDecrementRightToLefttyDecrementRightToLeftIncrementRightToLefttyIncrementRightToLeftReverse' tyReverse'Reverse tyReverse mtl-1.1.1.0Control.Monad.State.LazyStateprogramToMVarsOutgoing ProgramCellCell SelectCellWalkOfferImplswalkOfferImpls OfferConscarefullySwapToNextCell