h*bp[      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0.2.1 Safe-Inferred)*#  AsyncRattus,The "stable" type modality. A value of type Box a is a time-independent computation that produces a value of type a. Use  and  to construct and consume -types. AsyncRattus A type is Stable0 if it is a strict type and the later modality O% and function types only occur under Box.%For example, these types are stable: Int,  Box (a -> b),  Box (O Int), Box (Sig a -> Sig b). But these types are not stable: [Int]) (because the list type is not strict),  Int -> Int!, (function type is not stable), O Int, Sig Int. AsyncRattusThe return type of the  primitive.  AsyncRattus#The "later" type modality. A value v of type O 1 consists of two components: Its clock, denoted cl(v)?, and a delayed computation that will produce a value of type  as soon as the clock cl(v) ticks. The clock cl(v) is only used for type checking and is not directly accessible, whereas the delayed computation is accessible via  and . AsyncRattus1This is the constructor for the "later" modality  : :  N E t ::  --------------------  E delay t :: O +The typing rule requires that its argument t$ typecheck with an additional tick N of some clock . AsyncRattus0This is the eliminator for the "later" modality  :   E t :: O  ' tick-free ---------------------------------  Ncl(t) ' E adv t :: It requires that a tick N= is in the context whose clock matches exactly the clock of t, i.e.   = cl(t). AsyncRattusIf we want to eliminate more than one delayed computation, i.e. two s :: O  and t :: O , we need to use  instead of just .   E s :: O   E t :: O  ' tick-free --------------------------------------------------  Ncl(s)Ecl(t) ' E select s t :: Select   It requires that we have a tick N in the context whose clock matches the union of the clocks of s and t, i.e.  = cl(s)Ecl(t). The union of two clocks ticks whenever either of the two clocks ticks, i.e.  cl(s)Ecl(t) , whenever cl(s) or cl(t) ticks.That means there are three possible outcomes, which are reflected in the result type of  select s t . A value of  Select   is eithera value of type # and a delayed computation of type O  , if cl(s) ticks before cl(t),a value of type # and a delayed computation of type O  , if cl(t) ticks before cl(s), ora value of type  and a value of type , if cl(s) andcl(s) tick simultaneously. AsyncRattus The clock of  never :: O > will never tick, i.e. it will never produce a value of type . With 3 we can for example implement the constant signal  x ::: never of type Sig a for any x :: a. AsyncRattus2This is the constructor for the "stable" modality : 8 L E t ::  --------------------  E box t :: Box where L is obtained from  by removing all ticks and all variables x :: , where  is not a stable type. AsyncRattus2This is the eliminator for the "stable" modality : 5  E t :: Box  ------------------  E unbox t ::     Safe-Inferred7 AsyncRattus.This annotation type is for internal use only." AsyncRattusBy default all Async Rattus functions are checked for use of lazy data types, since these may cause memory leaks. If any lazy data types are used, a warning is issued. These warnings can be disabled by annotating the module or the function with # {-# ANN myFunction AllowLazyData #-} {-# ANN module AllowLazyData #-}Async Rattus only allows guarded recursion, i.e. recursive calls must occur in the scope of a tick. Structural recursion over strict data types is safe as well, but is currently not checked. To disable the guarded recursion check, annotate the module or function with $. {-# ANN myFunction AllowRecursion #-} {-# ANN module AllowRecursion #-}"#$ !"#$ !  Safe-Inferred)* AsyncRattus"Syntax that may contain variables. AsyncRattusCompute the set of variables occurring in the given piece of syntax. The name falsely suggests that returns free variables, but in fact it returns all variable occurrences, no matter whether they are free or bound. AsyncRattusComputes the variables that are bound by a given piece of syntax. AsyncRattusCompute the dependencies of a bag of bindings, returning a list of the strongly-connected components.  Safe-Inferred"9 AsyncRattus!The set of stable built-in types. AsyncRattus t4, this function returns the list of type variables  [a1,...,am]" for which there is a constraint  Stable ai among  C1, ... Cn. AsyncRattusChecks a top-level definition group, which is either a single non-recursive definition or a group of (mutual) recursive definitions. AsyncRattusStabilizes the given context, i.e. remove all non-stable types and any tick. This is performed on checking box, and guarded recursive definitions. To provide better error messages a reason has to be given as well. AsyncRattus AsyncRattusAppend two lists.C AsyncRattus A version of map which can throw out elements. In particular, the function argument returns something of type . b. If this is 08, no element is added on to the result list. If it is / b, then b is included in the result list.L AsyncRattus)takes a default value, a function, and a . value. If the . value is 0, the function returns the default value. Otherwise, it applies the function to the value inside the / and returns the result.%123:;=?ABC@45.0/LMD6789%123:;=?ABC@45.0/LMD6789384252 Safe-Inferred)*:[ AsyncRattusA type p satisfying  Producer p a7 is essentially a signal that produces values of type a4 but it might not produce such values at each tick.\ AsyncRattus-Get the current value of the producer if any.] AsyncRattusGet the next state of the producer. Morally, the type of this method should be /getNext :: p -> (exists q. Producer q a => O q)We encode the existential type using continuation-passing style.^ AsyncRattusThis function can be used to implement input signals. It returns a boxed delayed computation s and a callback function cb. The signal mkSig s will produce a new value v! whenever the callback function cb is called with argument v._ AsyncRattus>This function can be used to produces outputs. Given a signal s and function f , the call  setOutput s f registers f6 as a callback function that is called with argument v+ whenever the signal produces a new value v. For this function to work, b must be called.` AsyncRattus0This function is essentially the composition of ^ and _&. It turns any producer into a signal.a AsyncRattustimer n1 produces a delayed computation that ticks every n milliseconds. In particular mkSig (timer n). is a signal that produces a new value every n milliseconds.b AsyncRattus In order for _) to work, this IO action must be invoked.^_`ba[\]^_`ba[\] Safe-Inferred:7  12345.0/>:BCG;?@ABCDEFFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~yz~{                                          y!!(AsyncRattus-0.2.1-6r60o43W2pTJ9i20iYgyaPAsyncRattus.StrictAsyncRattus.InternalPrimitivesAsyncRattus.Plugin.AnnotationAsyncRattus.PluginAsyncRattus.Channels AsyncRattusAsyncRattus.SignalAsyncRattus.FutureAsyncRattus.Plugin.DependencyAsyncRattus.Plugin.UtilsAsyncRattus.Plugin.StrictifyAsyncRattus.Plugin.StableSolverAsyncRattus.Plugin.SingleTickAsyncRattus.Plugin.ScopeCheckAsyncRattus.Plugin.PrimExprAsyncRattus.Plugin.Transform*AsyncRattus.Plugin.CheckClockCompatibilityAsyncRattus.Primitivesbase GHC.IsListIsListfromList fromListNtoListItemBoxStableSelectFstSndBothODelay InputValueClockInputChannelIdentifiersingletonClock clockUnion channelMemberasyncRattusErrordelay extractClockadv'advselectselect'neverboxunbox InternalAnn ExpectError ExpectWarning AllowLazyDataAllowRecursion$fDataInternalAnn$fShowInternalAnn$fEqInternalAnn$fOrdInternalAnn$fDataAsyncRattus$fShowAsyncRattus$fOrdAsyncRattus$fEqAsyncRattuspluginMaybe'Just'Nothing'ListNil:!:*fst'snd'curry'uncurry' singletoninit'reverse' listToMaybe'+++map' concatMap'zip'zipWith' mapMaybe'isJust'union'unionBy'delete' deleteBy'nub'nubBy'filter'maybe' fromMaybe'$fVectorSpace:*a$fEq:*$fShow:* $fFunctor:* $fShowList$fEqList $fFunctorList$fFoldableList $fIsListList$fTraversableList $fShowMaybe' $fEqMaybe' $fOrdMaybe'Producer getCurrentgetNextgetInput setOutputmkInputtimerstartEventLoop$fProducerBoxa $fProducerOamapOSig:::currentfuturemap getInputSig mkInputSig filterMapfilterMapAwaitfilter filterAwaittrigger triggerAwaitmapAwaitmkSigmkBoxSigconstscan scanAwaitscanMapjumpjumpingstopswitchswitchS switchAwaitswitchR interleave mapInterleave interleaveAllupdatezipWithzipWith3condzip parallelWithparallelWithAwaitparallel parallelAwaitbuffer bufferAwaitintegral derivative$fProducerSiga$fProducerSigMaybeaSigF:>:FNowWaitbindFmapFsyncsyncFmkSigFmkSigF'fromSig zipWithAwait $fProducerFa$fProducerOneShota$fProducerSigFaHasFVgetFVHasBV dependencygetBV printBindsghcStableTypesisStable isStableRec isStrictRec printMessageghcGHC.Types.ErrorSeverity SevIgnore SevWarningSevError isRattModuleadv'Var select'VarbigDelay inputValueVarextractClockVarunionVar isGhcModule getNameModuleisStrict isTemporal userFunctiontypeClassFunctiongetVar getMaybeVar getModuleFSisVarisTypemkSysLocalFromVarmkSysLocalFromExprfromRealSrcSpannoLocationInfomkAltgetAltsplitForAllTys'checkStrictDataSCxtsrcSpantcStable toSingleTick NotSupportedcheck checkBind ScopeBindScopeGetCtxtPrimHidden NoTickReason HiddenReasonRecDefLCtxtCtxtearlierhiddensrcLocrecDef stableTypes primAliasallowRecursion emptyCtxtsetCtxt modifyCtxtcheckAll System.Exit exitFailurecheckRecursiveBindsgetAllBVisStableConstrextractStableConstrcheckSCC stabilizegetScopeprimMapisPrim isPrimExpraddVars printMessage'printMessageCheckghc-prim GHC.TypesFalseAdvPrimInfoDelayAppAdvApp SelectAppBoxAppfunctionprim transform checkExpr CheckExpr recursiveSet allowRecExpoldExprverbose updateEnvstrictifyProgram GHC.MaybeMaybeGHC.Listscanldt