aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/bit_array.gleam71
-rw-r--r--test/gleam/bit_array_test.gleam14
2 files changed, 43 insertions, 42 deletions
diff --git a/src/gleam/bit_array.gleam b/src/gleam/bit_array.gleam
index 2f8a07e..97c33b9 100644
--- a/src/gleam/bit_array.gleam
+++ b/src/gleam/bit_array.gleam
@@ -2,6 +2,7 @@
import gleam/int
import gleam/string
+import gleam/string_builder.{type StringBuilder}
/// Converts a UTF-8 `String` type into a `BitArray`.
///
@@ -164,46 +165,48 @@ pub fn base16_decode(input: String) -> Result(BitArray, Nil)
/// ```gleam
/// inspect(<<0, 20, 0x20, 255>>)
/// // -> "<<0, 20, 32, 255>>"
+///
+/// inspect(<<100, 5:3>>)
+/// // -> "<<100, 5:size(3)>>"
/// ```
///
pub fn inspect(input: BitArray) -> String {
- "<<"
- <> input
- |> do_inspect(int.to_string)
- |> string.join(", ")
- <> ">>"
+ string_builder.new()
+ |> string_builder.append("<<")
+ |> do_inspect(input)
+ |> string_builder.append(">>")
+ |> string_builder.to_string
}
-/// Converts a bit array to a string containing the hexadecimal value of each
-/// byte.
-///
-/// ## Examples
-///
-/// ```gleam
-/// inspect(<<0, 20, 0x20, 255>>)
-/// // -> "<<00 14 20 FF>>"
-/// ```
-///
-pub fn inspect_base16(input: BitArray) -> String {
- let byte_to_hex_string = fn(b) {
- b
- |> int.to_base16
- |> string.pad_left(2, "0")
+fn do_inspect(builder: StringBuilder, input: BitArray) -> StringBuilder {
+ case input {
+ <<>> -> builder
+
+ <<x:size(1)>> -> do_inspect_int(builder, x, ":size(1)")
+ <<x:size(2)>> -> do_inspect_int(builder, x, ":size(2)")
+ <<x:size(3)>> -> do_inspect_int(builder, x, ":size(3)")
+ <<x:size(4)>> -> do_inspect_int(builder, x, ":size(4)")
+ <<x:size(5)>> -> do_inspect_int(builder, x, ":size(5)")
+ <<x:size(6)>> -> do_inspect_int(builder, x, ":size(6)")
+ <<x:size(7)>> -> do_inspect_int(builder, x, ":size(7)")
+
+ <<x, rest:bits>> -> {
+ let suffix = case rest {
+ <<>> -> ""
+ _ -> ", "
+ }
+
+ builder
+ |> do_inspect_int(x, suffix)
+ |> do_inspect(rest)
+ }
+
+ _ -> builder
}
-
- "<<"
- <> input
- |> do_inspect(byte_to_hex_string)
- |> string.join(" ")
- <> ">>"
}
-fn do_inspect(
- input: BitArray,
- byte_to_string: fn(Int) -> String,
-) -> List(String) {
- case input {
- <<b, rest:bytes>> -> [byte_to_string(b), ..do_inspect(rest, byte_to_string)]
- _ -> []
- }
+fn do_inspect_int(builder: StringBuilder, value: Int, suffix: String) {
+ builder
+ |> string_builder.append(int.to_string(value))
+ |> string_builder.append(suffix)
}
diff --git a/test/gleam/bit_array_test.gleam b/test/gleam/bit_array_test.gleam
index ca94f1a..f12f57a 100644
--- a/test/gleam/bit_array_test.gleam
+++ b/test/gleam/bit_array_test.gleam
@@ -289,15 +289,13 @@ pub fn inspect_test() {
bit_array.inspect(<<0, 20, 0x20, 255>>)
|> should.equal("<<0, 20, 32, 255>>")
-}
-pub fn inspect_base16_test() {
- bit_array.inspect_base16(<<>>)
- |> should.equal("<<>>")
+ bit_array.inspect(<<4:5>>)
+ |> should.equal("<<4:size(5)>>")
- bit_array.inspect_base16(<<0x80>>)
- |> should.equal("<<80>>")
+ bit_array.inspect(<<100, 5:3>>)
+ |> should.equal("<<100, 5:size(3)>>")
- bit_array.inspect_base16(<<0, 20, 0x20, 255>>)
- |> should.equal("<<00 14 20 FF>>")
+ bit_array.inspect(<<5:3, 11:4, 1:2>>)
+ |> should.equal("<<182, 1:size(1)>>")
}