Packages

Create human-readable, friendly identifiers.

Current section

Files

Jump to
friendly_id src friendly_id.gleam
Raw

src/friendly_id.gleam

import friendly_id/generator
import gleam/int
import gleam/list
import gleam/string
import glearray
/// Generates a friendly ID from a Generator record.
///
/// # Examples
///
/// ## Create a generator with defaults, then generate an ID
///
/// ```gleam
/// let generator = generator.new()
/// echo friendly_id.generate(generator)
/// ```
pub fn generate(generator: generator.Generator) -> String {
[take_random_element(generator.get_objects(generator))]
|> prepend_predicates(
0,
generator.get_predicate_count(generator),
generator.get_predicates(generator),
)
|> list.map(generator.get_transform_fn(generator))
|> string.join(generator.get_separator(generator))
}
fn take_random_element(array: glearray.Array(value)) -> value {
let index =
glearray.length(array)
|> int.random()
let assert Ok(element) = glearray.get(in: array, at: index)
element
}
fn prepend_predicates(
acc: List(String),
count: Int,
max: Int,
predicates: glearray.Array(String),
) -> List(String) {
case count == max {
True -> acc
False -> {
prepend_predicates(
[take_random_element(predicates), ..acc],
count + 1,
max,
predicates,
)
}
}
}