Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file start.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411open!Coreopen!Async_kernelopen!ImportopenJs_of_ocamlmoduletypeResult_spec=sigtypettypeextratypeincomingvalview:t->Vdom.Node.tvalextra:t->extravalincoming:t->incoming->unitVdom.Effect.tendmoduleArrow_deprecated=structmoduleHandle=structmoduleInjector=structtype'at=|Before_app_startof'aQueue.t|Injectof('a->unitVdom.Effect.t)endtype('input,'extra,'incoming,'outgoing)t={mutableinjector:'incomingInjector.t;stop:unitIvar.t;started:unitIvar.t;input_var:'inputIncr.Var.t;outgoing_pipe:'outgoingPipe.Reader.t;extra:('extra->unit)Bus.Read_write.t;last_extra:'extraMoption.t}letcreate~input_var~outgoing_pipe=letextra=Bus.create[%here]Arity1~on_subscription_after_first_write:Allow_and_send_last_value~on_callback_raise:(funerror->eprint_s[%sexp(error:Error.t)])inletlast_extra=Moption.create()inBus.iter_exnextra[%here]~f:(funextra->Moption.set_somelast_extraextra);{injector=Before_app_start(Queue.create());stop=Ivar.create();started=Ivar.create();input_var;outgoing_pipe;extra;last_extra};;letstopt=Ivar.fill_if_emptyt.stop()letstartedt=Ivar.readt.startedletscheduleta=matcht.injectorwith|Injectf->fa|>Vdom.Effect.Expert.handle_non_dom_event_exn|Before_app_startqueue->Queue.enqueuequeuea;;letset_startedt=Ivar.fill_if_emptyt.started()letset_injecttinject=letprev=t.injectorint.injector<-Injectinject;matchprevwith|Inject_->()|Before_app_startqueue->Queue.iterqueue~f:(schedulet);;letinputt=Incr.Var.valuet.input_varletset_inputtinput=Incr.Var.sett.input_varinputletupdate_inputt~f=set_inputt(f(inputt))letoutgoing{outgoing_pipe;_}=outgoing_pipeletextrat=Bus.read_onlyt.extraletlast_extrat=Moption.gett.last_extraendmoduleApp_input=structtype('input,'outgoing)t={input:'input;inject_outgoing:'outgoing->unitVdom.Effect.t}[@@derivingfields]letcreate=Fields.createendmoduleApp_result=structtype('extra,'incoming)t={view:Vdom.Node.t;extra:'extra;inject_incoming:'incoming->unitVdom.Effect.t}[@@derivingfields]letcreate=Fields.createletof_result_spec(typeresultextraincoming)(moduleResult:Result_specwithtypet=resultandtypeextra=extraandtypeincoming=incoming)(r:Result.t)={view=Result.viewr;extra=Result.extrar;inject_incoming=Result.incomingr};;endletmake_instrumented_computation?host?port?worker_namecomponent=letopenOption.Let_syntaxinmatch[%maplethost=hostandport=portandworker_name=worker_nameinhost,port,worker_name]with|Some(host,port,worker_name)->Forward_performance_entries.instrument~host~port~worker_namecomponent|None->print_endline"debugger host and port not be specified";{Forward_performance_entries.instrumented_computation=component;shutdown=(fun()->())};;typedebugging_state=|Not_debugging|Debuggingof{host:stringoption;port:intoption;worker_name:stringoption}letstart_bonsai_debugger(is_debugging_var:debugging_stateIncr.Var.t)(host:Js.js_stringJs.tJs.Optdef.t)(port:intJs.Optdef.t)(worker_name:Js.js_stringJs.tJs.Optdef.t)=matchIncr.Var.valueis_debugging_varwith|Debugging_->print_endline"Already debugging."|Not_debugging->print_endline"Starting the debugger.";Incr.Var.setis_debugging_var(Debugging{host=Js.Optdef.to_optionhost|>Option.map~f:Js.to_string;port=Js.Optdef.to_optionport;worker_name=Js.Optdef.to_optionworker_name|>Option.map~f:Js.to_string});;letstart_generic_poly(typeinputinput_and_injectmodeldynamic_actionstatic_actionresultextraincomingoutgoing)~(get_app_result:result->(extra,incoming)App_result.t)~(get_app_input:input:input->inject_outgoing:(outgoing->unitVdom.Effect.t)->input_and_inject)~(initial_input:input)~(initial_model:model)~bind_to_element_with_id~(computation:(model,dynamic_action,static_action,result)Bonsai.Private.Computation.t)~fresh~(dynamic_action_type_id:dynamic_actionType_equal.Id.t)~(static_action_type_id:static_actionType_equal.Id.t)~apply_static:(input,extra,incoming,outgoing)Handle.t=letoutgoing_pipe,pipe_write=Pipe.create()inletmoduleOut_event=Virtual_dom.Vdom.Effect.Define(structmoduleAction=structtypet=outgoingendlethandle=Pipe.write_without_pushback_if_openpipe_writeend)inletinput_var=Incr.Var.createinitial_inputinlethandle=Handle.create~input_var~outgoing_pipeinletinput=let%map.Incrinput=Incr.Var.watchinput_varinget_app_input~input~inject_outgoing:Out_event.injectinletprev_lifecycle=refBonsai.Private.Lifecycle.Collection.emptyinletis_debugging_var=Incr.Var.createNot_debugginginletdebugger_shutdown=refNoneinletmoduleIncr_dom_app=structmoduleModel=structtypet=modelletcutoff=phys_equalendmoduleState=structtypet=unitendmoduleAction=structletsexp_of_dynamic_action=Type_equal.Id.to_sexpdynamic_action_type_idletsexp_of_static_action=Type_equal.Id.to_sexpstatic_action_type_idtypet=|Dynamicofdynamic_action|Staticofstatic_action[@@derivingsexp_of]endletaction_requires_stabilization=function|Action.Dynamic_->true|Static_->false;;leton_startup~schedule_action:__=return()letcreatemodel~old_model:_~injectcomputation=letopenIncr.Let_syntaxinletenvironment=Bonsai.Private.Environment.(empty|>add_exn~key:fresh~data:input)inletinject_dynamica=inject(Action.Dynamica)inletinject_statica=inject(Action.Statica)inletevalcomputation=Bonsai.Private.eval~environment~path:Bonsai.Private.Path.empty~clock:Incr.clock~model~inject_dynamic~inject_staticcomputationinletsnapshot=evalcomputationinlet%mapview=let%map{App_result.view;extra;inject_incoming}=snapshot|>Bonsai.Private.Snapshot.result>>|get_app_resultinHandle.set_injecthandleinject_incoming;Bus.writehandle.extraextra;viewandapply_action=let%mapdynamic_apply_action=snapshot|>Bonsai.Private.Snapshot.apply_action|>Bonsai.Private.Apply_action.to_incrementalinfun()~schedule_eventmodelaction->matchactionwith|Action.Dynamicaction->dynamic_apply_actionmodelaction~schedule_event|Action.Staticaction->apply_static~inject:inject_static~schedule_eventmodelactionandon_display=let%maplifecycle=Bonsai.Private.Snapshot.lifecycle_or_emptysnapshotinfun()~schedule_event->Handle.set_startedhandle;schedule_event(Bonsai.Private.Lifecycle.Collection.diff!prev_lifecyclelifecycle);prev_lifecycle:=lifecycleinletupdate_visibilitymodel~schedule_event:_=modelin{Incr_dom.App_intf.Private.view;apply_action;update_visibility;on_display};;letcreatemodel~old_model~inject=letopenIncr.Let_syntaxinmatch%bindIncr.Var.watchis_debugging_varwith|Debugging{host;port;worker_name}->let{Forward_performance_entries.instrumented_computation;shutdown}=make_instrumented_computation?host?port?worker_namecomputationindebugger_shutdown:=Someshutdown;createmodel~old_model~injectinstrumented_computation|Not_debugging->createmodel~old_model~injectcomputation;;endinIncr_dom.Start_app.Private.start_bonsai~bind_to_element_with_id~initial_model~stop:(Ivar.readhandle.stop)(moduleIncr_dom_app);letstart_bonsai_debuggerdry_runhostportworker_name=letprint_message()=print_endline"Not starting debugger. Be aware that running the debugger will send \
performance data to the debugger server, which may be unacceptable if the \
data you work with is sensitive. Consider running a local server and calling \
this function again with the local host and port. If you wish to proceed, run \
this function again, passing \"true\" as the first parameter"inJs.Optdef.casedry_runprint_message(fundry_run->ifJs.to_booldry_runthen(start_bonsai_debuggeris_debugging_varhostportworker_name;Incr.stabilize())elseprint_message())inletstop_bonsai_debugger()=Option.iter!debugger_shutdown~f:(funf->f());debugger_shutdown:=None;Incr.Var.setis_debugging_varNot_debugging;Incr.stabilize()inJs.Unsafe.global##.startBonsaiDebugger:=Js.Unsafe.callbackstart_bonsai_debugger;Js.Unsafe.global##.stopBonsaiDebugger:=Js.Unsafe.callbackstop_bonsai_debugger;handle;;letstart_generic~get_app_result~initial_input~bind_to_element_with_id~component=letfresh=Type_equal.Id.create~name:""sexp_of_opaqueinletvar=Bonsai.Private.Value.namedfresh|>Bonsai.Private.conceal_valueinletcomputation=componentvar|>Bonsai.Private.reveal_computationinlet(Bonsai.Private.Computation.T{t;dynamic_action;static_action;apply_static;model})=computationinstart_generic_poly~get_app_result~initial_input~initial_model:model.default~bind_to_element_with_id~computation:t~fresh~dynamic_action_type_id:dynamic_action~static_action_type_id:static_action~apply_static;;(* I can't use currying here because of the value restriction. *)letstart_standalone~initial_input~bind_to_element_with_idcomponent=start_generic~get_app_result:(funview->{App_result.view;extra=();inject_incoming=Nothing.unreachable_code})~get_app_input:(fun~input~inject_outgoing:_->input)~initial_input~bind_to_element_with_id~component;;letstart~initial_input~bind_to_element_with_idcomponent=start_generic~get_app_result:Fn.id~get_app_input:App_input.create~initial_input~bind_to_element_with_id~component;;endmoduleProc=structmoduleHandle=structincludeArrow_deprecated.Handletype('extra,'incoming)t=(unit,'extra,'incoming,Nothing.t)Arrow_deprecated.Handle.tendmoduleResult_spec=structmoduletypeS=Result_spectype('r,'extra,'incoming)t=(moduleSwithtypet='randtypeextra='extraandtypeincoming='incoming)moduleNo_extra=structtypeextra=unitletextra_=()endmoduleNo_incoming=structtypeincoming=Nothing.tletincoming_=Nothing.unreachable_codeendletjust_the_view=(modulestructtypet=Vdom.Node.tletview=Fn.idincludeNo_extraincludeNo_incomingend:Swithtypet=Vdom.Node.tandtypeextra=unitandtypeincoming=Nothing.t);;endletstartresult_spec~bind_to_element_with_idcomputation=letbonsai=Fn.constcomputation|>Bonsai.Arrow_deprecated.map~f:(Arrow_deprecated.App_result.of_result_specresult_spec)inArrow_deprecated.start~initial_input:()~bind_to_element_with_idbonsai;;end