Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file start.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210open!Core_kernelopen!Async_kernelopen!ImportmoduleHandle=structmoduleInjector=structtype'at=|Before_app_startof'aQueue.t|Injectof('a->Vdom.Event.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.Event.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->Vdom.Event.t}[@@derivingfields]letcreate=Fields.createendmoduleApp_result=structtype('extra,'incoming)t={view:Vdom.Node.t;extra:'extra;inject_incoming:'incoming->Vdom.Event.t}[@@derivingfields]letcreate=Fields.createendletstart_generic_poly(typeinputinput_and_injectmodelactionresultextraincomingoutgoing)~(get_app_result:result->(extra,incoming)App_result.t)~(get_app_input:input:input->inject_outgoing:(outgoing->Vdom.Event.t)->input_and_inject)~(initial_input:input)~(initial_model:model)~bind_to_element_with_id~(component:(input_and_inject,model,action,result,Incr.state_witness,Vdom.Event.t)Bonsai_lib.Generic.Expert.unpacked)~(action_type_id:actionType_equal.Id.t):(input,extra,incoming,outgoing)Handle.t=letoutgoing_pipe,pipe_write=Pipe.create()inletmoduleOut_event=Virtual_dom.Vdom.Event.Define(structmoduleAction=structtypet=outgoingendlethandle=Pipe.write_without_pushback_if_openpipe_writeend)inletinput_var=Incr.Var.createinitial_inputinlethandle=Handle.create~input_var~outgoing_pipeinletmoduleIncr_dom_app=structmoduleModel=structtypet=modelletcutoff=phys_equalendmoduleState=structtypet=unitendmoduleAction=structtypet=actionletsexp_of_t=Type_equal.Id.to_sexpaction_type_idendleton_startup~schedule_action:__=return()letcreatemodel~old_model~inject=letopenIncr.Let_syntaxinletold_model=old_model>>|Option.someinletinput=let%mapinput=Incr.Var.watchinput_varinget_app_input~input~inject_outgoing:Out_event.injectinlet%mapsnapshot=Bonsai_lib.Generic.Expert.eval~input~old_model~model~inject~action_type_id~environment:Bonsai_types.Environment.empty~incr_state:Incr.State.tcomponentandmodel=modelinletapply_action=Bonsai_lib.Generic.Expert.Snapshot.apply_actionsnapshotinletapply_actionaction()~schedule_action:_=apply_action~schedule_event:Vdom.Event.Expert.handle_non_dom_event_exnactioninletresult=Bonsai_lib.Generic.Expert.Snapshot.resultsnapshotinlet{App_result.view;extra;inject_incoming}=get_app_resultresultinHandle.set_injecthandleinject_incoming;Bus.writehandle.extraextra;leton_display()~schedule_action:_=Handle.set_startedhandleinIncr_dom.Component.create~apply_action~on_displaymodelview;;endinIncr_dom.Start_app.start~bind_to_element_with_id~initial_model~stop:(Ivar.readhandle.stop)(moduleIncr_dom_app);handle;;letstart_generic~get_app_result~initial_input~bind_to_element_with_id~component=let(T{unpacked;action_type_id;model})=component|>Bonsai.to_generic|>Bonsai_lib.Generic.Expert.revealinstart_generic_poly~get_app_result~initial_input~initial_model:model.default~bind_to_element_with_id~component:unpacked~action_type_id;;(* 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;;