/* * Copyright 2026 Flix Contributors * * Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE.md file. */pubmod Time.Duration {use Time.TimeUnit////// Represents a duration of time stored as nanoseconds (Int64).///pubenumDuration(Int64) withEq, Order, HashinstanceAdd[Duration] {pubdefadd(x: Duration, y: Duration): Duration =let Duration.Duration(x1) = x;let Duration.Duration(y1) = y; Duration.Duration(x1+y1) }instanceSub[Duration] {pubdefsub(x: Duration, y: Duration): Duration =let Duration.Duration(x1) = x;let Duration.Duration(y1) = y; Duration.Duration(x1-y1) }instanceToString[Duration] {pubdeftoString(d: Duration): String =let Duration.Duration(nanos) = d;if (nanos==0i64)"0ns"elseletabs = Int64.abs(nanos);letsign = if (nanos<0i64) "-"else"";if (abs>=3_600_000_000_000i64)leth = abs/3_600_000_000_000i64;letrem1 = abs- (h*3_600_000_000_000i64);letm = rem1/60_000_000_000i64;letrem2 = rem1- (m*60_000_000_000i64);lets = rem2/1_000_000_000i64;"${sign}${h}h ${m}m ${s}s"elseif (abs>=60_000_000_000i64)letm = abs/60_000_000_000i64;letrem1 = abs- (m*60_000_000_000i64);lets = rem1/1_000_000_000i64;"${sign}${m}m ${s}s"elseif (abs>=1_000_000_000i64)lets = abs/1_000_000_000i64;letrem1 = abs- (s*1_000_000_000i64);letms = rem1/1_000_000i64;"${sign}${s}s ${ms}ms"elseif (abs>=1_000_000i64)letms = abs/1_000_000i64;"${sign}${ms}ms"elseif (abs>=1_000i64)letus = abs/1_000i64;"${sign}${us}us"else"${sign}${abs}ns" }instanceFormattable[Duration] {pubdefformat(d: Duration): RichString = RichString.fromString(ToString.toString(d)) }/// Returns the zero duration.pubdefzero(): Time.Duration = Time.Duration.Duration(0i64)/// Returns a duration of `n` in the given time unit `u`.pubdefof(n: Int32, u: TimeUnit): Time.Duration = matchu {case TimeUnit.Days => days(n),case TimeUnit.Hours => hours(n),case TimeUnit.Microseconds => microseconds(n),case TimeUnit.Milliseconds => milliseconds(n),case TimeUnit.Minutes => minutes(n),case TimeUnit.Nanoseconds => nanoseconds(Int32.toInt64(n)),case TimeUnit.Seconds => seconds(n) }/// Returns a duration of `n` nanoseconds.pubdefnanoseconds(n: Int64): Time.Duration = Time.Duration.Duration(n)/// Returns a duration of `n` microseconds.pubdefmicroseconds(n: Int32): Time.Duration = Time.Duration.Duration(Int32.toInt64(n) *1_000i64)/// Returns a duration of `n` milliseconds.pubdefmilliseconds(n: Int32): Time.Duration = Time.Duration.Duration(Int32.toInt64(n) *1_000_000i64)/// Returns a duration of `n` seconds.pubdefseconds(n: Int32): Time.Duration = Time.Duration.Duration(Int32.toInt64(n) *1_000_000_000i64)/// Returns a duration of `n` minutes.pubdefminutes(n: Int32): Time.Duration = Time.Duration.Duration(Int32.toInt64(n) *60_000_000_000i64)/// Returns a duration of `n` hours.pubdefhours(n: Int32): Time.Duration = Time.Duration.Duration(Int32.toInt64(n) *3_600_000_000_000i64)/// Returns a duration of `n` days.pubdefdays(n: Int32): Time.Duration = Time.Duration.Duration(Int32.toInt64(n) *86_400_000_000_000i64)/// Returns the total number of nanoseconds in `d`.pubdeftoNanos(d: Time.Duration): Int64 =let Time.Duration.Duration(n) = d;n/// Returns the total number of microseconds in `d` (truncated).pubdeftoMicros(d: Time.Duration): Int64 =let Time.Duration.Duration(n) = d;n/1_000i64/// Returns the total number of milliseconds in `d` (truncated).pubdeftoMillis(d: Time.Duration): Int64 =let Time.Duration.Duration(n) = d;n/1_000_000i64/// Returns the total number of seconds in `d` (truncated).pubdeftoSeconds(d: Time.Duration): Int64 =let Time.Duration.Duration(n) = d;n/1_000_000_000i64/// Returns the total number of minutes in `d` (truncated).pubdeftoMinutes(d: Time.Duration): Int64 =let Time.Duration.Duration(n) = d;n/60_000_000_000i64/// Returns the total number of hours in `d` (truncated).pubdeftoHours(d: Time.Duration): Int64 =let Time.Duration.Duration(n) = d;n/3_600_000_000_000i64/// Returns the total number of days in `d` (truncated).pubdeftoDays(d: Time.Duration): Int64 =let Time.Duration.Duration(n) = d;n/86_400_000_000_000i64/// Returns `true` if `d` is zero.pubdefisZero(d: Time.Duration): Bool =let Time.Duration.Duration(n) = d;n==0i64/// Returns `true` if `d` is positive.pubdefisPositive(d: Time.Duration): Bool =let Time.Duration.Duration(n) = d;n>0i64/// Returns `true` if `d` is negative.pubdefisNegative(d: Time.Duration): Bool =let Time.Duration.Duration(n) = d;n<0i64}