Skip to main content

src/gg_cn@internal@sort_modifiers.erl

-module(gg_cn@internal@sort_modifiers).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gg_cn/internal/sort_modifiers.gleam").
-export([sort_modifiers/2]).

-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/gg_cn/internal/sort_modifiers.gleam", 34).
?DOC(false).
-spec flush(list(binary()), list(binary())) -> list(binary()).
flush(Segment, Result_rev) ->
    _pipe = Segment,
    _pipe@1 = gleam@list:sort(_pipe, fun gleam@string:compare/2),
    gleam@list:fold(_pipe@1, Result_rev, fun(Acc, Item) -> [Item | Acc] end).

-file("src/gg_cn/internal/sort_modifiers.gleam", 14).
?DOC(false).
-spec sort_modifiers(gleam@set:set(binary()), list(binary())) -> list(binary()).
sort_modifiers(Order_sensitive, Modifiers) ->
    {Result_rev@1, Segment@1} = gleam@list:fold(
        Modifiers,
        {[], []},
        fun(Acc, Modifier) ->
            {Result_rev, Segment} = Acc,
            Is_arbitrary = gleam_stdlib:string_starts_with(
                Modifier,
                <<"["/utf8>>
            ),
            Is_order_sensitive = gleam@set:contains(Order_sensitive, Modifier),
            case Is_arbitrary orelse Is_order_sensitive of
                true ->
                    {[Modifier | flush(Segment, Result_rev)], []};

                false ->
                    {Result_rev, [Modifier | Segment]}
            end
        end
    ),
    lists:reverse(flush(Segment@1, Result_rev@1)).