From 1f84deaf6362fc378c2d2ec29bd4bb5520539e27 Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Tue, 23 Nov 2021 23:09:01 +0000 Subject: [PATCH] LibJS: Implement default_temporal_largest_unit() --- .../LibJS/Runtime/Temporal/Duration.cpp | 44 +++++++++++++++++++ .../LibJS/Runtime/Temporal/Duration.h | 1 + 2 files changed, 45 insertions(+) diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp index 625ab3e80f..707a605160 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2021, Linus Groh + * Copyright (c) 2021, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ @@ -163,6 +164,49 @@ bool is_valid_duration(double years, double months, double weeks, double days, d return true; } +// 7.5.5 DefaultTemporalLargestUnit ( years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds ), https://tc39.es/proposal-temporal/#sec-temporal-defaulttemporallargestunit +StringView default_temporal_largest_unit(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds) +{ + // 1. If years is not zero, return "year". + if (years != 0) + return "year"sv; + + // 2. If months is not zero, return "month". + if (months != 0) + return "month"sv; + + // 3. If weeks is not zero, return "week". + if (weeks != 0) + return "week"sv; + + // 4. If days is not zero, return "day". + if (days != 0) + return "day"sv; + + // 5. If hours is not zero, return "hour". + if (hours != 0) + return "hour"sv; + + // 6. If minutes is not zero, return "minute". + if (minutes != 0) + return "minute"sv; + + // 7. If seconds is not zero, return "second". + if (seconds != 0) + return "second"sv; + + // 8. If milliseconds is not zero, return "millisecond". + if (milliseconds != 0) + return "millisecond"sv; + + // 9. If microseconds is not zero, return "microsecond". + if (microseconds != 0) + return "microsecond"sv; + + // 10. Return "nanosecond". + return "nanosecond"sv; +} + // 7.5.6 ToPartialDuration ( temporalDurationLike ), https://tc39.es/proposal-temporal/#sec-temporal-topartialduration ThrowCompletionOr to_partial_duration(GlobalObject& global_object, Value temporal_duration_like) { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h index 0527b2961c..696c5b0b47 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h @@ -146,6 +146,7 @@ ThrowCompletionOr to_temporal_duration(GlobalObject&, Value item); ThrowCompletionOr to_temporal_duration_record(GlobalObject&, Object const& temporal_duration_like); i8 duration_sign(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); bool is_valid_duration(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); +StringView default_temporal_largest_unit(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds); ThrowCompletionOr to_partial_duration(GlobalObject&, Value temporal_duration_like); ThrowCompletionOr create_temporal_duration(GlobalObject&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, FunctionObject const* new_target = nullptr); Duration* create_negated_temporal_duration(GlobalObject& global_object, Duration const& duration);