Current section
Files
Jump to
Current section
Files
src/timeago.gleam
import gleam/int
import gleam/option.{type Option}
import gleam/time/duration
import gleam/time/timestamp.{type Timestamp}
pub fn time_ago(
timestamp: Timestamp,
maybe_now: Option(Timestamp),
_maybe_locale: Option(String),
) -> String {
let now = option.unwrap(maybe_now, timestamp.system_time())
let #(amount, unit) =
duration.approximate(timestamp.difference(timestamp, now))
case unit {
duration.Nanosecond | duration.Microsecond | duration.Millisecond ->
"just now"
_ -> {
let unit_string = unit_to_string(unit)
let magnitude = int.absolute_value(amount)
let unit_string_suffix = case magnitude {
1 -> ""
_ -> "s"
}
case amount < 0 {
True ->
"in "
<> int.to_string(magnitude)
<> " "
<> unit_string
<> unit_string_suffix
False ->
int.to_string(magnitude)
<> " "
<> unit_string
<> unit_string_suffix
<> " ago"
}
}
}
}
fn unit_to_string(unit: duration.Unit) -> String {
case unit {
duration.Nanosecond -> "nanosecond"
duration.Microsecond -> "microsecond"
duration.Millisecond -> "millisecond"
duration.Second -> "second"
duration.Minute -> "minute"
duration.Hour -> "hour"
duration.Day -> "day"
duration.Week -> "week"
duration.Month -> "month"
duration.Year -> "year"
}
}