Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file protect.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687moduleError=structtype'lpayload='loption*Pp.ttype'lt=|Userof'lpayload|Anomalyof'lpayloadletmap~f=function|Usere->User(fe)|Anomalye->Anomaly(fe)endmoduleR=structtype('a,'l)t=|Completedof('a,'lError.t)result|Interrupted(* signal sent, eval didn't complete *)leterrore=Completed(Error(Error.User(None,e)))letmap~f=function|Completed(Result.Okr)->Completed(Result.Ok(fr))|Completed(Result.Errorr)->Completed(Result.Errorr)|Interrupted->Interruptedletmap_error~f=function|Completed(Errore)->Completed(Error(Error.map~fe))|Completed(Okr)->Completed(Okr)|Interrupted->Interruptedletmap_loc~f=letf(loc,msg)=(Option.mapfloc,msg)inmap_error~fend(* Eval and reify exceptions *)leteval_exn~fx=tryletres=fxinR.Completed(Okres)with|Sys.Break->R.Interrupted|exn->lete,info=Exninfo.captureexninletloc=Loc.(get_locinfo)inletmsg=CErrors.iprint(e,info)inifCErrors.is_anomalyethenR.Completed(Error(Anomaly(loc,msg)))elseR.Completed(Error(User(loc,msg)))let_bind_exn~fx=matchxwith|R.Interrupted->R.Interrupted|R.Completed(Errore)->R.Completed(Errore)|R.Completed(Okr)->frletfb_queue:Loc.tMessage.tlistref=ref[]moduleE=structtype('a,'l)t={r:('a,'l)R.t;feedback:'lMessage.tlist}leteval~fx=letr=eval_exn~fxinletfeedback=List.rev!fb_queueinlet()=fb_queue:=[]in{r;feedback}letmap~f{r;feedback}={r=R.map~fr;feedback}letmap_message~f(loc,lvl,msg)=(Option.mapfloc,lvl,msg)letmap_loc~f{r;feedback}={r=R.map_loc~fr;feedback=List.map(map_message~f)feedback}letbind~f{r;feedback}=matchrwith|R.Interrupted->{r=R.Interrupted;feedback}|R.Completed(Errore)->{r=R.Completed(Errore);feedback}|R.Completed(Okr)->let{r;feedback=fb2}=frin{r;feedback=feedback@fb2}letokv={r=Completed(Okv);feedback=[]}end(* Eval with reified exceptions and feedback *)leteval~fx=E.eval~fx