1234567891011121314151617181920212223242526272829303132333435363738394041424344454647moduleMake(Qv:Qv_intf.S)=structexceptionCurrencyTypeMismatchofstringtypet={symbol:string[@compare.ignore];value:Qv.t}[@@derivingcompare]typeshowable={symbol_:string[@key"symbol"];value_:string[@key"value"]}[@@derivingshow,yojson]letcheck_symt1t2=ifString.comparet1.symbolt2.symbol=0thentrueelsefalseletmake_qv(symbol,qv)={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_jsonx=Yojson.Safe.to_string@@showable_to_yojson{symbol_=x.symbol;value_=Qv.S.to_strx.value}end