12345678910111213141516171819202122232425262728293031323334353637383940414243444546open!Coreopen!ImportmoduleMonitor=Monitor0typet=Types.Execution_context.t={monitor:Monitor.t;priority:Priority.t;local_storage:Univ_map.t;backtrace_history:Backtrace.tlist}[@@derivingfields,sexp_of]letinvariant(_:t)=()letmain={monitor=Monitor.main;priority=Priority.normal;local_storage=Univ_map.empty;backtrace_history=[]};;letcreate_like?monitor?priority?local_storaget=matchmonitor,priority,local_storagewith|None,None,None->(* avoid allocating in the trivial case, which e.g. happens when calling
[Async.schedule] without optional args *)t|_->letmonitor=Option.valuemonitor~default:t.monitorin{monitor;priority=Option.valuepriority~default:t.priority;local_storage=Option.valuelocal_storage~default:t.local_storage;backtrace_history=t.backtrace_history};;letfind_localtkey=Univ_map.findt.local_storagekeyletwith_localtkeydata={twithlocal_storage=Univ_map.changet.local_storagekey~f:(fun_->data)};;letrecord_backtracet={twithbacktrace_history=Backtrace.get()::t.backtrace_history};;