12345678910111213141516171819202122232425262728293031323334353637383940open!ImportopenStd_internalletrandomizespan~percent~scale=letmult=Percent.to_multpercentinifFloat.(<)mult0.||Float.(>)mult1.thenraise_s[%message"Span.randomize: percent is out of range [0x, 1x]"(percent:Percent.t)];letfactor=Random.float_range(1.-.mult)(Float.one_ulp`Up(1.+.mult))inscalespanfactor;;letformat_decimalntenthsunits=assert(tenths>=0&&tenths<10);ifn<10&&tenths<>0thensprintf"%d.%d%s"ntenthsunitselsesprintf"%d%s"nunits;;letshort_string~sign~hr~min~sec~ms~us~ns=lets=ifhr>=24thenformat_decimal(hr/24)(Int.of_float(Float.of_int(hr%24)/.2.4))"d"elseifhr>0thenformat_decimalhr(min/6)"h"elseifmin>0thenformat_decimalmin(sec/6)"m"elseifsec>0thenformat_decimalsec(ms/100)"s"elseifms>0thenformat_decimalms(us/100)"ms"elseifus>0thenformat_decimalus(ns/100)"us"elsesprintf"%ins"nsinmatch(sign:Sign.t)with|Neg->"-"^s|Zero|Pos->s;;