Packages
gleam_stdlib
0.30.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/bool.gleam
//// A type with two possible values, `True` and `False`. Used to indicate whether
//// things are... true or false!
////
//// Often is it clearer and offers more type safety to define a custom type
//// than to use `Bool`. For example, rather than having a `is_teacher: Bool`
//// field consider having a `role: SchoolRole` field where `SchoolRole` is a custom
//// type that can be either `Student` or `Teacher`.
import gleam/order.{Order}
/// Returns the and of two bools, but it evaluates both arguments.
///
/// It's the function equivalent of the `&&` operator.
/// This function is useful in higher order functions or pipes.
///
/// ## Examples
///
/// ```gleam
/// > and(True, True)
/// True
/// ```
///
/// ```gleam
/// > and(False, True)
/// False
/// ```
///
/// ```gleam
/// > False |> and(True)
/// False
/// ```
///
pub fn and(a: Bool, b: Bool) -> Bool {
a && b
}
/// Returns the or of two bools, but it evaluates both arguments.
///
/// It's the function equivalent of the `||` operator.
/// This function is useful in higher order functions or pipes.
///
/// ## Examples
///
/// ```gleam
/// > or(True, True)
/// True
/// ```
///
/// ```gleam
/// > or(False, True)
/// True
/// ```
///
/// ```gleam
/// > False |> or(True)
/// True
/// ```
///
pub fn or(a: Bool, b: Bool) -> Bool {
a || b
}
/// Returns the opposite bool value.
///
/// This is the same as the `!` or `not` operators in some other languages.
///
/// ## Examples
///
/// ```gleam
/// > negate(True)
/// False
/// ```
///
/// ```gleam
/// > negate(False)
/// True
/// ```
///
pub fn negate(bool: Bool) -> Bool {
case bool {
True -> False
False -> True
}
}
/// Returns the nor of two bools.
///
/// ## Examples
///
/// ```gleam
/// > nor(False, False)
/// True
/// ```
///
/// ```gleam
/// > nor(False, True)
/// False
/// ```
///
/// ```gleam
/// > nor(True, False)
/// False
/// ```
///
/// ```gleam
/// > nor(True, True)
/// False
/// ```
///
pub fn nor(a: Bool, b: Bool) -> Bool {
case a, b {
False, False -> True
False, True -> False
True, False -> False
True, True -> False
}
}
/// Returns the nand of two bools.
///
/// ## Examples
///
/// ```gleam
/// > nand(False, False)
/// True
/// ```
///
/// ```gleam
/// > nand(False, True)
/// True
/// ```
///
/// ```gleam
/// > nand(True, False)
/// True
/// ```
///
/// ```gleam
/// > nand(True, True)
/// False
/// ```
///
pub fn nand(a: Bool, b: Bool) -> Bool {
case a, b {
False, False -> True
False, True -> True
True, False -> True
True, True -> False
}
}
/// Returns the exclusive or of two bools.
///
/// ## Examples
///
/// ```gleam
/// > exclusive_or(False, False)
/// False
/// ```
///
/// ```gleam
/// > exclusive_or(False, True)
/// True
/// ```
///
/// ```gleam
/// > exclusive_or(True, False)
/// True
/// ```
///
/// ```gleam
/// > exclusive_or(True, True)
/// False
/// ```
///
pub fn exclusive_or(a: Bool, b: Bool) -> Bool {
case a, b {
False, False -> False
False, True -> True
True, False -> True
True, True -> False
}
}
/// Returns the exclusive nor of two bools.
///
/// ## Examples
///
/// ```gleam
/// > exclusive_nor(False, False)
/// True
/// ```
///
/// ```gleam
/// > exclusive_nor(False, True)
/// False
/// ```
///
/// ```gleam
/// > exclusive_nor(True, False)
/// False
/// ```
///
/// ```gleam
/// > exclusive_nor(True, True)
/// True
/// ```
///
pub fn exclusive_nor(a: Bool, b: Bool) -> Bool {
case a, b {
False, False -> True
False, True -> False
True, False -> False
True, True -> True
}
}
/// Compares two bools and returns the first value's `Order` to the second.
///
/// ## Examples
///
/// ```gleam
/// > import gleam/order
/// > compare(True, False)
/// order.Gt
/// ```
///
pub fn compare(a: Bool, with b: Bool) -> Order {
case a, b {
True, True -> order.Eq
True, False -> order.Gt
False, False -> order.Eq
False, True -> order.Lt
}
}
/// Returns `True` if either argument's value is `True`.
///
/// ## Examples
///
/// ```gleam
/// > max(True, False)
/// True
/// ```
///
/// ```gleam
/// > max(False, True)
/// True
/// ```
///
/// ```gleam
/// > max(False, False)
/// False
/// ```
///
pub fn max(a: Bool, b: Bool) -> Bool {
case a {
True -> True
False -> b
}
}
/// Returns `False` if either bool value is `False`.
///
/// ## Examples
///
/// ```gleam
/// > min(True, False)
/// False
/// ```
///
/// ```gleam
/// > min(False, True)
/// False
///
/// > min(False, False)
/// False
/// ```
///
pub fn min(a: Bool, b: Bool) -> Bool {
case a {
False -> False
True -> b
}
}
/// Returns a numeric representation of the given bool.
///
/// ## Examples
///
/// ```gleam
/// > to_int(True)
/// 1
///
/// > to_int(False)
/// 0
/// ```
///
pub fn to_int(bool: Bool) -> Int {
case bool {
False -> 0
True -> 1
}
}
/// Returns a string representation of the given bool.
///
/// ## Examples
///
/// ```gleam
/// > to_string(True)
/// "True"
/// ```
///
/// ```gleam
/// > to_string(False)
/// "False"
/// ```
///
pub fn to_string(bool: Bool) -> String {
case bool {
False -> "False"
True -> "True"
}
}
/// Run a callback function if the given bool is `False`, otherwise return a
/// default value.
///
/// With a `use` expression this function can simulate the early-return pattern
/// found in some other programming languages.
///
/// In a procedural language:
///
/// ```js
/// if (predicate) return value;
/// // ...
/// ```
///
/// In Gleam with a `use` expression:
///
/// ```gleam
/// use <- guard(when: predicate, return: value)
/// // ...
/// ```
///
/// Like everything in Gleam `use` is an expression, so it short circuits the
/// current block, not the entire function. As a result you can assign the value
/// to a variable:
///
/// ```gleam
/// let x = {
/// use <- guard(when: predicate, return: value)
/// // ...
/// }
/// ```
///
/// Note that unlike in procedural languages the `return` value is evaluated
/// even when the predicate is `False`, so it is advisable not to perform
/// expensive computation there.
///
///
/// ## Examples
///
/// ```gleam
/// > let name = ""
/// > use <- guard(when: name == "", return: "Welcome!")
/// > "Hello, " <> name
/// "Welcome!"
/// ```
///
/// ```gleam
/// > let name = "Kamaka"
/// > use <- guard(when: name == "", return: "Welcome!")
/// > "Hello, " <> name
/// "Hello, Kamaka"
/// ```
///
pub fn guard(
when requirement: Bool,
return consequence: t,
otherwise alternative: fn() -> t,
) -> t {
case requirement {
True -> consequence
False -> alternative()
}
}