Fix the date - duration operator to handle date rounding mode

it was only applied to the addition!
This commit is contained in:
Louis Gesbert 2024-09-10 18:26:34 +02:00
parent d3f4b58f2f
commit 20c37495b5
13 changed files with 55 additions and 28 deletions

View File

@ -569,6 +569,9 @@ let rec translate_expr (ctx : 'm ctx) (e : 'm S.expr) : 'm Ast.expr boxed =
| EAppOp { op = Add_dat_dur _, opos; args; tys } -> | EAppOp { op = Add_dat_dur _, opos; args; tys } ->
let args = List.map (translate_expr ctx) args in let args = List.map (translate_expr ctx) args in
Expr.eappop ~op:(Add_dat_dur ctx.date_rounding, opos) ~args ~tys m Expr.eappop ~op:(Add_dat_dur ctx.date_rounding, opos) ~args ~tys m
| EAppOp { op = Sub_dat_dur _, opos; args; tys } ->
let args = List.map (translate_expr ctx) args in
Expr.eappop ~op:(Sub_dat_dur ctx.date_rounding, opos) ~args ~tys m
| ( EVar _ | EAbs _ | ELit _ | EStruct _ | EStructAccess _ | ETuple _ | ( EVar _ | EAbs _ | ELit _ | EStruct _ | EStructAccess _ | ETuple _
| ETupleAccess _ | EInj _ | EFatalError _ | EEmpty | EErrorOnEmpty _ | ETupleAccess _ | EInj _ | EFatalError _ | EEmpty | EErrorOnEmpty _
| EArray _ | EIfThenElse _ | EAppOp _ ) as e -> | EArray _ | EIfThenElse _ | EAppOp _ ) as e ->

View File

@ -545,7 +545,7 @@ module G = Graph.Persistent.Digraph.AbstractLabeled (V) (E)
let op_kind = function let op_kind = function
| Op.Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _ | Add_dur_dur | Op.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_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur _
| Sub_dur_dur -> | Sub_dur_dur ->
`Sum `Sum
| Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int | Div_int_int | Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int | Div_int_int
@ -754,7 +754,7 @@ let program_to_graph
| Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _ | Add_dur_dur | Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _ | Add_dur_dur
-> ->
Some (E.Lhs ""), Some (E.Rhs "") Some (E.Lhs ""), Some (E.Rhs "")
| Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur | Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur _
| Sub_dur_dur -> | Sub_dur_dur ->
Some (E.Lhs ""), Some (E.Rhs "") Some (E.Lhs ""), Some (E.Rhs "")
| Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int -> | Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int ->
@ -1055,8 +1055,8 @@ let expr_to_dot_label0 :
| Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _ | Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _
| Add_dur_dur | Add -> | Add_dur_dur | Add ->
"+" "+"
| Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur | Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat
| Sub_dur_dur | Sub -> | Sub_dat_dur _ | Sub_dur_dur | Sub ->
"-" "-"
| Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int | Mult -> | Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int | Mult ->
"×" "×"

View File

@ -96,8 +96,8 @@ let op_can_raise op =
let open Op in let open Op in
match Mark.remove op with match Mark.remove op with
| HandleExceptions | Div_int_int | Div_rat_rat | Div_mon_mon | Div_mon_rat | HandleExceptions | Div_int_int | Div_rat_rat | Div_mon_mon | Div_mon_rat
| Div_dur_dur | Add_dat_dur _ | Gte_dur_dur | Gt_dur_dur | Lte_dur_dur | Div_dur_dur | Add_dat_dur _ | Sub_dat_dur _ | Gte_dur_dur | Gt_dur_dur
| Lt_dur_dur | Eq_dur_dur | Map2 -> | Lte_dur_dur | Lt_dur_dur | Eq_dur_dur | Map2 ->
true true
| _ -> false | _ -> false

View File

