Current section
Files
Jump to
Current section
Files
src/tempo@naive_datetime.erl
-module(tempo@naive_datetime).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/2, now_utc/0, to_tuple/1, parse/2, parse_any/1, get_date/1, get_time/1, to_string/1, format/2, drop_time/1, set_offset/2, set_utc/1, to_second_precision/1, from_string/1, literal/1, to_milli_precision/1, to_micro_precision/1, to_nano_precision/1, compare/2, is_earlier/2, is_earlier_or_equal/2, is_equal/2, is_later/2, is_later_or_equal/2, as_period/2, difference_from/2, difference/2, time_left_in_day/1, add/2, subtract/2, now_local/0]).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 43).
-spec new(tempo:date(), tempo:time()) -> tempo:naive_date_time().
new(Date, Time) ->
tempo:naive_datetime(Date, Time).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 100).
-spec now_utc() -> tempo:naive_date_time().
now_utc() ->
Now_monotonic = tempo:now_monounique(),
Now_ts_nano = tempo_ffi:now(),
new(
tempo@date:from_unix_utc(Now_ts_nano div 1000000000),
begin
_pipe = tempo@time:from_unix_nano_utc(Now_ts_nano),
tempo:time_set_mono(_pipe, Now_monotonic)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 180).
-spec to_tuple(tempo:naive_date_time()) -> {{integer(), integer(), integer()},
{integer(), integer(), integer()}}.
to_tuple(Naive_datetime) ->
{{begin
_pipe = Naive_datetime,
_pipe@1 = tempo:naive_datetime_get_date(_pipe),
tempo:date_get_year(_pipe@1)
end,
tempo@month:to_int(
begin
_pipe@2 = Naive_datetime,
_pipe@3 = tempo:naive_datetime_get_date(_pipe@2),
tempo:date_get_month(_pipe@3)
end
),
begin
_pipe@4 = Naive_datetime,
_pipe@5 = tempo:naive_datetime_get_date(_pipe@4),
tempo:date_get_day(_pipe@5)
end},
{begin
_pipe@6 = Naive_datetime,
_pipe@7 = tempo:naive_datetime_get_time(_pipe@6),
tempo:time_get_hour(_pipe@7)
end,
begin
_pipe@8 = Naive_datetime,
_pipe@9 = tempo:naive_datetime_get_time(_pipe@8),
tempo:time_get_minute(_pipe@9)
end,
begin
_pipe@10 = Naive_datetime,
_pipe@11 = tempo:naive_datetime_get_time(_pipe@10),
tempo:time_get_second(_pipe@11)
end}}.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 230).
-spec parse(binary(), binary()) -> {ok, tempo:naive_date_time()} |
{error, tempo:error()}.
parse(Str, Fmt) ->
gleam@result:'try'(
tempo:consume_format(Str, Fmt),
fun(_use0) ->
{Parts, _} = _use0,
gleam@result:'try'(
tempo:find_date(Parts),
fun(Date) ->
gleam@result:'try'(
tempo:find_time(Parts),
fun(Time) -> {ok, new(Date, Time)} end
)
end
)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 258).
-spec parse_any(binary()) -> {ok, tempo:naive_date_time()} |
{error, tempo:error()}.
parse_any(Str) ->
case tempo:parse_any(Str) of
{ok, {{some, Date}, {some, Time}, _}} ->
{ok, new(Date, Time)};
{ok, {_, none, _}} ->
{error, parse_missing_time};
{ok, {none, _, _}} ->
{error, parse_missing_date};
{error, Err} ->
{error, Err}
end.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 357).
-spec get_date(tempo:naive_date_time()) -> tempo:date().
get_date(Datetime) ->
tempo:naive_datetime_get_date(Datetime).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 370).
-spec get_time(tempo:naive_date_time()) -> tempo:time().
get_time(Datetime) ->
tempo:naive_datetime_get_time(Datetime).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 161).
-spec to_string(tempo:naive_date_time()) -> binary().
to_string(Datetime) ->
<<<<(begin
_pipe = Datetime,
_pipe@1 = get_date(_pipe),
tempo@date:to_string(_pipe@1)
end)/binary,
"T"/utf8>>/binary,
(begin
_pipe@2 = Datetime,
_pipe@3 = get_time(_pipe@2),
tempo@time:to_string(_pipe@3)
end)/binary>>.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 307).
-spec format(tempo:naive_date_time(), binary()) -> binary().
format(Naive_datetime, Fmt) ->
_assert_subject = gleam@regex:from_string(
<<"\\[([^\\]]+)\\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|z|SSSSS|SSSS|SSS|."/utf8>>
),
{ok, Re} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"tempo/naive_datetime"/utf8>>,
function => <<"format"/utf8>>,
line => 308})
end,
_pipe = gleam@regex:scan(Re, Fmt),
_pipe@1 = lists:reverse(_pipe),
_pipe@6 = gleam@list:fold(_pipe@1, [], fun(Acc, Match) -> case Match of
{match, Content, []} ->
[begin
_pipe@2 = Content,
_pipe@4 = tempo@date:replace_format(
_pipe@2,
begin
_pipe@3 = Naive_datetime,
get_date(_pipe@3)
end
),
tempo@time:replace_format(
_pipe@4,
begin
_pipe@5 = Naive_datetime,
get_time(_pipe@5)
end
)
end |
Acc];
{match, _, [{some, Sub}]} ->
[Sub | Acc];
{match, Content@1, _} ->
[Content@1 | Acc]
end end),
gleam@string:join(_pipe@6, <<""/utf8>>).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 383).
-spec drop_time(tempo:naive_date_time()) -> tempo:naive_date_time().
drop_time(Datetime) ->
_pipe = tempo:naive_datetime_get_date(Datetime),
tempo:naive_datetime(_pipe, tempo:time(0, 0, 0, 0, sec, none)).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 398).
-spec set_offset(tempo:naive_date_time(), tempo:offset()) -> tempo:date_time().
set_offset(Datetime, Offset) ->
tempo:datetime(Datetime, Offset).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 344).
-spec set_utc(tempo:naive_date_time()) -> tempo:date_time().
set_utc(Datetime) ->
set_offset(Datetime, {offset, 0}).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 416).
-spec to_second_precision(tempo:naive_date_time()) -> tempo:naive_date_time().
to_second_precision(Naive_datetime) ->
new(
begin
_pipe = Naive_datetime,
tempo:naive_datetime_get_date(_pipe)
end,
begin
_pipe@1 = Naive_datetime,
_pipe@2 = tempo:naive_datetime_get_time(_pipe@1),
tempo@time:to_second_precision(_pipe@2)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 130).
-spec from_string(binary()) -> {ok, tempo:naive_date_time()} |
{error, tempo:error()}.
from_string(Datetime) ->
Split_dt = case gleam_stdlib:contains_string(Datetime, <<"T"/utf8>>) of
true ->
gleam@string:split(Datetime, <<"T"/utf8>>);
false ->
gleam@string:split(Datetime, <<" "/utf8>>)
end,
case Split_dt of
[Date, Time] ->
gleam@result:'try'(
tempo@date:from_string(Date),
fun(Date@1) ->
gleam@result:map(
tempo@time:from_string(Time),
fun(Time@1) -> tempo:naive_datetime(Date@1, Time@1) end
)
end
);
[Date@2] ->
gleam@result:map(
tempo@date:from_string(Date@2),
fun(Date@3) ->
_pipe = tempo:naive_datetime(
Date@3,
tempo:time(0, 0, 0, 0, sec, none)
),
to_second_precision(_pipe)
end
);
_ ->
{error, naive_date_time_invalid_format}
end.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 65).
-spec literal(binary()) -> tempo:naive_date_time().
literal(Naive_datetime) ->
case from_string(Naive_datetime) of
{ok, Naive_datetime@1} ->
Naive_datetime@1;
{error, naive_date_time_invalid_format} ->
erlang:error(#{gleam_error => panic,
message => <<"Invalid naive datetime literal format"/utf8>>,
module => <<"tempo/naive_datetime"/utf8>>,
function => <<"literal"/utf8>>,
line => 69});
{error, date_out_of_bounds} ->
erlang:error(#{gleam_error => panic,
message => <<"Invalid date in naive datetime literal"/utf8>>,
module => <<"tempo/naive_datetime"/utf8>>,
function => <<"literal"/utf8>>,
line => 71});
{error, time_out_of_bounds} ->
erlang:error(#{gleam_error => panic,
message => <<"Invalid time in naive datetime literal"/utf8>>,
module => <<"tempo/naive_datetime"/utf8>>,
function => <<"literal"/utf8>>,
line => 73});
{error, _} ->
erlang:error(#{gleam_error => panic,
message => <<"Invalid naive datetime literal"/utf8>>,
module => <<"tempo/naive_datetime"/utf8>>,
function => <<"literal"/utf8>>,
line => 74})
end.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 436).
-spec to_milli_precision(tempo:naive_date_time()) -> tempo:naive_date_time().
to_milli_precision(Naive_datetime) ->
new(
begin
_pipe = Naive_datetime,
tempo:naive_datetime_get_date(_pipe)
end,
begin
_pipe@1 = Naive_datetime,
_pipe@2 = tempo:naive_datetime_get_time(_pipe@1),
tempo@time:to_milli_precision(_pipe@2)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 456).
-spec to_micro_precision(tempo:naive_date_time()) -> tempo:naive_date_time().
to_micro_precision(Naive_datetime) ->
new(
begin
_pipe = Naive_datetime,
tempo:naive_datetime_get_date(_pipe)
end,
begin
_pipe@1 = Naive_datetime,
_pipe@2 = tempo:naive_datetime_get_time(_pipe@1),
tempo@time:to_micro_precision(_pipe@2)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 476).
-spec to_nano_precision(tempo:naive_date_time()) -> tempo:naive_date_time().
to_nano_precision(Naive_datetime) ->
new(
begin
_pipe = Naive_datetime,
tempo:naive_datetime_get_date(_pipe)
end,
begin
_pipe@1 = Naive_datetime,
_pipe@2 = tempo:naive_datetime_get_time(_pipe@1),
tempo@time:to_nano_precision(_pipe@2)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 500).
-spec compare(tempo:naive_date_time(), tempo:naive_date_time()) -> gleam@order:order().
compare(A, B) ->
A_date = begin
_pipe = A,
tempo:naive_datetime_get_date(_pipe)
end,
B_date = begin
_pipe@1 = B,
tempo:naive_datetime_get_date(_pipe@1)
end,
A_time = begin
_pipe@2 = A,
tempo:naive_datetime_get_time(_pipe@2)
end,
B_time = begin
_pipe@3 = B,
tempo:naive_datetime_get_time(_pipe@3)
end,
case tempo@date:compare(A_date, B_date) of
eq ->
tempo@time:compare(A_time, B_time);
Od ->
Od
end.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 533).
-spec is_earlier(tempo:naive_date_time(), tempo:naive_date_time()) -> boolean().
is_earlier(A, B) ->
compare(A, B) =:= lt.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 557).
-spec is_earlier_or_equal(tempo:naive_date_time(), tempo:naive_date_time()) -> boolean().
is_earlier_or_equal(A, B) ->
(compare(A, B) =:= lt) orelse (compare(A, B) =:= eq).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 583).
-spec is_equal(tempo:naive_date_time(), tempo:naive_date_time()) -> boolean().
is_equal(A, B) ->
compare(A, B) =:= eq.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 606).
-spec is_later(tempo:naive_date_time(), tempo:naive_date_time()) -> boolean().
is_later(A, B) ->
compare(A, B) =:= gt.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 630).
-spec is_later_or_equal(tempo:naive_date_time(), tempo:naive_date_time()) -> boolean().
is_later_or_equal(A, B) ->
(compare(A, B) =:= gt) orelse (compare(A, B) =:= eq).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 697).
-spec as_period(tempo:naive_date_time(), tempo:naive_date_time()) -> tempo:period().
as_period(Start, End) ->
{Start@1, End@1} = case begin
_pipe = Start,
is_earlier_or_equal(_pipe, End)
end of
true ->
{Start, End};
false ->
{End, Start}
end,
{naive_period, Start@1, End@1}.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 638).
-spec difference_from(tempo:naive_date_time(), tempo:naive_date_time()) -> tempo:period().
difference_from(A, B) ->
as_period(B, A).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 667).
-spec difference(tempo:naive_date_time(), tempo:naive_date_time()) -> tempo:period().
difference(A, B) ->
as_period(A, B).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 841).
-spec time_left_in_day(tempo:naive_date_time()) -> tempo:time().
time_left_in_day(Naive_datetime) ->
_pipe = Naive_datetime,
_pipe@1 = tempo:naive_datetime_get_time(_pipe),
tempo@time:left_in_day(_pipe@1).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 718).
-spec add(tempo:naive_date_time(), tempo:duration()) -> tempo:naive_date_time().
add(Datetime, Duration_to_add) ->
gleam@bool:lazy_guard(
tempo:duration_get_ns(Duration_to_add) < 0,
fun() -> _pipe = Datetime,
subtract(_pipe, tempo@duration:absolute(Duration_to_add)) end,
fun() ->
Days_to_add = tempo@duration:as_days(Duration_to_add),
Time_to_add = tempo@duration:decrease(
Duration_to_add,
tempo@duration:days(Days_to_add)
),
New_time_as_ns = begin
_pipe@1 = Datetime,
_pipe@2 = tempo:naive_datetime_get_time(_pipe@1),
_pipe@3 = tempo@time:to_duration(_pipe@2),
_pipe@4 = tempo@duration:increase(_pipe@3, Time_to_add),
tempo@duration:as_nanoseconds(_pipe@4)
end,
{New_time_as_ns@1, Days_to_add@1} = case New_time_as_ns >= 86400000000000 of
true ->
{New_time_as_ns - 86400000000000, Days_to_add + 1};
false ->
{New_time_as_ns, Days_to_add}
end,
Time_to_add@1 = tempo@duration:nanoseconds(
New_time_as_ns@1 - tempo@time:to_nanoseconds(
begin
_pipe@5 = Datetime,
tempo:naive_datetime_get_time(_pipe@5)
end
)
),
New_date = begin
_pipe@6 = Datetime,
_pipe@7 = tempo:naive_datetime_get_date(_pipe@6),
tempo@date:add(_pipe@7, Days_to_add@1)
end,
New_time = begin
_pipe@8 = Datetime,
_pipe@9 = tempo:naive_datetime_get_time(_pipe@8),
tempo@time:add(_pipe@9, Time_to_add@1)
end,
tempo:naive_datetime(New_date, New_time)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 773).
-spec subtract(tempo:naive_date_time(), tempo:duration()) -> tempo:naive_date_time().
subtract(Datetime, Duration_to_subtract) ->
gleam@bool:lazy_guard(
tempo:duration_get_ns(Duration_to_subtract) < 0,
fun() -> _pipe = Datetime,
add(_pipe, tempo@duration:absolute(Duration_to_subtract)) end,
fun() ->
Days_to_sub = tempo@duration:as_days(Duration_to_subtract),
Time_to_sub = tempo@duration:decrease(
Duration_to_subtract,
tempo@duration:days(Days_to_sub)
),
New_time_as_ns = begin
_pipe@1 = Datetime,
_pipe@2 = tempo:naive_datetime_get_time(_pipe@1),
_pipe@3 = tempo@time:to_duration(_pipe@2),
_pipe@4 = tempo@duration:decrease(_pipe@3, Time_to_sub),
tempo@duration:as_nanoseconds(_pipe@4)
end,
{New_time_as_ns@1, Days_to_sub@1} = case New_time_as_ns < 0 of
true ->
{New_time_as_ns + 86400000000000, Days_to_sub + 1};
false ->
{New_time_as_ns, Days_to_sub}
end,
Time_to_sub@1 = tempo@duration:nanoseconds(
tempo@time:to_nanoseconds(
begin
_pipe@5 = Datetime,
tempo:naive_datetime_get_time(_pipe@5)
end
)
- New_time_as_ns@1
),
New_date = begin
_pipe@6 = Datetime,
_pipe@7 = tempo:naive_datetime_get_date(_pipe@6),
tempo@date:subtract(_pipe@7, Days_to_sub@1)
end,
New_time = begin
_pipe@8 = Datetime,
_pipe@9 = tempo:naive_datetime_get_time(_pipe@8),
tempo@time:subtract(_pipe@9, Time_to_sub@1)
end,
tempo:naive_datetime(New_date, New_time)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 87).
-spec now_local() -> tempo:naive_date_time().
now_local() ->
_pipe = now_utc(),
subtract(_pipe, tempo@offset:to_duration(tempo@offset:local())).