-module(mat). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([format1/2, format2/3, format3/4, format4/5, format5/6, format_list/2]). -spec default_converter(any()) -> binary(). default_converter(Value) -> Dyn_val = gleam@dynamic:from(Value), gleam@bool:guard( gleam@dynamic:classify(Dyn_val) =:= <<"Function"/utf8>>, <<""/utf8>>, fun() -> case gleam@dynamic:string(Dyn_val) of {error, _} -> gleam@string:inspect(Value); {ok, V} -> V end end ). -spec inner_format_once(binary(), FRK, fun((FRK) -> binary())) -> {binary(), binary()}. inner_format_once(Template, Value, Converter) -> case gleam@string:split_once(Template, <<"{}"/utf8>>) of {ok, {Pre, Post}} -> {<
>, Post};

        {error, nil} ->
            {Template, <<""/utf8>>}
    end.

-spec format1(binary(), any()) -> binary().
format1(Template, A) ->
    {F, Rest} = inner_format_once(Template, A, fun default_converter/1),
    <>.

-spec format2(binary(), any(), any()) -> binary().
format2(Template, A, B) ->
    {F1, Rest} = inner_format_once(Template, A, fun default_converter/1),
    {F2, Rest@1} = inner_format_once(Rest, B, fun default_converter/1),
    <<<>/binary, Rest@1/binary>>.

-spec format3(binary(), any(), any(), any()) -> binary().
format3(Template, A, B, C) ->
    {F1, Rest} = inner_format_once(Template, A, fun default_converter/1),
    {F2, Rest@1} = inner_format_once(Rest, B, fun default_converter/1),
    {F3, Rest@2} = inner_format_once(Rest@1, C, fun default_converter/1),
    <<<<<>/binary, F3/binary>>/binary, Rest@2/binary>>.

-spec format4(binary(), any(), any(), any(), any()) -> binary().
format4(Template, A, B, C, D) ->
    {F1, Rest} = inner_format_once(Template, A, fun default_converter/1),
    {F2, Rest@1} = inner_format_once(Rest, B, fun default_converter/1),
    {F3, Rest@2} = inner_format_once(Rest@1, C, fun default_converter/1),
    {F4, Rest@3} = inner_format_once(Rest@2, D, fun default_converter/1),
    <<<<<<<>/binary, F3/binary>>/binary, F4/binary>>/binary,
        Rest@3/binary>>.

-spec format5(binary(), any(), any(), any(), any(), any()) -> binary().
format5(Template, A, B, C, D, E) ->
    {F1, Rest} = inner_format_once(Template, A, fun default_converter/1),
    {F2, Rest@1} = inner_format_once(Rest, B, fun default_converter/1),
    {F3, Rest@2} = inner_format_once(Rest@1, C, fun default_converter/1),
    {F4, Rest@3} = inner_format_once(Rest@2, D, fun default_converter/1),
    {F5, Rest@4} = inner_format_once(Rest@3, E, fun default_converter/1),
    <<<<<<<<<>/binary, F3/binary>>/binary, F4/binary>>/binary,
            F5/binary>>/binary,
        Rest@4/binary>>.

-spec inner_format(binary(), list(FRN), fun((FRN) -> binary())) -> binary().
inner_format(Template, Values, Converter) ->
    case Values of
        [] ->
            Template;

        [Value | Rest] ->
            case gleam@string:split_once(Template, <<"{}"/utf8>>) of
                {ok, {Pre, Post}} ->
                    <<<
>/binary,
                        (inner_format(Post, Rest, Converter))/binary>>;

                {error, nil} ->
                    Template
            end
    end.

-spec format_list(binary(), list(any())) -> binary().
format_list(Template, Values) ->
    inner_format(Template, Values, fun default_converter/1).