12345678910111213141516171819202122232425262728293031323334353637383940414243444546openCoremoduleMake(Qv:Qv_intf.S)=structexceptionCurrencyTypeMismatchofstring[@@derivingsexp,yojson]typet={symbol:string;value:Qv.t;}[@@derivingcompare]typeshowable={symbol_:string;[@key"symbol"]value_:string;[@key"value"]}[@@derivingshow,sexp,yojson]letcheck_symt1t2=ifString.comparet1.symbolt2.symbol=0thentrueelsefalseletmake_qv(symbol,qv)={symbol=symbol;value=qv;}letshow_symt=Printf.printf"%s"t.symbolletshow_valt=Printf.printf"%s"(Qv.S.to_strt.value)letshow_tt=Printf.printf"(%s %s)"t.symbol(Qv.S.to_strt.value)letnegt={twithvalue=Qv.S.negt.value}letabst={twithvalue=Qv.S.abst.value}let(+)t1t2=ifcheck_symt1t2then{t1withvalue=Qv.S.addt1.valuet2.value}elseraise(CurrencyTypeMismatch"cannot operate on two different currency types")let(-)t1t2=ifcheck_symt1t2then{t1withvalue=Qv.S.subt1.valuet2.value}elseraise(CurrencyTypeMismatch"cannot operate on two different currency types")let(*)~t~value={twithvalue=Qv.S.mult.valuevalue}let(/)tvalue={twithvalue=Qv.S.divt.valuevalue}letto_showable_jsonx=Yojson.Safe.to_string@@showable_to_yojson{symbol_=x.symbol;value_=Qv.S.to_strx.value}end