1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586type'msgonesub=|SubTickof(Time.posix->'msg)|SubMouseMoveof(float*float->'msg)|SubMouseDownof(unit->'msg)|SubMouseUpof(unit->'msg)|SubKeyDownof(Keyboard.key->'msg)|SubKeyUpof(Keyboard.key->'msg)type'msgt='msgonesublistletnone=[]letbatchxs=(List.flattenxs)(* was in Event_.ml before *)let(on_animation_frame:(Time.posix->'msg)->'msgt)=funf->[SubTickf]let(on_mouse_move:(float*float->'msg)->'msgt)=funf->[SubMouseMovef]let(on_mouse_down:(unit->'msg)->'msgt)=funf->[SubMouseDownf]let(on_mouse_up:(unit->'msg)->'msgt)=funf->[SubMouseUpf]let(on_key_down:(Keyboard.key->'msg)->'msgt)=funf->[SubKeyDownf]let(on_key_up:(Keyboard.key->'msg)->'msgt)=funf->[SubKeyUpf]typeevent=|ETickoffloat|EMouseMoveof(int*int)|EMouseButtonofbool(* is_down = true *)|EKeyChangedof(bool(* down = true *)*Keyboard.key)letrecfind_map_optf=function|[]->None|x::xs->(matchfxwith|None->find_map_optfxs|Somex->Somex)letevent_to_msgopteventsubs=matcheventwith|ETicktime->subs|>find_map_opt(function|SubTickf->Some(ftime)|_->None)|EMouseMove(x,y)->subs|>find_map_opt(function|SubMouseMovef->Some(f(float_of_intx,float_of_inty))|_->None)|EMouseButton(true)->subs|>find_map_opt(function|SubMouseDownf->Some(f())|_->None)|EMouseButton(false)->subs|>find_map_opt(function|SubMouseUpf->Some(f())|_->None)|EKeyChanged(true,key)->subs|>find_map_opt(function|SubKeyDownf->Some(fkey)|_->None)|EKeyChanged(false,key)->subs|>find_map_opt(function|SubKeyUpf->Some(fkey)|_->None)