1234567891011121314151617181920212223242526272829303132333435363738394041424344moduleMake(C:S.CORE_TYPES)=structmoduleStruct_proxy=Struct_proxy.Make(C)typetarget={mutableblocking:C.struct_resolverlist;(* Resolvers blocked on us *)pending:(C.struct_ref->unit)Queue.t;}letlocal_promise()=object(self:_#Struct_proxy.t)inherit[target]Struct_proxy.t{blocking=[];pending=Queue.create()}valname="local-promise"methodprivatedo_pipelinetargetiresultsmsg=(* We add an extra resolver here so that we can report [self]
as the blocker. *)matchresults#set_blocker(self:>C.base_ref)with|Error`Cycle->C.Request_payload.releasemsg;C.resolve_exnresults(Exception.v"Attempt to use pipelined call's result as pipeline target!")|Ok()->target.blocking<-results::target.blocking;target.pending|>Queue.add(funp->letcap=p#capiincap#callresultsmsg;C.dec_refcap)methodpp_unresolvedf_=Fmt.stringf"(unresolved)"methodprivateon_resolvetargetx=List.iter(funr->r#clear_blocker)target.blocking;Queue.iter(funfn->fnx)target.pendingmethodprivatesend_cancel_=()methodfield_sealed_dispatch__=Noneendletmake()=letp=local_promise()in(p:>C.struct_ref),p#resolverend