-module(integer_complexity@expression). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([default_format_options/0, with_padding/2, with_addition_sign/2, with_multiplication_sign/2, with_left_bracket/2, with_right_bracket/2, with_digits/2, evaluate_expression/1, to_string/2]). -export_type([format_options/6, padding_defined/0, padding_not_defined/0, add_sign_defined/0, add_sign_not_defined/0, multiply_sign_defined/0, multiply_sign_not_defined/0, left_bracket_defined/0, left_bracket_not_defined/0, right_bracket_defined/0, right_bracket_not_defined/0, digits_defined/0, digits_not_defined/0, expression/0]). -opaque format_options(HBL, HBM, HBN, HBO, HBP, HBQ) :: {format_options, binary(), binary(), binary(), binary(), binary(), gary:erlang_array(binary()), integer()} | {gleam_phantom, HBL, HBM, HBN, HBO, HBP, HBQ}. -type padding_defined() :: any(). -type padding_not_defined() :: any(). -type add_sign_defined() :: any(). -type add_sign_not_defined() :: any(). -type multiply_sign_defined() :: any(). -type multiply_sign_not_defined() :: any(). -type left_bracket_defined() :: any(). -type left_bracket_not_defined() :: any(). -type right_bracket_defined() :: any(). -type right_bracket_not_defined() :: any(). -type digits_defined() :: any(). -type digits_not_defined() :: any(). -type expression() :: {add, expression(), expression()} | {multiply, expression(), expression()} | one. -spec default_format_options() -> format_options(any(), any(), any(), any(), any(), any()). default_format_options() -> {format_options, <<" "/utf8>>, <<"+"/utf8>>, <<"*"/utf8>>, <<"("/utf8>>, <<")"/utf8>>, integer_complexity@internal@array:from_list([<<"1"/utf8>>], <<""/utf8>>), 1}. -spec with_padding( format_options(padding_not_defined(), HBS, HBT, HBU, HBV, HBW), binary() ) -> format_options(padding_defined(), HBS, HBT, HBU, HBV, HBW). with_padding(Options, Padding) -> {format_options, Padding, erlang:element(3, Options), erlang:element(4, Options), erlang:element(5, Options), erlang:element(6, Options), erlang:element(7, Options), erlang:element(8, Options)}. -spec with_addition_sign( format_options(HCJ, add_sign_not_defined(), HCK, HCL, HCM, HCN), binary() ) -> format_options(HCJ, add_sign_defined(), HCK, HCL, HCM, HCN). with_addition_sign(Options, Sign) -> {format_options, erlang:element(2, Options), Sign, erlang:element(4, Options), erlang:element(5, Options), erlang:element(6, Options), erlang:element(7, Options), erlang:element(8, Options)}. -spec with_multiplication_sign( format_options(HDA, HDB, multiply_sign_not_defined(), HDC, HDD, HDE), binary() ) -> format_options(HDA, HDB, multiply_sign_defined(), HDC, HDD, HDE). with_multiplication_sign(Options, Sign) -> {format_options, erlang:element(2, Options), erlang:element(3, Options), Sign, erlang:element(5, Options), erlang:element(6, Options), erlang:element(7, Options), erlang:element(8, Options)}. -spec with_left_bracket( format_options(HDR, HDS, HDT, left_bracket_not_defined(), HDU, HDV), binary() ) -> format_options(HDR, HDS, HDT, left_bracket_defined(), HDU, HDV). with_left_bracket(Options, Left_bracket) -> {format_options, erlang:element(2, Options), erlang:element(3, Options), erlang:element(4, Options), Left_bracket, erlang:element(6, Options), erlang:element(7, Options), erlang:element(8, Options)}. -spec with_right_bracket( format_options(HEI, HEJ, HEK, HEL, right_bracket_not_defined(), HEM), binary() ) -> format_options(HEI, HEJ, HEK, HEL, right_bracket_defined(), HEM). with_right_bracket(Options, Right_bracket) -> {format_options, erlang:element(2, Options), erlang:element(3, Options), erlang:element(4, Options), erlang:element(5, Options), Right_bracket, erlang:element(7, Options), erlang:element(8, Options)}. -spec with_digits( format_options(HEZ, HFA, HFB, HFC, HFD, digits_not_defined()), list(binary()) ) -> format_options(HEZ, HFA, HFB, HFC, HFD, digits_defined()). with_digits(Options, Digits) -> {format_options, erlang:element(2, Options), erlang:element(3, Options), erlang:element(4, Options), erlang:element(6, Options), erlang:element(5, Options), integer_complexity@internal@array:from_list(Digits, <<""/utf8>>), erlang:length(Digits)}. -spec conditionally_apply_parens( binary(), gleam@order:order(), format_options(any(), any(), any(), any(), any(), any()) ) -> binary(). conditionally_apply_parens(Expression_str, Precidence, Options) -> case Precidence of lt -> <<<<(erlang:element(5, Options))/binary, Expression_str/binary>>/binary, (erlang:element(6, Options))/binary>>; _ -> Expression_str end. -spec evaluate_expression(expression()) -> integer(). evaluate_expression(Expression) -> case Expression of one -> 1; {add, Lhs, Rhs} -> evaluate_expression(Lhs) + evaluate_expression(Rhs); {multiply, Lhs@1, Rhs@1} -> evaluate_expression(Lhs@1) * evaluate_expression(Rhs@1) end. -spec compare_precidence(expression(), expression()) -> gleam@order:order(). compare_precidence(Lhs, Rhs) -> case {Lhs, Rhs} of {{add, _, _}, {multiply, _, _}} -> lt; {{multiply, _, _}, {add, _, _}} -> gt; {_, _} -> eq end. -spec apply_padding(binary(), binary()) -> binary(). apply_padding(Padding, Str) -> <<<>/binary, Padding/binary>>. -spec represent_binary_op( expression(), expression(), expression(), binary(), format_options(any(), any(), any(), any(), any(), any()) ) -> binary(). represent_binary_op(This, Lhs, Rhs, Sign, Options) -> <<<<(represent_expression(Lhs, compare_precidence(Lhs, This), Options))/binary, (apply_padding(erlang:element(2, Options), Sign))/binary>>/binary, (represent_expression(Rhs, compare_precidence(Rhs, This), Options))/binary>>. -spec represent_expression( expression(), gleam@order:order(), format_options(any(), any(), any(), any(), any(), any()) ) -> binary(). represent_expression(Expression, Precidence, Options) -> Base = erlang:element(8, Options), Eval_result = evaluate_expression(Expression), case {Eval_result =< Base, Expression} of {_, one} -> gleam@result:unwrap( integer_complexity@internal@array:get( erlang:element(7, Options), Eval_result - 1 ), <<""/utf8>> ); {true, _} -> gleam@result:unwrap( integer_complexity@internal@array:get( erlang:element(7, Options), Eval_result - 1 ), <<""/utf8>> ); {false, {add, Lhs, Rhs}} -> _pipe = represent_binary_op( Expression, Lhs, Rhs, erlang:element(3, Options), Options ), conditionally_apply_parens(_pipe, Precidence, Options); {false, {multiply, Lhs@1, Rhs@1}} -> _pipe@1 = represent_binary_op( Expression, Lhs@1, Rhs@1, erlang:element(4, Options), Options ), conditionally_apply_parens(_pipe@1, Precidence, Options) end. -spec to_string( expression(), format_options(any(), any(), any(), any(), any(), any()) ) -> binary(). to_string(Expression, Options) -> represent_expression(Expression, eq, Options).