1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495(** Contains Async's core data structures, like {{!Async_kernel.Deferred}[Deferred]},
{{!Async_kernel.Ivar}[Ivar]}, and {{!Async_kernel.Clock_intf.Clock}[Clock]}.
[Async_kernel] is designed to depend only on {{!Core}[Core]} and so is more
platform-independent. *)open!Coreopen!ImportmoduleAsync_kernel_config=Async_kernel_configmoduleAsync_kernel_require_explicit_time_source=Require_explicit_time_sourcemoduleAsync_kernel_scheduler=Async_kernel_schedulermoduleBvar=BvarmoduleClock_ns=Clock_nsmoduleCondition=Async_conditionmoduleDeferred=DeferredmoduleExecution_context=Execution_contextmoduleGc=Async_gcmoduleInvariant=Async_invariantmoduleIvar=IvarmoduleLazy_deferred=Lazy_deferredmoduleMonad_sequence=Monad_sequencemoduleMonitor=MonitormoduleMvar=MvarmodulePipe=PipemodulePriority=PrioritymoduleSequencer=Throttle.SequencermoduleStream=Async_streammoduleSynchronous_time_source=Synchronous_time_sourcemoduleTail=TailmoduleThrottle=ThrottlemoduleTime_source=Time_source(** {2 Toplevel functions }
The functions below are broadly useful when writing Async programs, and so are made
available at the toplevel. *)letafter=Clock_ns.afterletat=Clock_ns.atletcatch=Monitor.catchletchoice=Deferred.choiceletchoose=Deferred.chooseletdon't_wait_for=Deferred.don't_wait_forletevery=Clock_ns.everyletnever=Deferred.neverletschedule=Scheduler.scheduleletschedule'=Scheduler.schedule'lettry_with=Monitor.try_withletupon=Deferred.uponletwith_timeout=Clock_ns.with_timeoutletwithin=Scheduler.withinletwithin'=Scheduler.within'(** {2 Infix operators and [Let_syntax] support} *)include(Deferred:Monad.Infixwithtype'at:='aDeferred.t)(** equivalent to {!Deferred.upon}. *)let(>>>)=Deferred.Infix.(>>>)(** equivalent to {!Deferred.Result.bind}. *)let(>>=?)=Deferred.Result.(>>=)(** equivalent to {!Deferred.Result.map}. *)let(>>|?)=Deferred.Result.(>>|)includeDeferred.Let_syntax(**/**)(** The modules in [Async_kernel_private] are used for constructing and testing Async, and
should not otherwise be used. *)moduleAsync_kernel_private=structmoduleDebug=DebugmoduleIvar0=Ivar0moduleIvar_filler=Ivar_fillermoduleJob=JobmoduleStack_or_counter=Stack_or_counterend(**/**)(* This test must be in this library, because it requires [return] to be inlined. Moving
it to another library will cause it to break with [X_LIBRARY_INLINING=false]. *)let%test_unit"[return ()] does not allocate"=letw1=Gc.minor_words()inignore(Sys.opaque_identity(return()):_Deferred.t);ignore(Sys.opaque_identity(Deferred.return()):_Deferred.t);ignore(Sys.opaque_identity(Deferred.Let_syntax.return()):_Deferred.t);ignore(Sys.opaque_identity(Deferred.Let_syntax.Let_syntax.return()):_Deferred.t);letw2=Gc.minor_words()in[%test_result:int]w2~expect:w1;;