From f111fd7d3feea50542d7c5084f30043b0c7ecec2 Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Wed, 1 Mar 2023 21:46:31 -0300 Subject: [PATCH 1/4] workaround for math variadic functions --- src/Core__Math.mjs | 40 +++++++++++++++++++++++++++++++++++++++- src/Core__Math.res | 28 ++++++++++++++++++++++++---- src/Core__Math.resi | 24 ++++++++---------------- test/TestSuite.mjs | 2 +- 4 files changed, 72 insertions(+), 22 deletions(-) diff --git a/src/Core__Math.mjs b/src/Core__Math.mjs index 87e83ffa..87892f8c 100644 --- a/src/Core__Math.mjs +++ b/src/Core__Math.mjs @@ -1,12 +1,50 @@ // Generated by ReScript, PLEASE EDIT WITH CARE +import * as Caml_splice_call from "rescript/lib/es6/caml_splice_call.js"; var Constants = {}; -var Int = {}; +function minMany(arr) { + if (arr.length !== 0) { + return Caml_splice_call.spliceApply(Math.min, [arr]); + } else { + return 0; + } +} + +function maxMany(arr) { + if (arr.length !== 0) { + return Caml_splice_call.spliceApply(Math.max, [arr]); + } else { + return 0; + } +} + +var Int = { + minMany: minMany, + maxMany: maxMany +}; + +function minMany$1(arr) { + if (arr.length !== 0) { + return Caml_splice_call.spliceApply(Math.min, [arr]); + } else { + return 0.0; + } +} + +function maxMany$1(arr) { + if (arr.length !== 0) { + return Caml_splice_call.spliceApply(Math.max, [arr]); + } else { + return 0.0; + } +} export { Constants , Int , + minMany$1 as minMany, + maxMany$1 as maxMany, } /* No side effect */ diff --git a/src/Core__Math.res b/src/Core__Math.res index c9b7497e..11a7acfd 100644 --- a/src/Core__Math.res +++ b/src/Core__Math.res @@ -14,9 +14,19 @@ module Int = { @val external clz32: int => int = "Math.clz32" @val external imul: (int, int) => int = "Math.imul" @val external min: (int, int) => int = "Math.min" - @variadic @val external minMany: array => int = "Math.min" + @variadic @val external _minMany: array => int = "Math.min" + let minMany = arr => + switch arr { + | [] => 0 + | arr => _minMany(arr) + } @val external max: (int, int) => int = "Math.max" - @variadic @val external maxMany: array => int = "Math.max" + @variadic @val external _maxMany: array => int = "Math.max" + let maxMany = arr => + switch arr { + | [] => 0 + | arr => _maxMany(arr) + } @val external pow: (int, ~exp: int) => int = "Math.pow" @val external sign: int => int = "Math.sign" } @@ -44,9 +54,19 @@ module Int = { @val external log10: float => float = "Math.log10" @val external log2: float => float = "Math.log2" @val external min: (float, float) => float = "Math.min" -@variadic @val external minMany: array => float = "Math.min" +@variadic @val external _minMany: array => float = "Math.min" +let minMany = arr => + switch arr { + | [] => 0.0 + | arr => _minMany(arr) + } @val external max: (float, float) => float = "Math.max" -@variadic @val external maxMany: array => float = "Math.max" +@variadic @val external _maxMany: array => float = "Math.max" +let maxMany = arr => + switch arr { + | [] => 0.0 + | arr => _maxMany(arr) + } @val external pow: (float, ~exp: float) => float = "Math.pow" @val external random: unit => float = "Math.random" @val external round: float => float = "Math.round" diff --git a/src/Core__Math.resi b/src/Core__Math.resi index 00cd21b6..f4c96015 100644 --- a/src/Core__Math.resi +++ b/src/Core__Math.resi @@ -209,12 +209,10 @@ module Int: { ```rescript Math.Int.minMany([1, 2]) // 1 Math.Int.minMany([-1, -2]) // -2 - Math.Int.minMany([])->Float.isFinite // false + Math.Int.minMany([]) // 0 ``` */ - @variadic - @val - external minMany: array => int = "Math.min" + let minMany: array => int /** `max(a, b)` returns the maximum of its two integer arguments. @@ -240,12 +238,10 @@ module Int: { ```rescript Math.Int.maxMany([1, 2]) // 2 Math.Int.maxMany([-1, -2]) // -1 - Math.Int.maxMany([])->Float.isFinite // false + Math.Int.maxMany([]) // 0 ``` */ - @variadic - @val - external maxMany: array => int = "Math.max" + let maxMany: array => int /** `pow(a, ~exp)` raises the given base `a` to the given exponent `exp`. @@ -650,12 +646,10 @@ See [`Math.min`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ```rescript Math.minMany([1.0, 2.0]) // 1.0 Math.minMany([-1.0, -2.0]) // -2.0 -Math.minMany([])->Float.isFinite // false +Math.minMany([]) // 0.0 ``` */ -@variadic -@val -external minMany: array => float = "Math.min" +let minMany: array => float /** `max(a, b)` returns the maximum of its two float arguments. @@ -681,12 +675,10 @@ See [`Math.max`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ```rescript Math.maxMany([1.0, 2.0]) // 2.0 Math.maxMany([-1.0, -2.0]) // -1.0 -Math.maxMany([])->Float.isFinite // false +Math.maxMany([]) // 0.0 ``` */ -@variadic -@val -external maxMany: array => float = "Math.max" +let maxMany: array => float /** `pow(a, ~exp)` raises the given base `a` to the given exponent `exp`. diff --git a/test/TestSuite.mjs b/test/TestSuite.mjs index 64ebfbc1..f3e3bfee 100644 --- a/test/TestSuite.mjs +++ b/test/TestSuite.mjs @@ -1,7 +1,7 @@ // Generated by ReScript, PLEASE EDIT WITH CARE -import * as ErrorTests from "./ErrorTests.mjs"; import * as ArrayTests from "./ArrayTests.mjs"; +import * as ErrorTests from "./ErrorTests.mjs"; import * as PromiseTest from "./PromiseTest.mjs"; var TestError = PromiseTest.TestError; From 41fc71e89b38cc27dea452ace3d26d503ce003ef Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Wed, 1 Mar 2023 21:52:52 -0300 Subject: [PATCH 2/4] fix format --- src/Core__Math.res | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Core__Math.res b/src/Core__Math.res index 11a7acfd..5dec8c18 100644 --- a/src/Core__Math.res +++ b/src/Core__Math.res @@ -56,17 +56,17 @@ module Int = { @val external min: (float, float) => float = "Math.min" @variadic @val external _minMany: array => float = "Math.min" let minMany = arr => - switch arr { - | [] => 0.0 - | arr => _minMany(arr) - } + switch arr { + | [] => 0.0 + | arr => _minMany(arr) + } @val external max: (float, float) => float = "Math.max" @variadic @val external _maxMany: array => float = "Math.max" let maxMany = arr => - switch arr { - | [] => 0.0 - | arr => _maxMany(arr) - } + switch arr { + | [] => 0.0 + | arr => _maxMany(arr) + } @val external pow: (float, ~exp: float) => float = "Math.pow" @val external random: unit => float = "Math.random" @val external round: float => float = "Math.round" From 8f64689128ea45b06e711f16be7f35a5e6241064 Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Tue, 25 Jul 2023 23:54:10 -0300 Subject: [PATCH 3/4] update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc125acd..87df9792 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Next version +### API changes + +- Do not return `Infinity` or `-Infinity` when passing an empty array to `Math.Int.minMany`, `Math.Int.maxMany`, `Math.minMany` and `Math.maxMany` functions. https://github.com/rescript-association/rescript-core/pull/82 + + ## 0.5.0 ### API changes From 2219ebadb0a9ddba6e57f7065b9cab2622cefc55 Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Thu, 27 Jul 2023 18:32:58 -0300 Subject: [PATCH 4/4] remove underscore prefix --- src/Core__Math.res | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Core__Math.res b/src/Core__Math.res index 8fb9a726..e2b420dc 100644 --- a/src/Core__Math.res +++ b/src/Core__Math.res @@ -14,18 +14,18 @@ module Int = { @val external clz32: int => int = "Math.clz32" @val external imul: (int, int) => int = "Math.imul" @val external min: (int, int) => int = "Math.min" - @variadic @val external _minMany: array => int = "Math.min" + @variadic @val external minMany: array => int = "Math.min" let minMany = arr => switch arr { | [] => 0 - | arr => _minMany(arr) + | arr => minMany(arr) } @val external max: (int, int) => int = "Math.max" - @variadic @val external _maxMany: array => int = "Math.max" + @variadic @val external maxMany: array => int = "Math.max" let maxMany = arr => switch arr { | [] => 0 - | arr => _maxMany(arr) + | arr => maxMany(arr) } @val external pow: (int, ~exp: int) => int = "Math.pow" @val external sign: int => int = "Math.sign" @@ -54,18 +54,18 @@ module Int = { @val external log10: float => float = "Math.log10" @val external log2: float => float = "Math.log2" @val external min: (float, float) => float = "Math.min" -@variadic @val external _minMany: array => float = "Math.min" +@variadic @val external minMany: array => float = "Math.min" let minMany = arr => switch arr { | [] => 0.0 - | arr => _minMany(arr) + | arr => minMany(arr) } @val external max: (float, float) => float = "Math.max" -@variadic @val external _maxMany: array => float = "Math.max" +@variadic @val external maxMany: array => float = "Math.max" let maxMany = arr => switch arr { | [] => 0.0 - | arr => _maxMany(arr) + | arr => maxMany(arr) } @val external pow: (float, ~exp: float) => float = "Math.pow" @val external random: unit => float = "Math.random"