123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203open!Core_kernelopen!ImportmoduleDeferred=Deferred1moduleMonitor=structlettry_with=Monitor.try_withend(* Copied to [eager_deferred_or_error.ml]. There should be no diffs below this line. *)include(Deferred_result:Monad.S2withtype('a,'b)t:=('a,'b)Deferred_result.t)type'at='aOr_error.tDeferred.tincludeApplicative.Make(structtypenonrec'at='atletreturn=returnletapplyfx=Deferred_result.combinefx~ok:(funfx->fx)~err:(fune1e2->Error.of_list[e1;e2]);;letmap=`Custommapend)moduleLet_syntax=structletreturn=returnincludeMonad_infixmoduleLet_syntax=structletreturn=returnletmap=mapletbind=bindletboth=both(* from Applicative.Make *)moduleOpen_on_rhs=structendendendopenLet_syntaxletfailerror=Deferred.return(Result.failerror)letok_exnt=Deferred.mapt~f:Or_error.ok_exnletof_exnexn=Deferred.return(Or_error.of_exnexn)letof_exn_resultt=Deferred.mapt~f:Or_error.of_exn_resultleterrormsgvsexp_of=Deferred.return(Or_error.errormsgvsexp_of)leterror_ssexp=Deferred.return(Or_error.error_ssexp)leterror_stringmsg=Deferred.return(Or_error.error_stringmsg)leterrorfformat=ksprintferror_stringformatlettagt~tag=Deferred.mapt~f:(Or_error.tag~tag)lettag_st~tag=Deferred.mapt~f:(Or_error.tag_s~tag)lettag_argtmessageasexp_of_a=Deferred.mapt~f:(funt->Or_error.tag_argtmessageasexp_of_a);;letunimplementedmsg=Deferred.return(Or_error.unimplementedmsg)letcombine_errorsl=Deferred.map(Deferred.alll)~f:Or_error.combine_errorsletcombine_errors_unitl=Deferred.map(Deferred.alll)~f:Or_error.combine_errors_unitletfilter_ok_at_least_onel=Deferred.map(Deferred.alll)~f:Or_error.filter_ok_at_least_one;;letfind_map_okl~f=Deferred.repeat_until_finished(l,[])(fun(l,errors)->matchlwith|[]->leterrors=Error.of_list(List.reverrors)inDeferred.return(`Finished(Errorerrors))|hd::tl->Deferred.map(fhd)~f:(function|Errorcurrent_error->`Repeat(tl,current_error::errors)|Okresult->`Finished(Okresult)));;letok_unit=return()lettry_with?extract_exn?run?here?namef=Deferred.map(Monitor.try_with?extract_exn?run?here?namef)~f:(function|Errorexn->Error(Error.of_exnexn)|Ok_asok->ok);;lettry_with_join?extract_exn?run?here?namef=Deferred.map(try_with?extract_exn?run?here?namef)~f:Or_error.join;;moduleList=structletfoldilist~init:acc~f=letrecloopiacc=function|[]->returnacc|hd::tl->let%bindacc=fiacchdinloop(i+1)acctlinloop0acclist;;letfoldt~init~f=foldit~init~f:(fun_ax->fax)letseqmapit~f=foldit~init:[]~f:(funibsa->let%mapb=fiainb::bs)>>|List.rev;;letall=allletall_unit=all_unitletiteri?(how=`Sequential)t~f=matchhowwith|(`Parallel|`Max_concurrent_jobs_)ashow->all_unit(List.mapit~f:(unstage(Throttle.monad_sequence_how2~how~f)))|`Sequential->foldit~init:()~f:(funi()x->fix);;letmapi?(how=`Sequential)t~f=matchhowwith|(`Parallel|`Max_concurrent_jobs_)ashow->all(List.mapit~f:(unstage(Throttle.monad_sequence_how2~how~f)))|`Sequential->seqmapit~f;;letfilter_mapi?howt~f=mapit?how~f>>|List.filter_optletconcat_mapi?howt~f=mapit?how~f>>|List.concatletfilteri?howt~f=filter_mapi?howt~f:(funix->let%mapb=fixinifbthenSomexelseNone);;letfind_mapit~f=letrecfind_mapit~fi=matchtwith|[]->returnNone|hd::tl->(match%bindfihdwith|None->find_mapitl~f(i+1)|Some_assome->returnsome)infind_mapit~f0;;letfind_mapt~f=find_mapit~f:(fun_a->fa)letfindit~f=find_mapit~f:(funielt->let%mapb=fieltinifbthenSome(i,elt)elseNone);;letfindt~f=find_mapt~f:(funelt->let%mapb=feltinifbthenSomeeltelseNone);;letexistsit~f=match%mapfind_mapit~f:(funielt->let%mapb=fieltinifbthenSome()elseNone)with|Some()->true|None->false;;letfor_allit~f=match%mapfind_mapit~f:(funielt->let%mapb=fieltinifnotbthenSome()elseNone)with|Some()->false|None->true;;letiter?howt~f=iteri?howt~f:(fun_a->fa)letmap?howt~f=mapi?howt~f:(fun_a->fa)letfilter?howt~f=filteri?howt~f:(fun_a->fa)letfilter_map?howt~f=filter_mapi?howt~f:(fun_a->fa)letconcat_map?howt~f=concat_mapi?howt~f:(fun_a->fa)letfind_mapt~f=find_mapit~f:(fun_a->fa)letexistst~f=existsit~f:(fun_a->fa)letfor_allt~f=for_allit~f:(fun_a->fa)letinit?hown~f=map?how(List.initn~f:Fn.id)~fendletrecrepeat_until_finishedstatef=match%bindfstatewith|`Repeatstate->repeat_until_finishedstatef|`Finishedstate->returnstate;;