Current section

Files

Jump to
automata src automata@rrule@normalize.erl
Raw

src/automata@rrule@normalize.erl

-module(automata@rrule@normalize).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/automata/rrule/normalize.gleam").
-export([normalize/2]).
-export_type([normalize_error/0, r_rule_plan/0]).
-type normalize_error() :: {invalid_anchor, automata@schedule@ast:date_time()}.
-type r_rule_plan() :: {r_rule_plan,
automata@schedule@ast:date_time(),
automata@rrule@validator:frequency(),
integer(),
automata@rrule@validator:end_condition(),
gleam@option:option(list(automata@rrule@validator:weekday_specifier())),
gleam@option:option(list(integer())),
gleam@option:option(list(integer())),
list(integer()),
list(integer()),
list(integer())}.
-file("src/automata/rrule/normalize.gleam", 111).
-spec reverse_loop(list(GXT), list(GXT)) -> list(GXT).
reverse_loop(Xs, Acc) ->
case Xs of
[] ->
Acc;
[X | Rest] ->
reverse_loop(Rest, [X | Acc])
end.
-file("src/automata/rrule/normalize.gleam", 107).
-spec reverse_list(list(GXQ)) -> list(GXQ).
reverse_list(Xs) ->
reverse_loop(Xs, []).
-file("src/automata/rrule/normalize.gleam", 100).
-spec range_loop(integer(), integer(), list(integer())) -> list(integer()).
range_loop(Current, To, Acc) ->
case Current > To of
true ->
reverse_list(Acc);
false ->
range_loop(Current + 1, To, [Current | Acc])
end.
-file("src/automata/rrule/normalize.gleam", 96).
-spec range_inclusive(integer(), integer()) -> list(integer()).
range_inclusive(From, To) ->
range_loop(From, To, []).
-file("src/automata/rrule/normalize.gleam", 65).
-spec default_by_hour(
automata@rrule@validator:frequency(),
automata@schedule@ast:date_time()
) -> list(integer()).
default_by_hour(Frequency, Anchor) ->
case Frequency of
secondly ->
range_inclusive(0, 23);
minutely ->
range_inclusive(0, 23);
hourly ->
range_inclusive(0, 23);
_ ->
[erlang:element(2, erlang:element(3, Anchor))]
end.
-file("src/automata/rrule/normalize.gleam", 76).
-spec default_by_minute(
automata@rrule@validator:frequency(),
automata@schedule@ast:date_time()
) -> list(integer()).
default_by_minute(Frequency, Anchor) ->
case Frequency of
secondly ->
range_inclusive(0, 59);
minutely ->
range_inclusive(0, 59);
_ ->
[erlang:element(3, erlang:element(3, Anchor))]
end.
-file("src/automata/rrule/normalize.gleam", 86).
-spec default_seconds(
automata@rrule@validator:frequency(),
automata@schedule@ast:date_time()
) -> list(integer()).
default_seconds(Frequency, Anchor) ->
case Frequency of
secondly ->
range_inclusive(0, 59);
_ ->
[erlang:element(4, erlang:element(3, Anchor))]
end.
-file("src/automata/rrule/normalize.gleam", 118).
-spec default_by_day(
automata@rrule@validator:valid_r_rule(),
automata@schedule@ast:date_time()
) -> gleam@option:option(list(automata@rrule@validator:weekday_specifier())).
default_by_day(Spec, Anchor) ->
case automata@rrule@validator:by_day(Spec) of
{some, Values} ->
{some, Values};
none ->
case automata@rrule@validator:frequency(Spec) of
weekly ->
{some,
[{every_weekday,
automata@internal@calendar:weekday(Anchor)}]};
_ ->
none
end
end.
-file("src/automata/rrule/normalize.gleam", 133).
-spec default_by_month(
automata@rrule@validator:valid_r_rule(),
automata@schedule@ast:date_time()
) -> gleam@option:option(list(integer())).
default_by_month(Spec, Anchor) ->
case automata@rrule@validator:by_month(Spec) of
{some, Values} ->
{some, Values};
none ->
case automata@rrule@validator:frequency(Spec) of
yearly ->
case {automata@rrule@validator:by_day(Spec),
automata@rrule@validator:by_month_day(Spec)} of
{none, none} ->
{some,
[erlang:element(3, erlang:element(2, Anchor))]};
{_, _} ->
none
end;
_ ->
none
end
end.
-file("src/automata/rrule/normalize.gleam", 151).
-spec default_by_month_day(
automata@rrule@validator:valid_r_rule(),
automata@schedule@ast:date_time()
) -> gleam@option:option(list(integer())).
default_by_month_day(Spec, Anchor) ->
case automata@rrule@validator:by_month_day(Spec) of
{some, Values} ->
{some, Values};
none ->
case automata@rrule@validator:by_day(Spec) of
{some, _} ->
none;
none ->
case automata@rrule@validator:frequency(Spec) of
monthly ->
{some,
[erlang:element(4, erlang:element(2, Anchor))]};
yearly ->
{some,
[erlang:element(4, erlang:element(2, Anchor))]};
_ ->
none
end
end
end.
-file("src/automata/rrule/normalize.gleam", 25).
-spec normalize(
automata@rrule@validator:valid_r_rule(),
automata@schedule@ast:date_time()
) -> {ok, r_rule_plan()} | {error, normalize_error()}.
normalize(Spec, Anchor) ->
case automata@internal@calendar:is_valid_datetime(Anchor) of
false ->
{error, {invalid_anchor, Anchor}};
true ->
Frequency = automata@rrule@validator:frequency(Spec),
{ok,
{r_rule_plan,
Anchor,
Frequency,
automata@rrule@validator:interval(Spec),
automata@rrule@validator:end_condition(Spec),
default_by_day(Spec, Anchor),
default_by_month(Spec, Anchor),
default_by_month_day(Spec, Anchor),
case automata@rrule@validator:by_hour(Spec) of
{some, Values} ->
Values;
none ->
default_by_hour(Frequency, Anchor)
end,
case automata@rrule@validator:by_minute(Spec) of
{some, Values@1} ->
Values@1;
none ->
default_by_minute(Frequency, Anchor)
end,
default_seconds(Frequency, Anchor)}}
end.