123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111openEio.StdmoduletypeS=sigtypetimetypet=<timeEio.Time.clock_base;advance:unit;set_time:time->unit;>valmake:unit->tvaladvance:t->unitvalset_time:t->time->unitendmoduletypeTIME=sigtypetvalzero:tvalcompare:t->t->intvalpp:tFmt.tendmoduleMake(T:TIME):Swithtypetime:=T.t=structtypet=<T.tEio.Time.clock_base;advance:unit;set_time:T.t->unit;>moduleKey=structtypet=<>letcompare=compareendmoduleJob=structtypet={time:T.t;resolver:unitPromise.u;}letcompareab=T.comparea.timeb.timeendmoduleQ=Psq.Make(Key)(Job)letmake()=object(self)inherit[T.t]Eio.Time.clock_basevalmutablenow=T.zerovalmutableq=Q.emptymethodnow=nowmethodsleep_untiltime=ifT.comparetimenow<=0thenFiber.yield()else(letp,r=Promise.create()inletk=objectendinq<-Q.addk{time;resolver=r}q;tryPromise.awaitpwithEio.Cancel.Cancelled_asex->q<-Q.removekq;raiseex)methodset_timetime=letrecdrain()=matchQ.minqwith|Some(_,v)whenT.comparev.timetime<=0->Promise.resolvev.resolver();q<-Option.get(Q.restq);drain()|_->()indrain();now<-time;traceln"mock time is now %a"T.ppnowmethodadvance=matchQ.minqwith|None->invalid_arg"No further events scheduled on mock clock"|Some(_,v)->self#set_timev.timeendletset_time(t:t)time=t#set_timetimeletadvance(t:t)=t#advanceendmoduleOld_time=structtypet=floatletcompare=Float.compareletppfx=Fmt.pff"%g"xletzero=0.0endmoduleMono_time=structtypet=Mtime.tletcompare=Mtime.compareletzero=Mtime.of_uint64_ns0Lletppft=lets=Int64.to_float(Mtime.to_uint64_nst)/.1e9inFmt.pff"%g"sendmoduleMono=Make(Mono_time)includeMake(Old_time)