Packages

A library for reading Exif data in JPEG files.

Current section

Files

Jump to
glexif src glexif@internal@utils.erl
Raw

src/glexif@internal@utils.erl

-module(glexif@internal@utils).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glexif/internal/utils.gleam").
-export([print_bit_array/1, hex_string_to_decimal/1, bit_array_to_decimal/1, trim_zero_bits/1, bit_array_reverse/1, round_to_n_decimals/2, greatest_common_denominator/2, simplify_fraction/1]).
-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/glexif/internal/utils.gleam", 8).
?DOC(false).
-spec print_bit_array({ok, bitstring()} | {error, nil}) -> nil.
print_bit_array(Arr) ->
gleam_stdlib:println(
gleam@bit_array:inspect(gleam@result:unwrap(Arr, <<>>))
),
nil.
-file("src/glexif/internal/utils.gleam", 19).
?DOC(false).
-spec hex_string_to_decimal(binary()) -> integer().
hex_string_to_decimal(Hex_string) ->
gleam@result:unwrap(gleam@int:base_parse(Hex_string, 16), 0).
-file("src/glexif/internal/utils.gleam", 13).
?DOC(false).
-spec bit_array_to_decimal(bitstring()) -> integer().
bit_array_to_decimal(Arr) ->
_pipe = Arr,
_pipe@1 = gleam_stdlib:base16_encode(_pipe),
hex_string_to_decimal(_pipe@1).
-file("src/glexif/internal/utils.gleam", 32).
?DOC(false).
-spec trim_trailing_zeros(bitstring()) -> bitstring().
trim_trailing_zeros(Str) ->
case gleam_stdlib:bit_array_slice(Str, erlang:byte_size(Str) - 1, 1) of
{ok, <<0>>} ->
_pipe = Str,
_pipe@1 = gleam_stdlib:bit_array_slice(
_pipe,
0,
erlang:byte_size(Str) - 1
),
_pipe@2 = gleam@result:unwrap(_pipe@1, <<>>),
trim_trailing_zeros(_pipe@2);
{ok, _} ->
Str;
_ ->
Str
end.
-file("src/glexif/internal/utils.gleam", 27).
?DOC(false).
-spec trim_zero_bits(bitstring()) -> bitstring().
trim_zero_bits(Arr) ->
_pipe = Arr,
trim_trailing_zeros(_pipe).
-file("src/glexif/internal/utils.gleam", 45).
?DOC(false).
-spec bit_array_reverse(bitstring()) -> bitstring().
bit_array_reverse(B) ->
case B of
<<A, B@1/bitstring>> ->
gleam_stdlib:bit_array_concat([bit_array_reverse(B@1), <<A>>]);
_ ->
<<>>
end.
-file("src/glexif/internal/utils.gleam", 52).
?DOC(false).
-spec round_to_n_decimals(float(), integer()) -> float().
round_to_n_decimals(Num, Decimals) ->
Factor@1 = case gleam@int:power(10, erlang:float(Decimals)) of
{ok, Factor} -> Factor;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"glexif/internal/utils"/utf8>>,
function => <<"round_to_n_decimals"/utf8>>,
line => 53,
value => _assert_fail,
start => 1374,
'end' => 1435,
pattern_start => 1385,
pattern_end => 1395})
end,
case Factor@1 of
+0.0 -> +0.0;
-0.0 -> -0.0;
Gleam@denominator -> erlang:float(erlang:round(Factor@1 * Num)) / Gleam@denominator
end.
-file("src/glexif/internal/utils.gleam", 57).
?DOC(false).
-spec greatest_common_denominator(integer(), integer()) -> integer().
greatest_common_denominator(A, B) ->
case {A, B} of
{_, 0} ->
A;
{_, _} ->
greatest_common_denominator(B, case B of
0 -> 0;
Gleam@denominator -> A rem Gleam@denominator
end)
end.
-file("src/glexif/internal/utils.gleam", 64).
?DOC(false).
-spec simplify_fraction(glexif@units@fraction:fraction()) -> glexif@units@fraction:fraction().
simplify_fraction(Fraction) ->
{fraction, Numerator, Denominator} = Fraction,
Gcd = greatest_common_denominator(Numerator, Denominator),
{fraction, case Gcd of
0 -> 0;
Gleam@denominator -> Numerator div Gleam@denominator
end, case Gcd of
0 -> 0;
Gleam@denominator@1 -> Denominator div Gleam@denominator@1
end}.