@ -280,9 +280,9 @@ let rec format_expression (ctx : ctx) (fmt : Format.formatter) (e : expr) : unit
| EAppOp { op = Add_dat_dur rounding, _; args; _ } -> | EAppOp { op = Add_dat_dur rounding, _; args; _ } ->
Format.fprintf fmt "o_add_dat_dur(%s,@ %a)" Format.fprintf fmt "o_add_dat_dur(%s,@ %a)"
(match rounding with (match rounding with
| RoundUp -> "catala_date_round_up" | RoundUp -> "dc_date_round_up"
| RoundDown -> "catala_date_round_down" | RoundDown -> "dc_date_round_down"
| AbortOnRound -> "catala_date_round_abort") | AbortOnRound -> "dc_date_round_abort")
(Format.pp_print_list (format_expression ctx) ~pp_sep:(fun ppf () -> (Format.pp_print_list (format_expression ctx) ~pp_sep:(fun ppf () ->
Format.fprintf ppf ",@ ")) Format.fprintf ppf ",@ "))
args args

View File

@ -67,9 +67,14 @@ let format_op (fmt : Format.formatter) (op : operator Mark.pos) : unit =
| RoundUp -> "DateRounding.RoundUp" | RoundUp -> "DateRounding.RoundUp"
| RoundDown -> "DateRounding.RoundDown" | RoundDown -> "DateRounding.RoundDown"
| AbortOnRound -> "DateRounding.AbortOnRound") | AbortOnRound -> "DateRounding.AbortOnRound")
| Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur | Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dur_dur ->
| Sub_dur_dur ->
Format.pp_print_string fmt "-" Format.pp_print_string fmt "-"
| Sub_dat_dur rounding ->
Format.fprintf fmt "sub_date_duration(%s)"
(match rounding with
| RoundUp -> "DateRounding.RoundUp"
| RoundDown -> "DateRounding.RoundDown"
| AbortOnRound -> "DateRounding.AbortOnRound")
| Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int -> | Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int ->
Format.pp_print_string fmt "*" Format.pp_print_string fmt "*"
| Div_int_int | Div_rat_rat | Div_mon_mon | Div_mon_rat | Div_dur_dur -> | Div_int_int | Div_rat_rat | Div_mon_mon | Div_mon_rat | Div_dur_dur ->

View File

@ -368,7 +368,7 @@ module Op = struct
| Sub_rat_rat : < resolved ; .. > t | Sub_rat_rat : < resolved ; .. > t
| Sub_mon_mon : < resolved ; .. > t | Sub_mon_mon : < resolved ; .. > t
| Sub_dat_dat : < resolved ; .. > t | Sub_dat_dat : < resolved ; .. > t
| Sub_dat_dur : < resolved ; .. > t | Sub_dat_dur : date_rounding -> < resolved ; .. > t
| Sub_dur_dur : < resolved ; .. > t | Sub_dur_dur : < resolved ; .. > t
| Mult : < overloaded ; .. > t | Mult : < overloaded ; .. > t
| Mult_int_int : < resolved ; .. > t | Mult_int_int : < resolved ; .. > t

View File

