aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2023-10-31 17:30:02 +0000
committerLouis Pilfold <louis@lpil.uk>2023-10-31 17:30:02 +0000
commit8233587e5e9ef1486b029a872e80cb5456d665da (patch)
treec37406c9d23b2b22c28cb7523f10588d37ccbc95
parentaa07fd92febf55c9f687d7ffe1ccde92ca0bbb09 (diff)
downloadgleam_stdlib-8233587e5e9ef1486b029a872e80cb5456d665da.tar.gz
gleam_stdlib-8233587e5e9ef1486b029a872e80cb5456d665da.zip
Correctly print non-byte aligned bit arrays
-rw-r--r--src/gleam_stdlib.erl24
-rw-r--r--test/gleam/string_test.gleam7
2 files changed, 31 insertions, 0 deletions
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index 0e2136f..c6b5130 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -390,6 +390,8 @@ inspect(Binary) when is_binary(Binary) ->
Segments = [erlang:integer_to_list(X) || <<X>> <= Binary],
["<<", lists:join(", ", Segments), ">>"]
end;
+inspect(Bits) when is_bitstring(Bits) ->
+ inspect_bit_array(Bits);
inspect(List) when is_list(List) ->
case inspect_list(List) of
{proper, Elements} -> ["[", Elements, "]"];
@@ -457,6 +459,28 @@ inspect_list([First | Rest]) when is_list(Rest) ->
inspect_list([First | ImproperTail]) ->
{improper, [inspect(First), <<" | ">>, inspect(ImproperTail)]}.
+inspect_bit_array(Bits) ->
+ Text = inspect_bit_array(Bits, <<"<<">>),
+ <<Text/binary, ">>">>.
+
+inspect_bit_array(<<>>, Acc) ->
+ Acc;
+inspect_bit_array(<<X, Rest/bitstring>>, Acc) ->
+ inspect_bit_array(Rest, append_segment(Acc, erlang:integer_to_binary(X)));
+inspect_bit_array(Rest, Acc) ->
+ Size = bit_size(Rest),
+ <<X:Size>> = Rest,
+ X1 = erlang:integer_to_binary(X),
+ Size1 = erlang:integer_to_binary(Size),
+ Segment = <<X1/binary, ":size(", Size1/binary, ")">>,
+ inspect_bit_array(<<>>, append_segment(Acc, Segment)).
+
+append_segment(<<"<<">>, Segment) ->
+ <<"<<", Segment/binary>>;
+append_segment(Acc, Segment) ->
+ <<Acc/binary, ", ", Segment/binary>>.
+
+
inspect_maybe_utf8_string(Binary, Acc) ->
case Binary of
<<>> -> {ok, <<$", Acc/binary, $">>};
diff --git a/test/gleam/string_test.gleam b/test/gleam/string_test.gleam
index c6b9540..e1e2fcd 100644
--- a/test/gleam/string_test.gleam
+++ b/test/gleam/string_test.gleam
@@ -1066,6 +1066,13 @@ pub fn inspect_erlang_atom_with_leading_digit_invalid_in_gleam_test() {
|> should.equal("atom.create_from_string(\"1Ok\")")
}
+@target(erlang)
+pub fn fifteen_bit_int_test() {
+ <<2, 3:size(7)>>
+ |> string.inspect
+ |> should.equal("<<2, 3:size(7)>>")
+}
+
pub fn byte_size_test() {
let assert 0 = string.byte_size("")
let assert 1 = string.byte_size("a")