diff options
-rw-r--r-- | src/gleam/float.gleam | 49 | ||||
-rw-r--r-- | test/gleam/float_test.gleam | 23 |
2 files changed, 72 insertions, 0 deletions
diff --git a/src/gleam/float.gleam b/src/gleam/float.gleam index 701b45e..9a922c1 100644 --- a/src/gleam/float.gleam +++ b/src/gleam/float.gleam @@ -428,6 +428,55 @@ fn do_product(numbers: List(Float), initial: Float) -> Float { @external(javascript, "../gleam_stdlib.mjs", "random_uniform") pub fn random() -> Float +/// Computes the modulo of an float division of inputs as a `Result`. +/// +/// Returns division of the inputs as a `Result`: If the given divisor equals +/// `0`, this function returns an `Error`. +/// +/// ## Examples +/// +/// ```gleam +/// modulo(3.0, 2.0) +/// // -> Ok(1.0) +/// ``` +/// +/// ```gleam +/// modulo(1.0, 0.0) +/// // -> Error(Nil) +/// ``` +/// +/// ```gleam +/// modulo(10.0, -1.0) +/// // -> Ok(0.0) +/// ``` +/// +/// ```gleam +/// modulo(13.0, by: 3.0) +/// // -> Ok(1.0) +/// ``` +/// +/// ```gleam +/// modulo(-13.0, by: 3.0) +/// // -> Ok(2.0) +/// ``` +/// +/// ```gleam +/// modulo(13.0, by: -3.0) +/// // -> Ok(-2.0) +/// ``` +/// +/// ```gleam +/// modulo(-13.0, by: -3.0) +/// // -> Ok(-1.0) +/// ``` +/// +pub fn modulo(dividend: Float, by divisor: Float) -> Result(Float, Nil) { + case divisor { + 0.0 -> Error(Nil) + _ -> Ok(dividend -. floor(dividend /. divisor) *. divisor) + } +} + /// Returns division of the inputs as a `Result`. /// /// ## Examples diff --git a/test/gleam/float_test.gleam b/test/gleam/float_test.gleam index 6731c23..11a8e25 100644 --- a/test/gleam/float_test.gleam +++ b/test/gleam/float_test.gleam @@ -384,6 +384,29 @@ pub fn random_test() { |> should.be_true } +pub fn modulo_test() { + float.modulo(3.0, 2.0) + |> should.equal(Ok(1.0)) + + float.modulo(1.0, 0.0) + |> should.equal(Error(Nil)) + + float.modulo(10.0, -1.0) + |> should.equal(Ok(0.0)) + + float.modulo(13.0, by: 3.0) + |> should.equal(Ok(1.0)) + + float.modulo(-13.0, by: 3.0) + |> should.equal(Ok(2.0)) + + float.modulo(13.0, by: -3.0) + |> should.equal(Ok(-2.0)) + + float.modulo(-13.0, by: -3.0) + |> should.equal(Ok(-1.0)) +} + pub fn divide_test() { float.divide(1.0, 1.0) |> should.equal(Ok(1.0)) |