Current section

Files

Jump to
gleam_stdlib src gleam iodata.gleam
Raw

src/gleam/iodata.gleam

/// Iodata is a type used for efficiently building strings.
///
/// When we append one string to another the strings must be copied to a
/// new location in memory so that they can sit together. This behaviour
/// enables efficient reading of the string but copying can be expensive,
/// especially if we want to join many strings together.
///
/// Iodata is different in that it can be joined together in constant time
/// using minimal memory, and then can be efficiently converted to a string
/// using the `to_string` function.
///
pub external type Iodata
/// Prepend a String onto the start of some Iodata.
///
/// Runs in constant time.
///
pub external fn prepend(to: Iodata, prefix: String) -> Iodata =
"gleam_stdlib" "iodata_prepend"
/// Append a String onto the end of some Iodata.
///
/// Runs in constant time.
///
pub external fn append(to: Iodata, suffix: String) -> Iodata =
"gleam_stdlib" "iodata_append"
/// Prepend some Iodata onto the start of another.
///
/// Runs in constant time.
///
pub external fn prepend_iodata(to: Iodata, prefix: Iodata) -> Iodata =
"gleam_stdlib" "iodata_prepend"
/// Append some Iodata onto the end of another.
///
/// Runs in constant time.
///
pub external fn append_iodata(to: Iodata, suffix: Iodata) -> Iodata =
"gleam_stdlib" "iodata_append"
/// Convert a list of strings into iodata.
///
/// Runs in constant time.
///
pub external fn from_strings(List(String)) -> Iodata =
"gleam_stdlib" "identity"
/// Joins a list of iodata into a single iodata.
///
/// Runs in constant time.
///
pub external fn concat(List(Iodata)) -> Iodata =
"gleam_stdlib" "identity"
/// Convert a string into iodata.
///
/// Runs in constant time.
///
pub external fn new(String) -> Iodata =
"gleam_stdlib" "identity"
/// Turns an `Iodata` into a `String`
///
/// This function is implemented natively by the virtual machine and is highly
/// optimised.
///
pub external fn to_string(Iodata) -> String =
"erlang" "iolist_to_binary"
/// Returns the size of the Iodata in bytes.
///
pub external fn byte_size(Iodata) -> Int =
"erlang" "iolist_size"
/// Creates textual representation of the given float as iodata.
///
pub external fn from_float(Float) -> Iodata =
"io_lib_format" "fwrite_g"
/// Converts Iodata to a new Iodata where valid UTF-8 string data is
/// lowercased.
///
pub external fn lowercase(Iodata) -> Iodata =
"string" "lowercase"
/// Converts Iodata to a new Iodata where valid UTF-8 string data is
/// uppercased.
///
pub external fn uppercase(Iodata) -> Iodata =
"string" "uppercase"
/// Converts Iodata to a new Iodata where valid UTF-8 string data is
/// reversed.
///
pub external fn reverse(Iodata) -> Iodata =
"string" "reverse"
type Direction {
All
}
external fn erl_split(Iodata, String, Direction) -> List(Iodata) =
"string" "split"
/// Splits iodata on a given pattern into a list of iodata.
///
pub fn split(iodata: Iodata, on pattern: String) -> List(Iodata) {
erl_split(iodata, pattern, All)
}
external fn erl_replace(Iodata, String, String, Direction) -> Iodata =
"string" "replace"
/// Replaces all instances of a pattern with a given string substitute.
///
pub fn replace(
in iodata: Iodata,
each pattern: String,
with substitute: String,
) -> Iodata {
erl_replace(iodata, pattern, substitute, All)
}
/// Compare two pieces of iodata to determine if they have the same textual
/// content.
///
/// Comparing two iodata using the `==` operator may return False even if they
/// have the same content as they may have been build in different ways, so
/// using this function is often preferred.
///
/// ## Examples
///
/// > from_strings(["a", "b"]) == new("ab")
/// False
///
/// > is_equal(from_strings(["a", "b"]), new("ab"))
/// True
///
///
pub external fn is_equal(Iodata, Iodata) -> Bool =
"string" "equal"
/// Inspect some iodata to determine if it is equivalent to an empty string.
///
/// ## Examples
///
/// > new("ok") |> is_empty
/// False
///
/// > new("") |> is_empty
/// True
///
/// > from_strings([]) |> is_empty
/// True
///
///
pub external fn is_empty(Iodata) -> Bool =
"string" "is_empty"