Current section
Files
Jump to
Current section
Files
src/fmglee.erl
-module(fmglee).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/1, s/2, d/2, f/2, try_sprintf/2, try_writef/2, try_write/3, sprintf/2, write/3, print/2, println/2, writef/2, printf/1, printlnf/1, try_build/1, build/1]).
-export_type([fmt_error/0, fmt/0, formatter/0]).
-type fmt_error() :: {incorrect_value_type, binary(), fmt()} |
too_many_values |
not_enough_values |
{invalid_float, binary()} |
{invalid_int, binary()} |
{invalid_float_format_specifier, binary()}.
-type fmt() :: {s, binary()} | {d, integer()} | {f, float()}.
-opaque formatter() :: {formatter, binary(), list(fmt())}.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 222).
-spec round_float(binary(), binary()) -> {ok, binary()} | {error, fmt_error()}.
round_float(Value, N) ->
gleam@result:'try'(
begin
_pipe = gleam@int:parse(N),
gleam@result:replace_error(_pipe, {invalid_int, N})
end,
fun(N@1) -> case N@1 of
0 ->
case gleam@string:split(Value, <<"."/utf8>>) of
[Num, _] ->
{ok, Num};
_ ->
{error, {invalid_float, Value}}
end;
_ ->
case gleam@string:split(Value, <<"."/utf8>>) of
[Num@1, Remainder] ->
Parts = gleam@string:split(Remainder, <<""/utf8>>),
Len_parts = erlang:length(Parts),
Rounded = begin
_pipe@1 = case Len_parts > N@1 of
true ->
gleam@list:take(Parts, N@1);
false ->
Pad = gleam@list:repeat(
<<"0"/utf8>>,
(N@1 - Len_parts)
),
lists:append(Parts, Pad)
end,
gleam@string:join(_pipe@1, <<""/utf8>>)
end,
{ok,
<<<<Num@1/binary, "."/utf8>>/binary,
Rounded/binary>>};
_ ->
{error, {invalid_float, Value}}
end
end end
).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 293).
-spec float_to_string(float()) -> binary().
float_to_string(Value) ->
case Value of
Value@1 when (Value@1 < 0.001) andalso (Value@1 >= +0.0) ->
<<"0."/utf8,
(begin
_pipe = gleam@float:truncate(Value@1 * 1000000000.0),
_pipe@1 = gleam@int:to_string(_pipe),
gleam@string:pad_left(_pipe@1, 9, <<"0"/utf8>>)
end)/binary>>;
Value@2 when (Value@2 > -0.001) andalso (Value@2 < +0.0) ->
<<"-0."/utf8,
(begin
_pipe@2 = gleam@float:truncate(Value@2 * -1000000000.0),
_pipe@3 = gleam@int:to_string(_pipe@2),
gleam@string:pad_left(_pipe@3, 9, <<"0"/utf8>>)
end)/binary>>;
Value@3 when (Value@3 > 1000.0) orelse (Value@3 < -1000.0) ->
Trunc = gleam@float:truncate(Value@3),
case Value@3 =:= begin
_pipe@4 = Trunc,
gleam@int:to_float(_pipe@4)
end of
true ->
<<(begin
_pipe@5 = Trunc,
gleam@int:to_string(_pipe@5)
end)/binary,
".0"/utf8>>;
false ->
gleam@float:to_string(Value@3)
end;
Value@4 ->
gleam@float:to_string(Value@4)
end.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 262).
-spec format_delimited_float(float(), binary()) -> {ok, binary()} |
{error, fmt_error()}.
format_delimited_float(Value, Delimiter) ->
Val = float_to_string(Value),
case gleam@string:split(Val, <<"."/utf8>>) of
[Num, Remainder] ->
Intersparced = begin
_pipe = gleam@string:split(Num, <<""/utf8>>),
_pipe@1 = lists:reverse(_pipe),
_pipe@2 = gleam@list:index_map(
_pipe@1,
fun(V, I) -> case I rem 3 of
0 ->
[Delimiter, V];
_ ->
[V]
end end
),
gleam@list:flatten(_pipe@2)
end,
S = begin
_pipe@3 = case Intersparced of
[Val@1 | Vals] when Val@1 =:= Delimiter ->
Vals;
Vals@1 ->
Vals@1
end,
_pipe@4 = lists:reverse(_pipe@3),
gleam@string:join(_pipe@4, <<""/utf8>>)
end,
{ok, <<<<S/binary, "."/utf8>>/binary, Remainder/binary>>};
_ ->
{error, {invalid_float, float_to_string(Value)}}
end.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 358).
-spec new(binary()) -> formatter().
new(S) ->
{formatter, S, []}.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 363).
-spec s(formatter(), binary()) -> formatter().
s(Formatter, S) ->
{formatter,
erlang:element(2, Formatter),
[{s, S} | erlang:element(3, Formatter)]}.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 368).
-spec d(formatter(), integer()) -> formatter().
d(Formatter, D) ->
{formatter,
erlang:element(2, Formatter),
[{d, D} | erlang:element(3, Formatter)]}.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 373).
-spec f(formatter(), float()) -> formatter().
f(Formatter, F) ->
{formatter,
erlang:element(2, Formatter),
[{f, F} | erlang:element(3, Formatter)]}.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 332).
-spec process_fmt(binary(), binary(), binary(), list(fmt()), list(binary())) -> {ok,
binary()} |
{error, fmt_error()}.
process_fmt(Placeholder, Value, Str, Values, Matches) ->
case gleam@string:split_once(Str, Placeholder) of
{ok, {First, Last}} ->
do_fmt(
<<<<First/binary, Value/binary>>/binary, Last/binary>>,
Values,
Matches
);
{error, _} ->
{error, {incorrect_value_type, Placeholder, {s, Value}}}
end.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 174).
-spec do_fmt(binary(), list(fmt()), list(binary())) -> {ok, binary()} |
{error, fmt_error()}.
do_fmt(Str, Values, Matches) ->
case {Values, Matches} of
{[], []} ->
{ok, Str};
{[{s, Value} | Rest], [<<"%s"/utf8>> | Matches@1]} ->
process_fmt(<<"%s"/utf8>>, Value, Str, Rest, Matches@1);
{[{d, Value@1} | Rest@1], [<<"%d"/utf8>> | Matches@2]} ->
process_fmt(
<<"%d"/utf8>>,
gleam@int:to_string(Value@1),
Str,
Rest@1,
Matches@2
);
{[{f, Value@2} | Rest@2], [Placeholder | Matches@3]} ->
process_float_fmt(Placeholder, Value@2, Str, Rest@2, Matches@3);
{[Got | _], [Expected | _]} ->
{error, {incorrect_value_type, Expected, Got}};
{_, _} ->
{error, too_many_values}
end.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 152).
-spec try_sprintf(binary(), list(fmt())) -> {ok, binary()} |
{error, fmt_error()}.
try_sprintf(S, V) ->
_assert_subject = gleam@regex:from_string(
<<"(%d|%s|%[\\W]?f|%[\\W]?\\.\\df)"/utf8>>
),
{ok, Re} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"fmglee"/utf8>>,
function => <<"try_sprintf"/utf8>>,
line => 153})
end,
Matches = begin
_pipe = gleam@regex:scan(Re, S),
gleam@list:map(_pipe, fun(M) -> erlang:element(2, M) end)
end,
Num_matches = erlang:length(Matches),
Num_values = erlang:length(V),
case {Num_matches > Num_values, Num_values > Num_matches} of
{true, false} ->
{error, not_enough_values};
{false, true} ->
{error, too_many_values};
{_, _} ->
do_fmt(S, V, Matches)
end.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 113).
-spec try_writef(formatter(), fun((binary()) -> FWO)) -> {ok, FWO} |
{error, fmt_error()}.
try_writef(Formatter, Writer) ->
gleam@result:'try'(
try_sprintf(erlang:element(2, Formatter), erlang:element(3, Formatter)),
fun(S) -> {ok, Writer(S)} end
).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 130).
-spec try_write(binary(), list(fmt()), fun((binary()) -> FWW)) -> {ok, FWW} |
{error, fmt_error()}.
try_write(S, V, Writer) ->
gleam@result:'try'(try_sprintf(S, V), fun(S@1) -> {ok, Writer(S@1)} end).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 142).
-spec sprintf(binary(), list(fmt())) -> binary().
sprintf(S, V) ->
_assert_subject = try_sprintf(S, V),
{ok, Str} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"fmglee"/utf8>>,
function => <<"sprintf"/utf8>>,
line => 143})
end,
Str.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 122).
-spec write(binary(), list(fmt()), fun((binary()) -> FWT)) -> FWT.
write(S, V, Writer) ->
_pipe = sprintf(S, V),
Writer(_pipe).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 79).
-spec print(binary(), list(fmt())) -> nil.
print(S, V) ->
write(S, V, fun gleam@io:print/1).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 86).
-spec println(binary(), list(fmt())) -> nil.
println(S, V) ->
write(S, V, fun gleam@io:println/1).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 106).
-spec writef(formatter(), fun((binary()) -> FWM)) -> FWM.
writef(Formatter, Writer) ->
write(erlang:element(2, Formatter), erlang:element(3, Formatter), Writer).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 92).
-spec printf(formatter()) -> nil.
printf(Formatter) ->
writef(Formatter, fun gleam@io:print/1).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 99).
-spec printlnf(formatter()) -> nil.
printlnf(Formatter) ->
writef(Formatter, fun gleam@io:println/1).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 192).
-spec process_float_fmt(
binary(),
float(),
binary(),
list(fmt()),
list(binary())
) -> {ok, binary()} | {error, fmt_error()}.
process_float_fmt(Placeholder, Value, Str, Values, Matches) ->
case gleam@string:split(Placeholder, <<""/utf8>>) of
[<<"%"/utf8>>, C, <<"f"/utf8>>] ->
gleam@result:'try'(
format_delimited_float(Value, C),
fun(Val) ->
process_fmt(Placeholder, Val, Str, Values, Matches)
end
);
[<<"%"/utf8>>, C@1, <<"."/utf8>>, N, <<"f"/utf8>>] ->
gleam@result:'try'(
format_delimited_float(Value, C@1),
fun(Val@1) ->
gleam@result:'try'(
round_float(Val@1, N),
fun(Rounded) ->
process_fmt(
Placeholder,
Rounded,
Str,
Values,
Matches
)
end
)
end
);
[<<"%"/utf8>>, <<"."/utf8>>, N@1, <<"f"/utf8>>] ->
gleam@result:'try'(
begin
_pipe = float_to_string(Value),
round_float(_pipe, N@1)
end,
fun(Val@2) ->
process_fmt(Placeholder, Val@2, Str, Values, Matches)
end
);
[<<"%"/utf8>>, <<"f"/utf8>>] ->
process_fmt(
<<"%f"/utf8>>,
float_to_string(Value),
Str,
Values,
Matches
);
_ ->
{error, {invalid_float_format_specifier, Placeholder}}
end.
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 381).
-spec try_build(formatter()) -> {ok, binary()} | {error, fmt_error()}.
try_build(Formatter) ->
try_sprintf(
erlang:element(2, Formatter),
lists:reverse(erlang:element(3, Formatter))
).
-file("/home/sam/dev/personal/fmglee/src/fmglee.gleam", 387).
-spec build(formatter()) -> binary().
build(Formatter) ->
_assert_subject = try_build(Formatter),
{ok, Str} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"fmglee"/utf8>>,
function => <<"build"/utf8>>,
line => 388})
end,
Str.