@ -339,8 +339,8 @@ let rec evaluate_operator
ELit (LMoney (o_sub_mon_mon x y)) ELit (LMoney (o_sub_mon_mon x y))
| Sub_dat_dat, [(ELit (LDate x), _); (ELit (LDate y), _)] -> | Sub_dat_dat, [(ELit (LDate x), _); (ELit (LDate y), _)] ->
ELit (LDuration (o_sub_dat_dat x y)) ELit (LDuration (o_sub_dat_dat x y))
| Sub_dat_dur, [(ELit (LDate x), _); (ELit (LDuration y), _)] -> | Sub_dat_dur r, [(ELit (LDate x), _); (ELit (LDuration y), _)] ->
ELit (LDate (o_sub_dat_dur x y)) ELit (LDate (o_sub_dat_dur r (rpos ()) x y))
| Sub_dur_dur, [(ELit (LDuration x), _); (ELit (LDuration y), _)] -> | Sub_dur_dur, [(ELit (LDuration x), _); (ELit (LDuration y), _)] ->
ELit (LDuration (o_sub_dur_dur x y)) ELit (LDuration (o_sub_dur_dur x y))
| Mult_int_int, [(ELit (LInt x), _); (ELit (LInt y), _)] -> | Mult_int_int, [(ELit (LInt x), _); (ELit (LInt y), _)] ->
@ -437,7 +437,7 @@ let rec evaluate_operator
| ( ( Minus_int | Minus_rat | Minus_mon | Minus_dur | ToRat_int | ToRat_mon | ( ( Minus_int | Minus_rat | Minus_mon | Minus_dur | ToRat_int | ToRat_mon
| ToMoney_rat | Round_rat | Round_mon | Add_int_int | Add_rat_rat | 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 | 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 | 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 | 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 | 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 | Lt_mon_mon | Lt_dat_dat | Lt_dur_dur | Lte_int_int | Lte_rat_rat

View File

@ -65,7 +65,12 @@ let name : type a. a t -> string = function
| Sub_rat_rat -> "o_sub_rat_rat" | Sub_rat_rat -> "o_sub_rat_rat"
| Sub_mon_mon -> "o_sub_mon_mon" | Sub_mon_mon -> "o_sub_mon_mon"
| Sub_dat_dat -> "o_sub_dat_dat" | Sub_dat_dat -> "o_sub_dat_dat"
| Sub_dat_dur -> "o_sub_dat_dur" | Sub_dat_dur rm -> begin
match rm with
| RoundUp -> "o_sub_dat_dur RoundUp"
| RoundDown -> "o_sub_dat_dur RoundDown"
| AbortOnRound -> "o_sub_dat_dur AbortOnRound"
end
| Sub_dur_dur -> "o_sub_dur_dur" | Sub_dur_dur -> "o_sub_dur_dur"
| Mult -> "o_mult" | Mult -> "o_mult"
| Mult_int_int -> "o_mult_int_int" | Mult_int_int -> "o_mult_int_int"
@ -150,6 +155,7 @@ let compare (type a1 a2) (t1 : a1 t) (t2 : a2 t) =
| 0 -> List.compare Uid.MarkedString.compare info1 info2 | 0 -> List.compare Uid.MarkedString.compare info1 info2
| n -> n) | n -> n)
| Add_dat_dur l, Add_dat_dur r -> Stdlib.compare l r | Add_dat_dur l, Add_dat_dur r -> Stdlib.compare l r
| Sub_dat_dur l, Sub_dat_dur r -> Stdlib.compare l r
| Not, Not | Not, Not
| Length, Length | Length, Length
| GetDay, GetDay | GetDay, GetDay
@ -189,7 +195,6 @@ let compare (type a1 a2) (t1 : a1 t) (t2 : a2 t) =
| Sub_rat_rat, Sub_rat_rat | Sub_rat_rat, Sub_rat_rat
| Sub_mon_mon, Sub_mon_mon | Sub_mon_mon, Sub_mon_mon
| Sub_dat_dat, Sub_dat_dat | Sub_dat_dat, Sub_dat_dat
| Sub_dat_dur, Sub_dat_dur
| Sub_dur_dur, Sub_dur_dur | Sub_dur_dur, Sub_dur_dur
| Mult, Mult | Mult, Mult
| Mult_int_int, Mult_int_int | Mult_int_int, Mult_int_int
@ -276,7 +281,7 @@ let compare (type a1 a2) (t1 : a1 t) (t2 : a2 t) =
| Sub_rat_rat, _ -> -1 | _, Sub_rat_rat -> 1 | Sub_rat_rat, _ -> -1 | _, Sub_rat_rat -> 1
| Sub_mon_mon, _ -> -1 | _, Sub_mon_mon -> 1 | Sub_mon_mon, _ -> -1 | _, Sub_mon_mon -> 1
| Sub_dat_dat, _ -> -1 | _, Sub_dat_dat -> 1 | Sub_dat_dat, _ -> -1 | _, Sub_dat_dat -> 1
| Sub_dat_dur, _ -> -1 | _, Sub_dat_dur -> 1 | Sub_dat_dur _, _ -> -1 | _, Sub_dat_dur _ -> 1
| Sub_dur_dur, _ -> -1 | _, Sub_dur_dur -> 1 | Sub_dur_dur, _ -> -1 | _, Sub_dur_dur -> 1
| Mult, _ -> -1 | _, Mult -> 1 | Mult, _ -> -1 | _, Mult -> 1
| Mult_int_int, _ -> -1 | _, Mult_int_int -> 1 | Mult_int_int, _ -> -1 | _, Mult_int_int -> 1
@ -354,7 +359,7 @@ let kind_dispatch :
| ( ( Minus_int | Minus_rat | Minus_mon | Minus_dur | ToRat_int | ToRat_mon | ( ( Minus_int | Minus_rat | Minus_mon | Minus_dur | ToRat_int | ToRat_mon
| ToMoney_rat | Round_rat | Round_mon | Add_int_int | Add_rat_rat | 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 | 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 | 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 | 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 | 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 | Lt_mon_mon | Lt_dat_dat | Lt_dur_dur | Lte_int_int | Lte_rat_rat
@ -381,7 +386,7 @@ let translate (t : 'a no_overloads t Mark.pos) : 'b no_overloads t Mark.pos =
| Concat | Filter | Reduce | Fold | Minus_int | Minus_rat | Minus_mon | Concat | Filter | Reduce | Fold | Minus_int | Minus_rat | Minus_mon
| Minus_dur | ToRat_int | ToRat_mon | ToMoney_rat | Round_rat | Round_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 | 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_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 | 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 | 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 | Lt_int_int | Lt_rat_rat | Lt_mon_mon | Lt_dat_dat | Lt_dur_dur
@ -442,7 +447,7 @@ let resolved_type ((op : resolved t), pos) =
| Sub_rat_rat -> [TRat; TRat], TRat | Sub_rat_rat -> [TRat; TRat], TRat
| Sub_mon_mon -> [TMoney; TMoney], TMoney | Sub_mon_mon -> [TMoney; TMoney], TMoney
| Sub_dat_dat -> [TDate; TDate], TDuration | Sub_dat_dat -> [TDate; TDate], TDuration
| Sub_dat_dur -> [TDate; TDuration], TDate | Sub_dat_dur _ -> [TDate; TDuration], TDate
| Sub_dur_dur -> [TDuration; TDuration], TDuration | Sub_dur_dur -> [TDuration; TDuration], TDuration
| Mult_int_int -> [TInt; TInt], TInt | Mult_int_int -> [TInt; TInt], TInt
| Mult_rat_rat -> [TRat; TRat], TRat | Mult_rat_rat -> [TRat; TRat], TRat
@ -505,7 +510,7 @@ let resolve_overload_aux (op : overloaded t) (operands : typ_lit list) :
| Sub, [TMoney; TMoney] -> Sub_mon_mon, `Straight | Sub, [TMoney; TMoney] -> Sub_mon_mon, `Straight
| Sub, [TDuration; TDuration] -> Sub_dur_dur, `Straight | Sub, [TDuration; TDuration] -> Sub_dur_dur, `Straight
| Sub, [TDate; TDate] -> Sub_dat_dat, `Straight | Sub, [TDate; TDate] -> Sub_dat_dat, `Straight
| Sub, [TDate; TDuration] -> Sub_dat_dur, `Straight | Sub, [TDate; TDuration] -> Sub_dat_dur AbortOnRound, `Straight
| Mult, [TInt; TInt] -> Mult_int_int, `Straight | Mult, [TInt; TInt] -> Mult_int_int, `Straight
| Mult, [TRat; TRat] -> Mult_rat_rat, `Straight | Mult, [TRat; TRat] -> Mult_rat_rat, `Straight
| Mult, [TMoney; TRat] -> Mult_mon_rat, `Straight | Mult, [TMoney; TRat] -> Mult_mon_rat, `Straight

View File

@ -237,7 +237,9 @@ let operator_to_string : type a. a Op.t -> string =
| Sub_rat_rat -> "-." | Sub_rat_rat -> "-."
| Sub_mon_mon -> "-$" | Sub_mon_mon -> "-$"
| Sub_dat_dat -> "-@" | Sub_dat_dat -> "-@"
| Sub_dat_dur -> "-@^" | Sub_dat_dur AbortOnRound -> "-@"
| Sub_dat_dur RoundUp -> "-@^u"
| Sub_dat_dur RoundDown -> "-@d"
| Sub_dur_dur -> "-^" | Sub_dur_dur -> "-^"
| Mult -> "*" | Mult -> "*"
| Mult_int_int -> "*!" | Mult_int_int -> "*!"
@ -314,7 +316,7 @@ let operator_to_shorter_string : type a. a Op.t -> string =
| Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _ | Add_dur_dur | Add | Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _ | Add_dur_dur | Add
-> ->
"+" "+"
| Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur | Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur _
| Sub_dur_dur | Sub -> | Sub_dur_dur | Sub ->
"-" "-"
| Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int | Mult -> "*" | Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int | Mult -> "*"
@ -397,7 +399,7 @@ module Precedence = struct
| Add_dur_dur -> | Add_dur_dur ->
Op Add Op Add
| Sub | Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub | Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat
| Sub_dat_dur | Sub_dur_dur -> | Sub_dat_dur _ | Sub_dur_dur ->
Op Sub Op Sub
| Mult | Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int -> | Mult | Mult_int_int | Mult_rat_rat | Mult_mon_rat | Mult_dur_int ->
Op Mul Op Mul

View File

@ -539,7 +539,7 @@ let rec translate_op :
| (Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _ | Add_dur_dur), _ | (Add_int_int | Add_rat_rat | Add_mon_mon | Add_dat_dur _ | Add_dur_dur), _
-> ->
app Arithmetic.mk_add app Arithmetic.mk_add
| ( ( Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur | ( ( Sub_int_int | Sub_rat_rat | Sub_mon_mon | Sub_dat_dat | Sub_dat_dur _
| Sub_dur_dur ), | Sub_dur_dur ),
_ ) -> _ ) ->
app Arithmetic.mk_sub app Arithmetic.mk_sub

View File

@ -806,7 +806,10 @@ module Oper = struct
let o_sub_rat_rat i1 i2 = Q.sub i1 i2 let o_sub_rat_rat i1 i2 = Q.sub i1 i2
let o_sub_mon_mon m1 m2 = Z.sub m1 m2 let o_sub_mon_mon m1 m2 = Z.sub m1 m2
let o_sub_dat_dat = Dates_calc.Dates.sub_dates let o_sub_dat_dat = Dates_calc.Dates.sub_dates
let o_sub_dat_dur dat dur = Dates_calc.Dates.(add_dates dat (neg_period dur))
let o_sub_dat_dur r pos dat dur =
o_add_dat_dur r pos dat (Dates_calc.Dates.neg_period dur)
let o_sub_dur_dur = Dates_calc.Dates.sub_periods let o_sub_dur_dur = Dates_calc.Dates.sub_periods
let o_mult_int_int i1 i2 = Z.mul i1 i2 let o_mult_int_int i1 i2 = Z.mul i1 i2
let o_mult_rat_rat i1 i2 = Q.mul i1 i2 let o_mult_rat_rat i1 i2 = Q.mul i1 i2

View File

@ -387,7 +387,10 @@ module Oper : sig
val o_sub_rat_rat : decimal -> decimal -> decimal val o_sub_rat_rat : decimal -> decimal -> decimal
val o_sub_mon_mon : money -> money -> money val o_sub_mon_mon : money -> money -> money
val o_sub_dat_dat : date -> date -> duration val o_sub_dat_dat : date -> date -> duration
val o_sub_dat_dur : date -> duration -> date (* TODO: rounding mode!? *)
val o_sub_dat_dur :
date_rounding -> source_position -> date -> duration -> date
val o_sub_dur_dur : duration -> duration -> duration val o_sub_dur_dur : duration -> duration -> duration
val o_mult_int_int : integer -> integer -> integer val o_mult_int_int : integer -> integer -> integer
val o_mult_rat_rat : decimal -> decimal -> decimal val o_mult_rat_rat : decimal -> decimal -> decimal

View File

@ -387,6 +387,12 @@ def add_date_duration(rounding: DateRounding):
return dat + dur return dat + dur
return add return add
# TODO: use rounding mode
def sub_date_duration(rounding: DateRounding):
def add(pos: SourcePosition, dat: Date, dur: Duration):
return dat - dur
return add
def lt_duration(pos: SourcePosition, x: Duration, y: Duration) -> bool: def lt_duration(pos: SourcePosition, x: Duration, y: Duration) -> bool:
x = self.value.normalized() x = self.value.normalized()
y = other.value.normalized() y = other.value.normalized()