l      !"#$%&'()*+,-./0123456789:;< = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ `abcdefghijk Trustworthy'+23468:=JKM  is similar to V, but it allows types to belong to a "set". For every set, only one member can be in rb at any given time. This allows us to specify exclusivity and uniqueness among arbitrary effects: w-- Terminal effects (effects which must be run last) data Terminal -- Make Lifts part of the Terminal effects set. -- The fundep assures that there can only be one Terminal effect for any r. instance Member (Lift m) r => SetMember Terminal (Lift m) r -- Only allow a single unique Lift effect, by making a "Lift" set. instance Member (Lift m) r => SetMember Lift (Lift m) rThe  t r specifies whether t& is present anywhere in the sum type r, where t is some effectful type, e.g. Lift l, State Int`.&A sum data type, for composing effectsWhere r is t1 :> t2 ... :> tn,  r v* can be constructed with a value of type ti v7. Ideally, we should be be able to add the constraint  t r.minfix form of  fromMaybe.Construct a Union.7Try extracting the contents of a Union as a given type.jExtract the contents of a Union as a given type. If the Union isn't of that type, a runtime error occurs.Try extracting the contents of a Union as a given type. If we can't, return a reduced Union that excludes the type we just checked. )Juggle types for a Union. Use cautiously.nopm qrst   nopm qrstm Trustworthy+-2346:BEHJKM OBasic datatype returned by all computations with extensible effects. The type r2 is the type of effects that can be handled, and a' is the type of value that is returned. A  ) is either a value, or an effect of type  r producing another  . The result is that a  * can produce an arbitrarily long chain of  r( effects, terminated with a pure value.VGiven a method of turning requests into results, we produce an effectful computation.]Tell an effectful computation that you're ready to start running effects and return a value.'Get the result from a pure computation..Given a request, either handle it or relay it.Given a request, either handle it or relay it. Both the handler and the relay can produce the same type of request that was handled. uRequestRelay the requestHandle the request of type tvwx    uvwx Trustworthy+3:JKMNondeterministic choicefchoose lst non-deterministically chooses one value from the lst choose [] thus corresponds to failure3MonadPlus-like operators are expressible via choose3MonadPlus-like operators are expressible via choose4Run a nondeterministic effect, returning all values.yy Trustworthy+-3JKStatus of a thread: done or reporting the value of the type a (For simplicity, a co-routine reports a value but accepts unit)Type parameter r# is the effect we're yielding from.Type parameter a is the type that is yielded.Type parameter wO is the type of the value returned from the coroutine when it has completed.The yield request: reporting a value of type e and suspending the coroutine. For readability, a coroutine accepts a unit to produce its value. 2Yield a value of type a and suspend the coroutine.!&Launch a thread and report its status. ! ! ! ! Trustworthy +2346:JKM"Lift a Monad m to an effect.$Lift a Monad to an Effect.%_The handler of Lift requests. It is meant to be terminal: we only allow a single Lifted Monad."#$%z{|}"#$%"#$%"#$%z{|} Trustworthy+-3JK 'DThese are exceptions of the type e. This is akin to the error monad.)/Throw an exception in an effectful computation.*?Makes an effect fail, preventing future effects from happening.+2Run a computation that might produce an exception.,<Runs a failable effect, such that failed computation return ~ , and  the return value on success.-mRun a computation that might produce exceptions, and give it a way to deal with the exceptions that come up..sAdd a default value (i.e. failure handler) to a fallible computation. This hides the fact that a failure happened./iRun a computation until it produces an exception, and convert and throw that exception in a new context.06Treat Lefts as exceptions and Rights as return values.10 in a lifted Monad2Lift a maybe into the &! effect, causing failure if it's ~.3Ignores a failure event. Since the event can fail, you cannot inspect its return type, because it has none on failure. To inspect it, use ,.&'()*+,-.The fallible computation."The computation to run on failure./0123&'()*+,-./0123'(&)*+,-./0123 &'()*+,-./0123 Trustworthy+3JK7The interpreter -- it is like reify . reflect with a twist Compare this implementation with the huge implementation of call in Hinze 2000 (Figure 9) Each clause corresponds to the axiom of call or cutfalse. All axioms are covered. The code clearly expresses the intuition that call watches the choice points of its argument computation. When it encounteres a cutfalse request, it discards the remaining choicepoints. It completely handles CutFalse effects but not non-determinism.4567456745764567 Trustworthy+36BJK8 Create unique Enumerable values.:6Produce a value that has not been previously produced.;&Run an effect requiring unique values.89:;89:;89:;89:;  Trustworthy+-36JK<xThe request for a value of type e from the current environment. This environment is analogous to a parameter of type e.>$Get the current value from a Reader.?mLocally rebind the value in the dynamic environment. This function both requests and admins Reader requests.@>Request the environment value using a transformation function.AbThe handler of Reader requests. The return type shows that all Reader requests are fully handled.<=>?@A<=>?@A<=>?@A<=>?@A  Trustworthy+-36JKBxThe request for a value of type e from the current environment. This environment is analogous to a parameter of type e.D$Get the current value from a Reader.EmLocally rebind the value in the dynamic environment. This function both requests and admins Reader requests.F>Request the environment value using a transformation function.GbThe handler of Reader requests. The return type shows that all Reader requests are fully handled.BCDEFGBCDEFGBCDEFGBCDEFG  Trustworthy+-36JKHStrict state effectJWrite a new value of the state.K&Return the current value of the state.L$Transform the state with a function.MRun a State effect.N/Run a State effect, discarding the final state.O.Run a State effect and return the final state.HIJKLM Initial stateEffect incorporating State0Effect containing final state and a return valueNOHIJKLMNOHIKJLMNOHIJKLMNO  Trustworthy+-36JKPStrict state effectRWrite a new value of the state.S&Return the current value of the state.T$Transform the state with a function.URun a State effect.V/Run a State effect, discarding the final state.W.Run a State effect and return the final state.PQRSTU Initial stateEffect incorporating State0Effect containing final state and a return valueVWPQRSTUVWPQSRTUVWPQRSTUVW  Trustworthy+-36JKXDThe request to remember a value of type w in the current environmentZWrite a new value.[#Transform the state being produced.\LHandle Writer requests, using a user-provided function to accumulate values.]:Handle Writer requests by taking the first value provided.^6Handle Writer requests by overwriting previous values._EHandle Writer requests, using a Monoid instance to accumulate values.XYZ[\]^_XYZ[\]^_XYZ[\]^_XYZ[\]^_ Trustworthy+-36JK`DThe request to remember a value of type w in the current environmentbWrite a new value.c#Transform the state being produced.dLHandle Writer requests, using a user-provided function to accumulate values.e:Handle Writer requests by taking the first value provided.f6Handle Writer requests by overwriting previous values.gEHandle Writer requests, using a Monoid instance to accumulate values.`abcdefg`abcdefg`abcdefg`abcdefg Trustworthy+-3JKhTrace effect for debuggingjPrint a string as a trace.k#Run a computation producing Traces.hijkhijkhijkhijk !"##$%&'()(**+,--./01123456789:;<==>?@@AB C C D E F G C C D E F G H H I J K L M N H H I J K L M N O O P Q R S T UOOPQRSTUVVWXYZ[\]]^_`abcdefghijklmnlmopextensible-effects-1.7.1.2Data.OpenUnion1 Control.EffControl.Eff.ChooseControl.Eff.CoroutineControl.Eff.LiftControl.Eff.ExceptionControl.Eff.CutControl.Eff.FreshControl.Eff.Reader.LazyControl.Eff.Reader.StrictControl.Eff.State.LazyControl.Eff.State.StrictControl.Eff.Writer.LazyControl.Eff.Writer.StrictControl.Eff.Trace SetMemberMember:>UnioninjprjprjForcedecomp unsafeReUnionEffrunEffVEEValsendadminrun handleRelay interposeChoosechoosemzero'mplus' runChoiceYDoneYieldyieldrunCLiftliftrunLiftFailExcthrowExcdierunExcrunFailcatchExconFail rethrowExc liftEither liftEitherM liftMaybe ignoreFailCutFalsecutfalsecallFreshfreshrunFreshReaderasklocalreader runReaderStateputgetmodifyrunState evalState execStateWritertellcensor runWriterrunFirstWriter runLastWriterrunMonoidWriterTracetracerunTraceghc-prim GHC.TypesIOIdrunId$fSetMemberk*sett:> $fMemberk*t:>$fMember(->)*t:>$fFunctorUnionfromVal $fMonadEff$fApplicativeEff $fFunctorEff$fFunctorChoose$fMonadBasebEff $fMonadIOEff $fFunctorLift$fSetMember(->)*LiftLift:>base Data.MaybeNothingJust