12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879open!Coreopen!Async_kernelopen!ImportopenJs_of_ocamltype'at={var:'aBonsai.Var.t;setter:'a->unit;clear:unit->unit;effect:'a->unitEffect.t}letgetter_setterkind=letopenOption.Let_syntaxinlet%mapstorage=matchkindwith|`Local_storage->Dom_html.window##.localStorage|>Js.Optdef.to_option|`Session_storage->Dom_html.window##.sessionStorage|>Js.Optdef.to_optioninletsetkeyvalue=storage##setItem(Js.stringkey)(Js.stringvalue)inletgetkey=storage##getItem(Js.stringkey)|>Js.Opt.to_option|>Option.map~f:Js.to_stringinletdeletekey=storage##removeItem(Js.stringkey)inget,set,delete;;letcreate(typea)(moduleM:Sexpablewithtypet=a)kind~unique_id~default=letgetter,setter,deleter=matchgetter_setterkindwith|Some(getter,setter,delete)->getter,setter,delete|None->(fun_key->None),(fun_key_value->()),fun_key->()inletvalue=matchgetterunique_idwith|None->eprint_s[%message"WARNING: Could not find a sexp for persistent_var"(unique_id:string)];default|Somesexp->(matchOr_error.try_with(fun()->M.t_of_sexp(Sexp.of_stringsexp))with|Oka->a|Errore->eprint_s[%message"WARNING: Could not deserialize persistent-var"(unique_id:string)(e:Error.t)];default)inletvar=Bonsai.Var.createvalueinletsettert=t|>M.sexp_of_t|>Sexp.to_string_mach|>setterunique_idinletclear()=deleterunique_idinleteffect=Effect.of_sync_fun(funa->settera;Bonsai.Var.setvara)in{var;setter;clear;effect};;letset{var;setter;clear=_;effect=_}a=settera;Bonsai.Var.setvara;;letvalue{var;setter=_;clear=_;effect=_}=Bonsai.Var.valuevarletupdate{var;setter;clear=_;effect=_}~f=Bonsai.Var.updatevar~f:(funold->letnew_=foldinsetternew_;new_);;letget{var;_}=Bonsai.Var.getvarletclear_persistence{var=_;setter=_;clear;effect=_}=clear()leteffect{effect;_}=effect