From 6a93763be9a57e55f59a9b52617b75cc758ef74b Mon Sep 17 00:00:00 2001 From: Richard Viney Date: Wed, 31 Jan 2024 06:33:31 +1300 Subject: Remove base16 variant. Add support for partial bytes. --- src/gleam/bit_array.gleam | 71 ++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 34 deletions(-) (limited to 'src') 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 + + <> -> do_inspect_int(builder, x, ":size(1)") + <> -> do_inspect_int(builder, x, ":size(2)") + <> -> do_inspect_int(builder, x, ":size(3)") + <> -> do_inspect_int(builder, x, ":size(4)") + <> -> do_inspect_int(builder, x, ":size(5)") + <> -> do_inspect_int(builder, x, ":size(6)") + <> -> do_inspect_int(builder, x, ":size(7)") + + <> -> { + 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 { - <> -> [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) } -- cgit v1.2.3