123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213openFmlib_jstypeempty=[]typehttp_error=[`Http_statusofint|`Http_no_json|`Http_decode]typenot_found=[`Not_found]letabsurd(_:empty):'a=assertfalse(* Ok! Will never be called, because an object of type [empty]
cannot be constructed. *)type('a,+'e)t=(Base.Value.t->unit)->(('a,'e)result->unit)->unitletcontinue(k:'a->unit)(a:'a):unit=Assert_failure.attempt"Exception in task execution"(fun()->ka)(fun()->())letrun(task:('a,empty)t)(post:Base.Value.t->unit)(k:'a->unit):unit=taskpost(function|Oka->continueka|Errore->absurde)letsucceed(a:'a):('a,'e)t=fun_k->continuek(Oka)letreturn:'a->('a,'e)t=succeedletfail(e:'e):('a,'e)t=fun_k->continuek(Errore)letresult(r:('a,'e)result):('a,'e)t=fun_k->continuekrlet(>>=)(m:('a,'e)t)(f:'a->('b,'e)t):('b,'e)t=funpostk->mpost(function|Oka->fapostk|Errore->continuek(Errore))let(let*)=(>>=)letmap(f:'a->'b)(m:('a,'e)t):('b,'e)t=let*a=minreturn(fa)letmake_succeed(f:('a,'e)result->'b)(m:('a,'e)t):('b,empty)t=funpostk->mpost(funres->continuek(Ok(fres)))letlog_string(s:string):(unit,'e)t=fun_k->Base.Main.log_strings;continuek(Ok())letlog_value(v:Base.Value.t):(unit,'e)t=fun_k->Base.Main.log_valuev;continuek(Ok())letsleep(ms:int)(a:'a):('a,'e)t=fun_k->ignore(Timer.set(fun()->continuek(Oka))ms)letnext_tick(a:'a):('a,'e)t=sleep0aletsend_to_javascript(v:Base.Value.t):(unit,'e)t=funpostk->postv;continuek(Ok())letfocus(id:string):(unit,not_found)t=fun_k->matchDom.(Document.findidWindow.(document(get())))with|None->k(Error`Not_found)|Someel->Dom.Element.focusel;continuek(Ok())letblur(id:string):(unit,not_found)t=fun_k->matchDom.(Document.findidWindow.(document(get())))with|None->continuek(Error`Not_found)|Someel->Dom.Element.blurel;continuek(Ok())letrandom(rand:'aRandom.t):('a,'e)t=fun_k->continuek(Ok(Random.runrand))lethttp_text(meth:string)(url:string)(headers:(string*string)list)(body:string):(string,http_error)t=fun_k->letreq=Http_request.makemethurlheadersbodyinlethandler_=assert(Http_request.ready_statereq=4);letstatus=Http_request.statusreqinifstatus<>200then(* not ok *)continuek(Error(`Http_statusstatus))elsecontinuek(Ok(Http_request.response_text_stringreq))inEvent_target.add"loadend"handler(Http_request.event_targetreq)lethttp_json(meth:string)(url:string)(headers:(string*string)list)(body:string)(decode:'aBase.Decode.t):('a,http_error)t=fun_k->letreq=Http_request.makemethurlheadersbodyinlethandler_=assert(Http_request.ready_statereq=4);letstatus=Http_request.statusreqinifstatus<>200then(* not ok *)continuek(Error(`Http_statusstatus))elsematchBase.Value.parse(Http_request.response_text_valuereq)with|None->continuek(Error`Http_no_json)|Somev->matchdecodevwith|None->continuek(Error`Http_decode)|Somea->continuek(Oka)inEvent_target.add"loadend"handler(Http_request.event_targetreq)letnow:(Time.t,'e)t=fun_k->continuek(Ok(Date.now()))lettime_zone:(Time.Zone.t,'e)t=fun_k->continuek(Ok(Date.(zone_offset(now()))))