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_string/1, parse/2, parse_any/1, get_date/1, get_time/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/2, time_left_in_day/1, add/2, subtract/2, now_local/0]).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 26).
-spec new(tempo:date(), tempo:time()) -> tempo:naive_date_time().
new(Date, Time) ->
{naive_date_time, Date, Time}.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 84).
-spec now_utc() -> tempo:naive_date_time().
now_utc() ->
Now_ts_nano = tempo_ffi:now(),
new(
tempo@date:from_unix_utc(Now_ts_nano div 1000000000),
tempo@time:from_unix_nano_utc(Now_ts_nano)
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 144).
-spec to_string(tempo:naive_date_time()) -> binary().
to_string(Datetime) ->
<<<<(begin
_pipe = erlang:element(2, Datetime),
tempo@date:to_string(_pipe)
end)/binary,
"T"/utf8>>/binary,
(begin
_pipe@1 = erlang:element(3, Datetime),
tempo@time:to_string(_pipe@1)
end)/binary>>.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 183).
-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", 211).
-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", 310).
-spec get_date(tempo:naive_date_time()) -> tempo:date().
get_date(Datetime) ->
erlang:element(2, Datetime).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 323).
-spec get_time(tempo:naive_date_time()) -> tempo:time().
get_time(Datetime) ->
erlang:element(3, Datetime).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 260).
-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 => 261})
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", 336).
-spec drop_time(tempo:naive_date_time()) -> tempo:naive_date_time().
drop_time(Datetime) ->
{naive_date_time, erlang:element(2, Datetime), {time, 0, 0, 0, 0}}.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 350).
-spec set_offset(tempo:naive_date_time(), tempo:offset()) -> tempo:date_time().
set_offset(Datetime, Offset) ->
{date_time, Datetime, Offset}.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 297).
-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", 368).
-spec to_second_precision(tempo:naive_date_time()) -> tempo:naive_date_time().
to_second_precision(Naive_datetime) ->
new(
erlang:element(2, Naive_datetime),
begin
_pipe = erlang:element(3, Naive_datetime),
tempo@time:to_second_precision(_pipe)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 113).
-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) -> {naive_date_time, Date@1, Time@1} end
)
end
);
[Date@2] ->
gleam@result:map(
tempo@date:from_string(Date@2),
fun(Date@3) ->
_pipe = {naive_date_time, Date@3, {time, 0, 0, 0, 0}},
to_second_precision(_pipe)
end
);
_ ->
{error, naive_date_time_invalid_format}
end.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 48).
-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 => 52});
{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 => 54});
{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 => 56});
{error, _} ->
erlang:error(#{gleam_error => panic,
message => <<"Invalid naive datetime literal"/utf8>>,
module => <<"tempo/naive_datetime"/utf8>>,
function => <<"literal"/utf8>>,
line => 57})
end.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 385).
-spec to_milli_precision(tempo:naive_date_time()) -> tempo:naive_date_time().
to_milli_precision(Naive_datetime) ->
new(
erlang:element(2, Naive_datetime),
begin
_pipe = erlang:element(3, Naive_datetime),
tempo@time:to_milli_precision(_pipe)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 402).
-spec to_micro_precision(tempo:naive_date_time()) -> tempo:naive_date_time().
to_micro_precision(Naive_datetime) ->
new(
erlang:element(2, Naive_datetime),
begin
_pipe = erlang:element(3, Naive_datetime),
tempo@time:to_micro_precision(_pipe)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 419).
-spec to_nano_precision(tempo:naive_date_time()) -> tempo:naive_date_time().
to_nano_precision(Naive_datetime) ->
new(
erlang:element(2, Naive_datetime),
begin
_pipe = erlang:element(3, Naive_datetime),
tempo@time:to_nano_precision(_pipe)
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 440).
-spec compare(tempo:naive_date_time(), tempo:naive_date_time()) -> gleam@order:order().
compare(A, B) ->
case tempo@date:compare(erlang:element(2, A), erlang:element(2, B)) of
eq ->
tempo@time:compare(erlang:element(3, A), erlang:element(3, B));
Od ->
Od
end.
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 467).
-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", 491).
-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", 517).
-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", 540).
-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", 564).
-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", 620).
-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", 592).
-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", 747).
-spec time_left_in_day(tempo:naive_date_time()) -> tempo:time().
time_left_in_day(Naive_datetime) ->
_pipe = erlang:element(3, Naive_datetime),
tempo@time:left_in_day(_pipe).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 641).
-spec add(tempo:naive_date_time(), tempo:duration()) -> tempo:naive_date_time().
add(Datetime, Duration_to_add) ->
gleam@bool:lazy_guard(
erlang:element(2, 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 = erlang:element(3, Datetime),
_pipe@2 = tempo@time:to_duration(_pipe@1),
_pipe@3 = tempo@duration:increase(_pipe@2, Time_to_add),
tempo@duration:as_nanoseconds(_pipe@3)
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(
erlang:element(3, Datetime)
)
),
New_date = begin
_pipe@4 = erlang:element(2, Datetime),
tempo@date:add(_pipe@4, Days_to_add@1)
end,
New_time = begin
_pipe@5 = erlang:element(3, Datetime),
tempo@time:add(_pipe@5, Time_to_add@1)
end,
{naive_date_time, New_date, New_time}
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 689).
-spec subtract(tempo:naive_date_time(), tempo:duration()) -> tempo:naive_date_time().
subtract(Datetime, Duration_to_subtract) ->
gleam@bool:lazy_guard(
erlang:element(2, 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 = erlang:element(3, Datetime),
_pipe@2 = tempo@time:to_duration(_pipe@1),
_pipe@3 = tempo@duration:decrease(_pipe@2, Time_to_sub),
tempo@duration:as_nanoseconds(_pipe@3)
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(erlang:element(3, Datetime)) - New_time_as_ns@1
),
New_date = begin
_pipe@4 = erlang:element(2, Datetime),
tempo@date:subtract(_pipe@4, Days_to_sub@1)
end,
New_time = begin
_pipe@5 = erlang:element(3, Datetime),
tempo@time:subtract(_pipe@5, Time_to_sub@1)
end,
{naive_date_time, New_date, New_time}
end
).
-file("/home/john/Repos/tempo/src/tempo/naive_datetime.gleam", 70).
-spec now_local() -> tempo:naive_date_time().
now_local() ->
_pipe = now_utc(),
subtract(_pipe, tempo@offset:to_duration(tempo@offset:local())).