aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Gadsden <dirk@esherido.com>2019-08-15 11:53:05 -0700
committerLouis Pilfold <louis@lpil.uk>2019-08-16 17:11:11 +0100
commit3798acbcdef9cb2312ba21666858a1f1776198d6 (patch)
treeb39635d756ff3d8113e0b0b7e0b2458d1b832a81
parent261889c5b56b6610c370e2bd6ae78c0f81e22688 (diff)
downloadgleam_stdlib-3798acbcdef9cb2312ba21666858a1f1776198d6.tar.gz
gleam_stdlib-3798acbcdef9cb2312ba21666858a1f1776198d6.zip
Add `float:compare` function to stdlib
Fixes #209
-rw-r--r--gen/src/gleam@float.erl17
-rw-r--r--gen/test/gleam@float_test.erl10
-rw-r--r--src/gleam/float.gleam12
-rw-r--r--test/gleam/float_test.gleam21
4 files changed, 58 insertions, 2 deletions
diff --git a/gen/src/gleam@float.erl b/gen/src/gleam@float.erl
index 0d8ec08..1d19fc7 100644
--- a/gen/src/gleam@float.erl
+++ b/gen/src/gleam@float.erl
@@ -1,7 +1,7 @@
-module(gleam@float).
-compile(no_auto_import).
--export([parse/1, to_string/1, ceiling/1, floor/1, round/1, truncate/1]).
+-export([parse/1, to_string/1, compare/2, ceiling/1, floor/1, round/1, truncate/1]).
parse(A) ->
gleam__stdlib:parse_float(A).
@@ -9,6 +9,21 @@ parse(A) ->
to_string(F) ->
gleam@iodata:to_string(gleam@iodata:from_float(F)).
+compare(A, B) ->
+ case A =:= B of
+ true ->
+ eq;
+
+ false ->
+ case A < B of
+ true ->
+ lt;
+
+ false ->
+ gt
+ end
+ end.
+
ceiling(A) ->
math:ceil(A).
diff --git a/gen/test/gleam@float_test.erl b/gen/test/gleam@float_test.erl
index ea19c5e..403be9d 100644
--- a/gen/test/gleam@float_test.erl
+++ b/gen/test/gleam@float_test.erl
@@ -1,7 +1,7 @@
-module(gleam@float_test).
-compile(no_auto_import).
--export([parse_test/0, to_string_test/0, ceiling_test/0, floor_test/0, round_test/0, truncate_test/0]).
+-export([parse_test/0, to_string_test/0, compare_test/0, ceiling_test/0, floor_test/0, round_test/0, truncate_test/0]).
parse_test() ->
gleam@expect:equal(gleam@float:parse(<<"1.23">>), {ok, 1.23}),
@@ -15,6 +15,14 @@ to_string_test() ->
gleam@expect:equal(gleam@float:to_string(123.0), <<"123.0">>),
gleam@expect:equal(gleam@float:to_string(-8.1), <<"-8.1">>).
+compare_test() ->
+ gleam@expect:equal(gleam@float:compare(0.0, 0.0), eq),
+ gleam@expect:equal(gleam@float:compare(0.1, 0.1), eq),
+ gleam@expect:equal(gleam@float:compare(0.0, 0.1), lt),
+ gleam@expect:equal(gleam@float:compare(-2.0, -1.9), lt),
+ gleam@expect:equal(gleam@float:compare(2.0, 1.9), gt),
+ gleam@expect:equal(gleam@float:compare(-1.9, -2.0), gt).
+
ceiling_test() ->
gleam@expect:equal(gleam@float:ceiling(8.1), 9.0),
gleam@expect:equal(gleam@float:ceiling(-8.1), -8.0),
diff --git a/src/gleam/float.gleam b/src/gleam/float.gleam
index b1ae86e..65be088 100644
--- a/src/gleam/float.gleam
+++ b/src/gleam/float.gleam
@@ -1,4 +1,5 @@
import gleam/iodata
+import gleam/order
pub enum NotAFloat =
| NotAFloat
@@ -12,6 +13,17 @@ pub fn to_string(f) {
|> iodata:to_string
}
+pub fn compare(a, b) {
+ case a == b {
+ | True -> order:Eq
+ | False ->
+ case a <. b {
+ | True -> order:Lt
+ | False -> order:Gt
+ }
+ }
+}
+
pub external fn ceiling(Float) -> Float = "math" "ceil";
pub external fn floor(Float) -> Float = "math" "floor";
diff --git a/test/gleam/float_test.gleam b/test/gleam/float_test.gleam
index 41b5ed1..ef063a5 100644
--- a/test/gleam/float_test.gleam
+++ b/test/gleam/float_test.gleam
@@ -1,5 +1,6 @@
import gleam/expect
import gleam/float
+import gleam/order
pub fn parse_test() {
"1.23"
@@ -37,6 +38,26 @@ pub fn to_string_test() {
|> expect:equal(_, "-8.1")
}
+pub fn compare_test() {
+ float:compare(0., 0.)
+ |> expect:equal(_, order:Eq)
+
+ float:compare(0.1, 0.1)
+ |> expect:equal(_, order:Eq)
+
+ float:compare(0., 0.1)
+ |> expect:equal(_, order:Lt)
+
+ float:compare(-2., -1.9)
+ |> expect:equal(_, order:Lt)
+
+ float:compare(2., 1.9)
+ |> expect:equal(_, order:Gt)
+
+ float:compare(-1.9, -2.)
+ |> expect:equal(_, order:Gt)
+}
+
pub fn ceiling_test() {
8.1
|> float:ceiling