src/automata@cron@normalize.erl

-module(automata@cron@normalize).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/automata/cron/normalize.gleam").
-export([normalize/1]).
-export_type([int_set/0, cron_plan/0]).

-type int_set() :: {any_value, integer(), integer()} | {values, list(integer())}.

-type cron_plan() :: {cron_plan,
        int_set(),
        int_set(),
        int_set(),
        int_set(),
        int_set()}.

-file("src/automata/cron/normalize.gleam", 28).
-spec normalize_selector(
    automata@cron@validator:selector(),
    integer(),
    integer(),
    boolean()
) -> int_set().
normalize_selector(Selector, Min, Max, Normalize_day_of_week) ->
    case Selector of
        any ->
            {any_value, Min, Max};

        _ ->
            {values,
                automata@cron@validator:selector_values(
                    Selector,
                    Min,
                    Max,
                    Normalize_day_of_week
                )}
    end.

-file("src/automata/cron/normalize.gleam", 18).
-spec normalize(automata@cron@validator:valid_cron()) -> cron_plan().
normalize(Spec) ->
    {cron_plan,
        normalize_selector(automata@cron@validator:minute(Spec), 0, 59, false),
        normalize_selector(automata@cron@validator:hour(Spec), 0, 23, false),
        normalize_selector(
            automata@cron@validator:day_of_month(Spec),
            1,
            31,
            false
        ),
        normalize_selector(automata@cron@validator:month(Spec), 1, 12, false),
        normalize_selector(
            automata@cron@validator:day_of_week(Spec),
            0,
            6,
            true
        )}.