-module(grapheme_util). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([is_lower_ascii/1, is_upper_ascii/1, is_digit/1, is_whitespace/1, is_alphanumeric/1, is_alphanumeric_or_dash_or_underscore/1, is_alphanumeric_or_dash_or_underscore_or_period/1, get_chars_matching_func/3, get_whitespace/1, get_name_ignore_ws/1, is_not_double_quote/1, is_not_single_quote/1, is_not_whitespace/1, is_not_gt/1]). -spec is_lower_ascii(binary()) -> boolean(). is_lower_ascii(Grapheme) -> case Grapheme of <<"a"/utf8>> -> true; <<"b"/utf8>> -> true; <<"c"/utf8>> -> true; <<"d"/utf8>> -> true; <<"e"/utf8>> -> true; <<"f"/utf8>> -> true; <<"g"/utf8>> -> true; <<"h"/utf8>> -> true; <<"i"/utf8>> -> true; <<"j"/utf8>> -> true; <<"k"/utf8>> -> true; <<"l"/utf8>> -> true; <<"m"/utf8>> -> true; <<"n"/utf8>> -> true; <<"o"/utf8>> -> true; <<"p"/utf8>> -> true; <<"q"/utf8>> -> true; <<"r"/utf8>> -> true; <<"s"/utf8>> -> true; <<"t"/utf8>> -> true; <<"u"/utf8>> -> true; <<"v"/utf8>> -> true; <<"w"/utf8>> -> true; <<"x"/utf8>> -> true; <<"y"/utf8>> -> true; <<"z"/utf8>> -> true; _ -> false end. -spec is_upper_ascii(binary()) -> boolean(). is_upper_ascii(Grapheme) -> case Grapheme of <<"A"/utf8>> -> true; <<"B"/utf8>> -> true; <<"C"/utf8>> -> true; <<"D"/utf8>> -> true; <<"E"/utf8>> -> true; <<"F"/utf8>> -> true; <<"G"/utf8>> -> true; <<"H"/utf8>> -> true; <<"I"/utf8>> -> true; <<"J"/utf8>> -> true; <<"K"/utf8>> -> true; <<"L"/utf8>> -> true; <<"M"/utf8>> -> true; <<"N"/utf8>> -> true; <<"O"/utf8>> -> true; <<"P"/utf8>> -> true; <<"Q"/utf8>> -> true; <<"R"/utf8>> -> true; <<"S"/utf8>> -> true; <<"T"/utf8>> -> true; <<"U"/utf8>> -> true; <<"V"/utf8>> -> true; <<"W"/utf8>> -> true; <<"X"/utf8>> -> true; <<"Y"/utf8>> -> true; <<"Z"/utf8>> -> true; _ -> false end. -spec is_digit(binary()) -> boolean(). is_digit(Grapheme) -> case Grapheme of <<"0"/utf8>> -> true; <<"1"/utf8>> -> true; <<"2"/utf8>> -> true; <<"3"/utf8>> -> true; <<"4"/utf8>> -> true; <<"5"/utf8>> -> true; <<"6"/utf8>> -> true; <<"7"/utf8>> -> true; <<"8"/utf8>> -> true; <<"9"/utf8>> -> true; _ -> false end. -spec is_whitespace(binary()) -> boolean(). is_whitespace(Grapheme) -> case Grapheme of <<" "/utf8>> -> true; <<"\t"/utf8>> -> true; <<"\r"/utf8>> -> true; <<"\n"/utf8>> -> true; _ -> false end. -spec is_alphanumeric(binary()) -> boolean(). is_alphanumeric(Grapheme) -> case (is_lower_ascii(Grapheme) orelse is_upper_ascii(Grapheme)) orelse is_digit( Grapheme ) of true -> true; _ -> false end. -spec is_alphanumeric_or_dash_or_underscore(binary()) -> boolean(). is_alphanumeric_or_dash_or_underscore(Grapheme) -> case (is_alphanumeric(Grapheme) orelse (Grapheme =:= <<"_"/utf8>>)) orelse (Grapheme =:= <<"-"/utf8>>) of true -> true; _ -> false end. -spec is_alphanumeric_or_dash_or_underscore_or_period(binary()) -> boolean(). is_alphanumeric_or_dash_or_underscore_or_period(Grapheme) -> case is_alphanumeric_or_dash_or_underscore(Grapheme) orelse (Grapheme =:= <<"."/utf8>>) of true -> true; _ -> false end. -spec get_chars_matching_func(binary(), binary(), fun((binary()) -> boolean())) -> {binary(), binary()}. get_chars_matching_func(S, Acc, Match_func) -> case gleam@string:pop_grapheme(S) of {ok, {Grapheme, Rest}} -> case Match_func(Grapheme) of true -> get_chars_matching_func( Rest, <>, Match_func ); false -> {Acc, S} end; {error, _} -> {Acc, S} end. -spec get_whitespace(binary()) -> {binary(), binary()}. get_whitespace(S) -> get_chars_matching_func(S, <<""/utf8>>, fun is_whitespace/1). -spec get_name_ignore_ws(binary()) -> {binary(), binary(), integer()}. get_name_ignore_ws(S) -> I = 0, {Whitespace_chars, Rest} = get_whitespace(S), I@1 = I + gleam@string:length(Whitespace_chars), {Name_graphemes, Rest@1} = get_chars_matching_func( Rest, <<""/utf8>>, fun is_alphanumeric_or_dash_or_underscore/1 ), I@2 = I@1 + gleam@string:length(Name_graphemes), {Whitespace_chars@1, Rest@2} = get_whitespace(Rest@1), I@3 = I@2 + gleam@string:length(Whitespace_chars@1), {Name_graphemes, Rest@2, I@3}. -spec is_not_double_quote(binary()) -> boolean(). is_not_double_quote(Grapheme) -> case Grapheme of <<"\""/utf8>> -> false; _ -> true end. -spec is_not_single_quote(binary()) -> boolean(). is_not_single_quote(Grapheme) -> case Grapheme of <<"'"/utf8>> -> false; _ -> true end. -spec is_not_whitespace(binary()) -> boolean(). is_not_whitespace(Grapheme) -> case is_whitespace(Grapheme) of true -> false; _ -> true end. -spec is_not_gt(binary()) -> boolean(). is_not_gt(Grapheme) -> case Grapheme of <<">"/utf8>> -> false; _ -> true end.