Skip to main content

src/sparklinekit@internal@scale.erl

-module(sparklinekit@internal@scale).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/sparklinekit/internal/scale.gleam").
-export([round_to_int/1, clamp_int/3, clamp_finite/1, min_max/1, unit/3]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(false).

-file("src/sparklinekit/internal/scale.gleam", 88).
?DOC(false).
-spec round_to_int(float()) -> integer().
round_to_int(Value) ->
    erlang:round(Value).

-file("src/sparklinekit/internal/scale.gleam", 93).
?DOC(false).
-spec clamp_int(integer(), integer(), integer()) -> integer().
clamp_int(Value, Lo, Hi) ->
    case Value < Lo of
        true ->
            Lo;

        false ->
            case Value > Hi of
                true ->
                    Hi;

                false ->
                    Value
            end
    end.

-file("src/sparklinekit/internal/scale.gleam", 25).
?DOC(false).
-spec clamp_finite(float()) -> float().
clamp_finite(Value) ->
    case Value > 1.0e300 of
        true ->
            1.0e300;

        false ->
            case Value < (+0.0 - 1.0e300) of
                true ->
                    +0.0 - 1.0e300;

                false ->
                    Value
            end
    end.

-file("src/sparklinekit/internal/scale.gleam", 42).
?DOC(false).
-spec min_max(list(float())) -> {float(), float()}.
min_max(Values) ->
    case Values of
        [] ->
            {+0.0, +0.0};

        [Head | Rest] ->
            Safe_head = clamp_finite(Head),
            gleam@list:fold(
                Rest,
                {Safe_head, Safe_head},
                fun(Acc, Value) ->
                    Safe_value = clamp_finite(Value),
                    {Lo, Hi} = Acc,
                    New_lo = case Safe_value < Lo of
                        true ->
                            Safe_value;

                        false ->
                            Lo
                    end,
                    New_hi = case Safe_value > Hi of
                        true ->
                            Safe_value;

                        false ->
                            Hi
                    end,
                    {New_lo, New_hi}
                end
            )
    end.

-file("src/sparklinekit/internal/scale.gleam", 72).
?DOC(false).
-spec unit(float(), float(), float()) -> float().
unit(Value, Min, Max) ->
    Safe_value = clamp_finite(Value),
    Safe_min = clamp_finite(Min),
    Safe_max = clamp_finite(Max),
    Span = Safe_max - Safe_min,
    case Span =< +0.0 of
        true ->
            0.5;

        false ->
            case Span of
                +0.0 -> +0.0;
                -0.0 -> -0.0;
                Gleam@denominator -> (Safe_value - Safe_min) / Gleam@denominator
            end
    end.