Packages
gleam_stdlib
0.17.0
1.0.3
1.0.2
1.0.1
1.0.0
0.71.0
0.70.0
0.69.0
0.68.1
0.68.0
0.67.1
0.67.0
0.65.0
0.64.0
0.63.2
0.63.1
0.63.0
0.62.1
0.62.0
0.61.0
0.60.0
0.59.0
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.1
0.35.0
0.34.0
0.33.1
0.33.0
0.32.1
0.32.0
0.31.0
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.1
0.26.0
0.25.0
0.24.0
0.23.0
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.18.0-rc1
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.4.0-rc1
0.3.1
0.3.0
0.2.0
retired
A standard library for the Gleam programming language
Current section
Files
Jump to
Current section
Files
src/gleam/float.gleam
import gleam/order.{Order}
import gleam/string_builder
/// Attempts to parse a string as a float, returning `Error(Nil)` if it was not
/// possible.
///
/// ## Examples
/// > parse("2.3")
/// Ok(2.3)
///
/// > parse("ABC")
/// Error(Nil)
///
pub fn parse(string: String) -> Result(Float, Nil) {
do_parse(string)
}
if erlang {
external fn do_parse(String) -> Result(Float, Nil) =
"gleam_stdlib" "parse_float"
}
if javascript {
external fn do_parse(String) -> Result(Float, Nil) =
"../gleam_stdlib.js" "parse_float"
}
/// Returns the string representation of the provided float.
///
/// ## Examples
/// > to_string(2.3)
/// "2.3"
///
pub fn to_string(f: Float) -> String {
f
|> string_builder.from_float
|> string_builder.to_string
}
/// Restricts a Float between a lower and upper bound
///
/// ## Examples
///
/// ```
/// > clamp(1.2, min: 1.4, max: 1.6)
/// 1.4
/// ```
///
pub fn clamp(n: Float, min min_bound: Float, max max_bound: Float) -> Float {
n
|> min(max_bound)
|> max(min_bound)
}
/// Compares two floats, returning an order.
///
/// ## Examples
/// > compare(2.0, 2.3)
/// Lt
///
pub fn compare(a: Float, with b: Float) -> Order {
case a == b {
True -> order.Eq
False ->
case a <. b {
True -> order.Lt
False -> order.Gt
}
}
}
/// Compares two floats, returning the smaller of the two.
///
/// ## Examples
///
/// > min(2.0, 2.3)
/// 2.0
///
pub fn min(a: Float, b: Float) -> Float {
case a <. b {
True -> a
False -> b
}
}
/// Compares two floats, returning the larger of the two.
///
/// ## Examples
///
/// > max(2.0, 2.3)
/// 2.3
///
pub fn max(a: Float, b: Float) -> Float {
case a >. b {
True -> a
False -> b
}
}
/// Rounds the value to the next highest whole number as a float.
///
/// ## Examples
///
/// > ceiling(2.3)
/// 3.0
///
pub fn ceiling(float: Float) -> Float {
do_ceiling(float)
}
if erlang {
external fn do_ceiling(Float) -> Float =
"math" "ceil"
}
if javascript {
external fn do_ceiling(Float) -> Float =
"../gleam_stdlib.js" "ceiling"
}
/// Rounds the value to the next lowest whole number as a float.
///
/// ## Examples
///
/// > floor(2.3)
/// 2.0
///
pub fn floor(float: Float) -> Float {
do_floor(float)
}
if erlang {
external fn do_floor(Float) -> Float =
"math" "floor"
}
if javascript {
external fn do_floor(Float) -> Float =
"../gleam_stdlib.js" "floor"
}
/// Rounds the value to the nearest whole number as an int.
///
/// ## Examples
///
/// > round(2.3)
/// 2
///
/// > round(2.5)
/// 3
///
pub fn round(float: Float) -> Int {
do_round(float)
}
if erlang {
external fn do_round(Float) -> Int =
"erlang" "round"
}
if javascript {
fn do_round(float: Float) -> Int {
case float >=. 0.0 {
True -> js_round(float)
_ -> 0 - js_round(negate(float))
}
}
external fn js_round(Float) -> Int =
"../gleam_stdlib.js" "round"
}
/// Returns the value as an int, truncating all decimal digits.
///
/// ## Examples
///
/// > truncate(2.4343434847383438)
/// 2
///
pub fn truncate(float: Float) -> Int {
do_truncate(float)
}
if erlang {
external fn do_truncate(Float) -> Int =
"erlang" "trunc"
}
if javascript {
external fn do_truncate(Float) -> Int =
"../gleam_stdlib.js" "truncate"
}
/// Returns the absolute value of the input as a float.
///
/// ## Examples
///
/// > absolute_value(-12.5)
/// 12.5
///
/// > absolute_value(10.2)
/// 10.2
///
pub fn absolute_value(float: Float) -> Float {
case float >=. 0. {
True -> float
_ -> 0. -. float
}
}
/// Returns the results of the base being raised to the power of the
/// exponent, as a float.
///
/// ## Examples
///
/// > power(2.0, 2.0)
/// 4.0
///
/// > power(8.0, 1.5)
/// 22.627416997969522
///
pub fn power(base: Float, exponent: Float) -> Float {
do_power(base, exponent)
}
if erlang {
external fn do_power(Float, Float) -> Float =
"math" "pow"
}
if javascript {
external fn do_power(Float, Float) -> Float =
"../gleam_stdlib.js" "power"
}
/// Returns the square root of the input as a float.
///
/// ## Examples
///
/// > square_root(4.0)
/// Ok(2.0)
///
/// > square_root(-16.0)
/// Error(Nil)
///
pub fn square_root(number: Float) -> Result(Float, Nil) {
case number <. 0.0 {
True -> Error(Nil)
False -> Ok(power(number, 0.5))
}
}
/// Returns the negative of the value provided
///
/// ## Examples
///
/// > negate(1.)
/// -1.
///
pub fn negate(x: Float) -> Float {
-1. *. x
}
/// Sums a list of Floats.
///
/// ## Example
///
/// > sum([1.0, 2.2, 3.3])
/// 6.5
///
pub fn sum(numbers: List(Float)) -> Float {
numbers
|> do_sum(0.0)
}
fn do_sum(numbers: List(Float), initial: Float) -> Float {
case numbers {
[] -> initial
[x, ..rest] -> do_sum(rest, x +. initial)
}
}
/// Multiplies a list of Floats and returns the product.
///
/// ## Example
///
/// > product([2.5, 3.2, 4.2])
/// 33.6
///
pub fn product(numbers: List(Float)) -> Float {
case numbers {
[] -> 0.
_ -> do_product(numbers, 1.)
}
}
fn do_product(numbers: List(Float), initial: Float) -> Float {
case numbers {
[] -> initial
[x, ..rest] -> do_product(rest, x *. initial)
}
}