123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578(* This file is part of the Catala compiler, a specification language for tax
and social benefits computation rules. Copyright (C) 2020 Inria, contributor:
Louis Gesbert <louis.gesbert@inria.fr>
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License. *)openCatala_utilsopenDefinitionsincludeDefinitions.Opletname:typea.at->string=function|Not->"o_not"|Length->"o_length"|GetDay->"o_getDay"|GetMonth->"o_getMonth"|GetYear->"o_getYear"|FirstDayOfMonth->"o_firstDayOfMonth"|LastDayOfMonth->"o_lastDayOfMonth"|Log_->"o_log"|Minus->"o_minus"|Minus_int->"o_minus_int"|Minus_rat->"o_minus_rat"|Minus_mon->"o_minus_mon"|Minus_dur->"o_minus_dur"|ToRat->"o_torat"|ToRat_int->"o_torat_int"|ToRat_mon->"o_torat_mon"|ToMoney->"o_tomoney"|ToMoney_rat->"o_tomoney_rat"|Round->"o_round"|Round_rat->"o_round_rat"|Round_mon->"o_round_mon"|And->"o_and"|Or->"o_or"|Xor->"o_xor"|Eq->"o_eq"|Map->"o_map"|Map2->"o_map2"|Concat->"o_concat"|Filter->"o_filter"|Reduce->"o_reduce"|Add->"o_add"|Add_int_int->"o_add_int_int"|Add_rat_rat->"o_add_rat_rat"|Add_mon_mon->"o_add_mon_mon"|Add_dat_durrm->beginmatchrmwith|RoundUp->"o_add_dat_dur RoundUp"|RoundDown->"o_add_dat_dur RoundDown"|AbortOnRound->"o_add_dat_dur AbortOnRound"end|Add_dur_dur->"o_add_dur_dur"|Sub->"o_sub"|Sub_int_int->"o_sub_int_int"|Sub_rat_rat->"o_sub_rat_rat"|Sub_mon_mon->"o_sub_mon_mon"|Sub_dat_dat->"o_sub_dat_dat"|Sub_dat_dur->"o_sub_dat_dur"|Sub_dur_dur->"o_sub_dur_dur"|Mult->"o_mult"|Mult_int_int->"o_mult_int_int"|Mult_rat_rat->"o_mult_rat_rat"|Mult_mon_rat->"o_mult_mon_rat"|Mult_dur_int->"o_mult_dur_int"|Div->"o_div"|Div_int_int->"o_div_int_int"|Div_rat_rat->"o_div_rat_rat"|Div_mon_mon->"o_div_mon_mon"|Div_mon_rat->"o_div_mon_rat"|Div_dur_dur->"o_div_dur_dur"|Lt->"o_lt"|Lt_int_int->"o_lt_int_int"|Lt_rat_rat->"o_lt_rat_rat"|Lt_mon_mon->"o_lt_mon_mon"|Lt_dur_dur->"o_lt_dur_dur"|Lt_dat_dat->"o_lt_dat_dat"|Lte->"o_lte"|Lte_int_int->"o_lte_int_int"|Lte_rat_rat->"o_lte_rat_rat"|Lte_mon_mon->"o_lte_mon_mon"|Lte_dur_dur->"o_lte_dur_dur"|Lte_dat_dat->"o_lte_dat_dat"|Gt->"o_gt"|Gt_int_int->"o_gt_int_int"|Gt_rat_rat->"o_gt_rat_rat"|Gt_mon_mon->"o_gt_mon_mon"|Gt_dur_dur->"o_gt_dur_dur"|Gt_dat_dat->"o_gt_dat_dat"|Gte->"o_gte"|Gte_int_int->"o_gte_int_int"|Gte_rat_rat->"o_gte_rat_rat"|Gte_mon_mon->"o_gte_mon_mon"|Gte_dur_dur->"o_gte_dur_dur"|Gte_dat_dat->"o_gte_dat_dat"|Eq_int_int->"o_eq_int_int"|Eq_rat_rat->"o_eq_rat_rat"|Eq_mon_mon->"o_eq_mon_mon"|Eq_dur_dur->"o_eq_dur_dur"|Eq_dat_dat->"o_eq_dat_dat"|Fold->"o_fold"|HandleDefault->"o_handledefault"|HandleDefaultOpt->"o_handledefaultopt"|ToClosureEnv->"o_toclosureenv"|FromClosureEnv->"o_fromclosureenv"letcompare_log_entriesl1l2=matchl1,l2with|VarDeft1,VarDeft2->lettcompare=Type.compare(t1.log_typ,Pos.no_pos)(t2.log_typ,Pos.no_pos)iniftcompare=0thenletocompare=Bool.comparet1.log_io_outputt2.log_io_outputinifocompare=0thenmatcht1.log_io_input,t2.log_io_inputwith|NoInput,NoInput|OnlyInput,OnlyInput|Reentrant,Reentrant->0|NoInput,_->1|_,NoInput->-1|OnlyInput,_->1|_,OnlyInput->-1elseocompareelsetcompare|BeginCall,BeginCall|EndCall,EndCall|PosRecordIfTrueBool,PosRecordIfTrueBool->0|VarDef_,_->-1|_,VarDef_->1|BeginCall,_->-1|_,BeginCall->1|EndCall,_->-1|_,EndCall->1|PosRecordIfTrueBool,_->.|_,PosRecordIfTrueBool->.letcompare(typea1a2)(t1:a1t)(t2:a2t)=match[@ocamlformat"disable"]t1,t2with|Log(l1,info1),Log(l2,info2)->(matchcompare_log_entriesl1l2with|0->List.compareUid.MarkedString.compareinfo1info2|n->n)|Add_dat_durl,Add_dat_durr->Stdlib.comparelr|Not,Not|Length,Length|GetDay,GetDay|GetMonth,GetMonth|GetYear,GetYear|FirstDayOfMonth,FirstDayOfMonth|LastDayOfMonth,LastDayOfMonth|Minus,Minus|Minus_int,Minus_int|Minus_rat,Minus_rat|Minus_mon,Minus_mon|Minus_dur,Minus_dur|ToRat,ToRat|ToRat_int,ToRat_int|ToRat_mon,ToRat_mon|ToMoney,ToMoney|ToMoney_rat,ToMoney_rat|Round,Round|Round_rat,Round_rat|Round_mon,Round_mon|And,And|Or,Or|Xor,Xor|Eq,Eq|Map,Map|Map2,Map2|Concat,Concat|Filter,Filter|Reduce,Reduce|Add,Add|Add_int_int,Add_int_int|Add_rat_rat,Add_rat_rat|Add_mon_mon,Add_mon_mon|Add_dur_dur,Add_dur_dur|Sub,Sub|Sub_int_int,Sub_int_int|Sub_rat_rat,Sub_rat_rat|Sub_mon_mon,Sub_mon_mon|Sub_dat_dat,Sub_dat_dat|Sub_dat_dur,Sub_dat_dur|Sub_dur_dur,Sub_dur_dur|Mult,Mult|Mult_int_int,Mult_int_int|Mult_rat_rat,Mult_rat_rat|Mult_mon_rat,Mult_mon_rat|Mult_dur_int,Mult_dur_int|Div,Div|Div_int_int,Div_int_int|Div_rat_rat,Div_rat_rat|Div_mon_mon,Div_mon_mon|Div_mon_rat,Div_mon_rat|Div_dur_dur,Div_dur_dur|Lt,Lt|Lt_int_int,Lt_int_int|Lt_rat_rat,Lt_rat_rat|Lt_mon_mon,Lt_mon_mon|Lt_dat_dat,Lt_dat_dat|Lt_dur_dur,Lt_dur_dur|Lte,Lte|Lte_int_int,Lte_int_int|Lte_rat_rat,Lte_rat_rat|Lte_mon_mon,Lte_mon_mon|Lte_dat_dat,Lte_dat_dat|Lte_dur_dur,Lte_dur_dur|Gt,Gt|Gt_int_int,Gt_int_int|Gt_rat_rat,Gt_rat_rat|Gt_mon_mon,Gt_mon_mon|Gt_dat_dat,Gt_dat_dat|Gt_dur_dur,Gt_dur_dur|Gte,Gte|Gte_int_int,Gte_int_int|Gte_rat_rat,Gte_rat_rat|Gte_mon_mon,Gte_mon_mon|Gte_dat_dat,Gte_dat_dat|Gte_dur_dur,Gte_dur_dur|Eq_int_int,Eq_int_int|Eq_rat_rat,Eq_rat_rat|Eq_mon_mon,Eq_mon_mon|Eq_dat_dat,Eq_dat_dat|Eq_dur_dur,Eq_dur_dur|Fold,Fold|HandleDefault,HandleDefault|HandleDefaultOpt,HandleDefaultOpt|FromClosureEnv,FromClosureEnv|ToClosureEnv,ToClosureEnv->0|Not,_->-1|_,Not->1|Length,_->-1|_,Length->1|GetDay,_->-1|_,GetDay->1|GetMonth,_->-1|_,GetMonth->1|GetYear,_->-1|_,GetYear->1|FirstDayOfMonth,_->-1|_,FirstDayOfMonth->1|LastDayOfMonth,_->-1|_,LastDayOfMonth->1|Log_,_->-1|_,Log_->1|Minus,_->-1|_,Minus->1|Minus_int,_->-1|_,Minus_int->1|Minus_rat,_->-1|_,Minus_rat->1|Minus_mon,_->-1|_,Minus_mon->1|Minus_dur,_->-1|_,Minus_dur->1|ToRat,_->-1|_,ToRat->1|ToRat_int,_->-1|_,ToRat_int->1|ToRat_mon,_->-1|_,ToRat_mon ->1|ToMoney,_->-1|_,ToMoney ->1|ToMoney_rat,_->-1|_,ToMoney_rat->1|Round,_->-1|_,Round->1|Round_rat,_->-1|_,Round_rat->1|Round_mon,_->-1|_,Round_mon->1|And,_->-1|_,And->1|Or,_-> -1|_,Or->1|Xor,_->-1|_,Xor->1|Eq,_->-1|_,Eq-> 1|Map,_->-1|_,Map->1|Map2,_->-1|_,Map2->1|Concat,_->-1|_,Concat->1|Filter,_->-1|_,Filter->1|Reduce,_->-1|_,Reduce->1|Add,_->-1|_,Add->1|Add_int_int,_->-1|_,Add_int_int->1|Add_rat_rat,_->-1|_,Add_rat_rat->1|Add_mon_mon,_->-1|_,Add_mon_mon->1|Add_dat_dur_,_->-1|_,Add_dat_dur_->1|Add_dur_dur,_->-1|_,Add_dur_dur->1|Sub,_->-1|_,Sub->1|Sub_int_int,_->-1|_,Sub_int_int->1|Sub_rat_rat,_->-1|_,Sub_rat_rat->1|Sub_mon_mon,_->-1|_,Sub_mon_mon->1|Sub_dat_dat,_->-1|_,Sub_dat_dat->1|Sub_dat_dur,_->-1|_,Sub_dat_dur->1|Sub_dur_dur,_->-1|_,Sub_dur_dur ->1|Mult,_->-1|_,Mult->1|Mult_int_int,_->-1|_,Mult_int_int->1|Mult_rat_rat,_->-1|_,Mult_rat_rat->1|Mult_mon_rat,_->-1|_,Mult_mon_rat->1|Mult_dur_int,_->-1|_,Mult_dur_int->1|Div,_->-1|_,Div->1|Div_int_int,_->-1|_,Div_int_int->1|Div_rat_rat,_->-1|_,Div_rat_rat->1|Div_mon_mon,_->-1|_,Div_mon_mon->1|Div_mon_rat,_->-1|_,Div_mon_rat->1|Div_dur_dur,_->-1|_,Div_dur_dur->1|Lt,_->-1|_,Lt->1|Lt_int_int,_->-1|_,Lt_int_int ->1|Lt_rat_rat,_->-1|_,Lt_rat_rat->1|Lt_mon_mon,_->-1|_,Lt_mon_mon->1|Lt_dat_dat,_->-1|_,Lt_dat_dat->1|Lt_dur_dur,_->-1|_,Lt_dur_dur->1|Lte,_->-1|_,Lte->1|Lte_int_int,_->-1|_,Lte_int_int->1|Lte_rat_rat,_->-1|_,Lte_rat_rat->1|Lte_mon_mon,_->-1|_,Lte_mon_mon ->1|Lte_dat_dat,_->-1|_,Lte_dat_dat->1|Lte_dur_dur,_->-1|_,Lte_dur_dur->1|Gt,_->-1|_,Gt->1|Gt_int_int,_-> -1|_,Gt_int_int->1|Gt_rat_rat,_->-1|_,Gt_rat_rat->1|Gt_mon_mon,_->-1|_,Gt_mon_mon->1|Gt_dat_dat,_->-1|_,Gt_dat_dat ->1|Gt_dur_dur,_->-1|_,Gt_dur_dur ->1|Gte,_->-1|_,Gte->1|Gte_int_int,_->-1|_,Gte_int_int->1|Gte_rat_rat,_->-1|_,Gte_rat_rat->1|Gte_mon_mon,_->-1|_,Gte_mon_mon->1|Gte_dat_dat,_->-1|_,Gte_dat_dat->1|Gte_dur_dur,_->-1|_,Gte_dur_dur ->1|Eq_int_int,_->-1|_,Eq_int_int->1|Eq_rat_rat,_-> -1|_,Eq_rat_rat->1|Eq_mon_mon,_->-1|_,Eq_mon_mon->1|Eq_dat_dat,_->-1|_,Eq_dat_dat->1|Eq_dur_dur,_->-1|_,Eq_dur_dur->1|HandleDefault,_->-1|_,HandleDefault->1|HandleDefaultOpt,_->-1|_,HandleDefaultOpt->1|FromClosureEnv,_->-1|_,FromClosureEnv->1|ToClosureEnv,_->-1|_,ToClosureEnv->1|Fold,_|_,Fold->.letequalt1t2=compare t1t2=0(* Classification of operators *)letkind_dispatch:typea.polymorphic:(<polymorphic:yes;..>tMark.pos->'b)->monomorphic:(<monomorphic:yes;..>tMark.pos->'b)->?overloaded:(<overloaded :yes;..>tMark.pos->'b)->?resolved:(<resolved:yes;..>tMark.pos->'b)->atMark.pos->'b=fun~polymorphic~monomorphic?(overloaded=fun_->assertfalse)?(resolved=fun_->assertfalse)op->matchopwith|((Not|GetDay|GetMonth|GetYear|FirstDayOfMonth|LastDayOfMonth|And|Or|Xor),_)asop->monomorphicop|((Log_|Length|Eq|Map|Map2|Concat|Filter|Reduce|Fold|HandleDefault|HandleDefaultOpt|FromClosureEnv|ToClosureEnv),_)asop->polymorphicop|((Minus|ToRat|ToMoney|Round|Add|Sub|Mult|Div|Lt|Lte|Gt|Gte),_)asop->overloadedop|((Minus_int|Minus_rat|Minus_mon|Minus_dur|ToRat_int|ToRat_mon|ToMoney_rat|Round_rat|Round_mon|Add_int_int|Add_rat_rat|Add_mon_mon|Add_dat_dur_|Add_dur_dur|Sub_int_int|Sub_rat_rat|Sub_mon_mon|Sub_dat_dat|Sub_dat_dur|Sub_dur_dur|Mult_int_int|Mult_rat_rat|Mult_mon_rat|Mult_dur_int|Div_int_int|Div_rat_rat|Div_mon_mon|Div_mon_rat|Div_dur_dur|Lt_int_int|Lt_rat_rat|Lt_mon_mon|Lt_dat_dat|Lt_dur_dur|Lte_int_int|Lte_rat_rat|Lte_mon_mon|Lte_dat_dat|Lte_dur_dur|Gt_int_int|Gt_rat_rat|Gt_mon_mon|Gt_dat_dat|Gt_dur_dur|Gte_int_int|Gte_rat_rat|Gte_mon_mon|Gte_dat_dat|Gte_dur_dur|Eq_int_int|Eq_rat_rat|Eq_mon_mon|Eq_dat_dat|Eq_dur_dur),_)asop->resolvedoptype'ano_overloads=<overloaded:no;monomorphic:yes;polymorphic:yes;resolved:yes;..>as'alettranslate(t:'ano_overloadstMark.pos):'bno_overloadstMark.pos=matchtwith|((Not|GetDay|GetMonth|GetYear|FirstDayOfMonth|LastDayOfMonth|And|Or|Xor|HandleDefault|HandleDefaultOpt|Log_|Length|Eq|Map|Map2|Concat|Filter|Reduce|Fold|Minus_int|Minus_rat|Minus_mon|Minus_dur|ToRat_int|ToRat_mon|ToMoney_rat|Round_rat|Round_mon|Add_int_int|Add_rat_rat|Add_mon_mon|Add_dat_dur_|Add_dur_dur|Sub_int_int|Sub_rat_rat|Sub_mon_mon|Sub_dat_dat|Sub_dat_dur|Sub_dur_dur|Mult_int_int|Mult_rat_rat|Mult_mon_rat|Mult_dur_int|Div_int_int|Div_rat_rat|Div_mon_mon|Div_mon_rat|Div_dur_dur|Lt_int_int|Lt_rat_rat|Lt_mon_mon|Lt_dat_dat|Lt_dur_dur|Lte_int_int|Lte_rat_rat|Lte_mon_mon|Lte_dat_dat|Lte_dur_dur|Gt_int_int|Gt_rat_rat|Gt_mon_mon|Gt_dat_dat|Gt_dur_dur|Gte_int_int|Gte_rat_rat|Gte_mon_mon|Gte_dat_dat|Gte_dur_dur|Eq_int_int|Eq_rat_rat|Eq_mon_mon|Eq_dat_dat|Eq_dur_dur|FromClosureEnv|ToClosureEnv),_)asop->opletmonomorphic_type((op:monomorphict),pos)=letargs,ret=matchopwith|Not->[TBool],TBool|GetDay->[TDate],TInt|GetMonth->[TDate],TInt|GetYear->[TDate],TInt|FirstDayOfMonth->[TDate],TDate|LastDayOfMonth->[TDate],TDate|And->[TBool;TBool],TBool|Or->[TBool;TBool],TBool|Xor->[TBool;TBool],TBoolinTArrow(List.map(funtau->TLittau,pos)args,(TLitret,pos)),pos(** Rules for overloads definitions:
- the concrete operator, including its return type, is uniquely determined
by the type of the operands
- no resolved version of an operator should be the redefinition of another
one with an added conversion. For example, [int + rat -> rat] is not
acceptable (that would amount to implicit casts).
These two points can be generalised for binary operators as: when
considering an operator with type ['a -> 'b -> 'c], for any given two among
['a], ['b] and ['c], there should be a unique solution for the third. *)letresolved_type((op:resolvedt),pos)=letargs,ret=matchopwith|Minus_int->[TInt],TInt|Minus_rat->[TRat],TRat|Minus_mon->[TMoney],TMoney|Minus_dur->[TDuration],TDuration|ToRat_int->[TInt],TRat|ToRat_mon->[TMoney],TRat|ToMoney_rat->[TRat],TMoney|Round_rat->[TRat],TRat|Round_mon->[TMoney],TMoney|Add_int_int->[TInt;TInt],TInt|Add_rat_rat->[TRat;TRat],TRat|Add_mon_mon->[TMoney;TMoney],TMoney|Add_dat_dur_->[TDate;TDuration],TDate|Add_dur_dur->[TDuration;TDuration],TDuration|Sub_int_int->[TInt;TInt],TInt|Sub_rat_rat->[TRat;TRat],TRat|Sub_mon_mon->[TMoney;TMoney],TMoney|Sub_dat_dat->[TDate;TDate],TDuration|Sub_dat_dur->[TDate;TDuration],TDate|Sub_dur_dur->[TDuration;TDuration],TDuration|Mult_int_int->[TInt;TInt],TInt|Mult_rat_rat->[TRat;TRat],TRat|Mult_mon_rat->[TMoney;TRat],TMoney|Mult_dur_int->[TDuration;TInt],TDuration|Div_int_int->[TInt;TInt],TRat|Div_rat_rat->[TRat;TRat],TRat|Div_mon_mon->[TMoney;TMoney],TRat|Div_mon_rat->[TMoney;TRat],TMoney|Div_dur_dur->[TDuration;TDuration],TRat|Lt_int_int->[TInt;TInt],TBool|Lt_rat_rat->[TRat;TRat],TBool|Lt_mon_mon->[TMoney;TMoney],TBool|Lt_dat_dat->[TDate;TDate],TBool|Lt_dur_dur->[TDuration;TDuration],TBool|Lte_int_int->[TInt;TInt],TBool|Lte_rat_rat->[TRat;TRat],TBool|Lte_mon_mon->[TMoney;TMoney],TBool|Lte_dat_dat->[TDate;TDate],TBool|Lte_dur_dur->[TDuration;TDuration],TBool|Gt_int_int->[TInt;TInt],TBool|Gt_rat_rat->[TRat;TRat],TBool|Gt_mon_mon->[TMoney;TMoney],TBool|Gt_dat_dat->[TDate;TDate],TBool|Gt_dur_dur->[TDuration;TDuration],TBool|Gte_int_int->[TInt;TInt],TBool|Gte_rat_rat->[TRat;TRat],TBool|Gte_mon_mon->[TMoney;TMoney],TBool|Gte_dat_dat->[TDate;TDate],TBool|Gte_dur_dur->[TDuration;TDuration],TBool|Eq_int_int->[TInt;TInt],TBool|Eq_rat_rat->[TRat;TRat],TBool|Eq_mon_mon->[TMoney;TMoney],TBool|Eq_dat_dat->[TDate;TDate],TBool|Eq_dur_dur->[TDuration;TDuration],TBoolinTArrow(List.map(funtau->TLittau,pos)args,(TLitret,pos)),posletresolve_overload_aux(op:overloadedt)(operands:typ_litlist):<resolved:yes;..>t*[`Straight|`Reversed]=matchop,operandswith|Minus,[TInt]->Minus_int,`Straight|Minus,[TRat]->Minus_rat,`Straight|Minus,[TMoney]->Minus_mon,`Straight|Minus,[TDuration]->Minus_dur,`Straight|ToRat,[TInt]->ToRat_int,`Straight|ToRat,[TMoney]->ToRat_mon,`Straight|ToMoney,[TRat]->ToMoney_rat,`Straight|Round,[TRat]->Round_rat,`Straight|Round,[TMoney]->Round_mon,`Straight|Add,[TInt;TInt]->Add_int_int,`Straight|Add,[TRat;TRat]->Add_rat_rat,`Straight|Add,[TMoney;TMoney]->Add_mon_mon,`Straight|Add,[TDuration;TDuration]->Add_dur_dur,`Straight|Add,[TDate;TDuration]->Add_dat_durAbortOnRound,`Straight|Add,[TDuration;TDate]->Add_dat_durAbortOnRound,`Reversed|Sub,[TInt;TInt]->Sub_int_int,`Straight|Sub,[TRat;TRat]->Sub_rat_rat,`Straight|Sub,[TMoney;TMoney]->Sub_mon_mon,`Straight|Sub,[TDuration;TDuration]->Sub_dur_dur,`Straight|Sub,[TDate;TDate]->Sub_dat_dat,`Straight|Sub,[TDate;TDuration]->Sub_dat_dur,`Straight|Mult,[TInt;TInt]->Mult_int_int,`Straight|Mult,[TRat;TRat]->Mult_rat_rat,`Straight|Mult,[TMoney;TRat]->Mult_mon_rat,`Straight|Mult,[TRat;TMoney]->Mult_mon_rat,`Reversed|Mult,[TDuration;TInt]->Mult_dur_int,`Straight|Mult,[TInt;TDuration]->Mult_dur_int,`Reversed|Div,[TInt;TInt]->Div_int_int,`Straight|Div,[TRat;TRat]->Div_rat_rat,`Straight|Div,[TMoney;TMoney]->Div_mon_mon,`Straight|Div,[TMoney;TRat]->Div_mon_rat,`Straight|Div,[TDuration;TDuration]->Div_dur_dur,`Straight|Lt,[TInt;TInt]->Lt_int_int,`Straight|Lt,[TRat;TRat]->Lt_rat_rat,`Straight|Lt,[TMoney;TMoney]->Lt_mon_mon,`Straight|Lt,[TDuration;TDuration]->Lt_dur_dur,`Straight|Lt,[TDate;TDate]->Lt_dat_dat,`Straight|Lte,[TInt;TInt]->Lte_int_int,`Straight|Lte,[TRat;TRat]->Lte_rat_rat,`Straight|Lte,[TMoney;TMoney]->Lte_mon_mon,`Straight|Lte,[TDuration;TDuration]->Lte_dur_dur,`Straight|Lte,[TDate;TDate]->Lte_dat_dat,`Straight|Gt,[TInt;TInt]->Gt_int_int,`Straight|Gt,[TRat;TRat]->Gt_rat_rat,`Straight|Gt,[TMoney;TMoney]->Gt_mon_mon,`Straight|Gt,[TDuration;TDuration]->Gt_dur_dur,`Straight|Gt,[TDate;TDate]->Gt_dat_dat,`Straight|Gte,[TInt;TInt]->Gte_int_int,`Straight|Gte,[TRat;TRat]->Gte_rat_rat,`Straight|Gte,[TMoney;TMoney]->Gte_mon_mon,`Straight|Gte,[TDuration;TDuration]->Gte_dur_dur,`Straight|Gte,[TDate;TDate]->Gte_dat_dat,`Straight|((Minus|ToRat|ToMoney|Round|Add|Sub|Mult|Div|Lt|Lte|Gt|Gte),_)->raiseNot_foundletresolve_overloadctx((op,pos):overloadedtMark.pos)(operands:typlist):<resolved:yes;..>tMark.pos*[`Straight|`Reversed]=tryletoperands=List.map(funt->matchMark.removetwithTLittl->tl|_->raiseNot_found)operandsinletop,direction=resolve_overload_auxopoperandsin(op,pos),directionwithNot_found->Message.error~extra_pos:(("",pos)::List.map(funty->(Format.asprintf"Type %a coming from expression:"(Print.typctx)ty,Mark.getty))operands)"I don't know how to apply operator %a on types %a"(Print.operator~debug:true)op(Format.pp_print_list~pp_sep:(funppf()->Format.fprintfppf" and@ ")(Print.typctx))operandsletoverload_typectx(op:overloadedtMark.pos)(operands:typlist):typ=letrop=fst(resolve_overloadctxopoperands)inresolved_typerop