|
2 | 2 |
|
3 | 3 | import gleam/int |
4 | 4 | import gleam/string |
| 5 | +import gleam/string_builder.{type StringBuilder} |
5 | 6 |
|
6 | 7 | /// Converts a UTF-8 `String` type into a `BitArray`. |
7 | 8 | /// |
@@ -164,46 +165,48 @@ pub fn base16_decode(input: String) -> Result(BitArray, Nil) |
164 | 165 | /// ```gleam |
165 | 166 | /// inspect(<<0, 20, 0x20, 255>>) |
166 | 167 | /// // -> "<<0, 20, 32, 255>>" |
| 168 | +/// |
| 169 | +/// inspect(<<100, 5:3>>) |
| 170 | +/// // -> "<<100, 5:size(3)>>" |
167 | 171 | /// ``` |
168 | 172 | /// |
169 | 173 | pub fn inspect(input: BitArray) -> String { |
170 | | - "<<" |
171 | | - <> input |
172 | | - |> do_inspect(int.to_string) |
173 | | - |> string.join(", ") |
174 | | - <> ">>" |
| 174 | + string_builder.new() |
| 175 | + |> string_builder.append("<<") |
| 176 | + |> do_inspect(input) |
| 177 | + |> string_builder.append(">>") |
| 178 | + |> string_builder.to_string |
175 | 179 | } |
176 | 180 |
|
177 | | -/// Converts a bit array to a string containing the hexadecimal value of each |
178 | | -/// byte. |
179 | | -/// |
180 | | -/// ## Examples |
181 | | -/// |
182 | | -/// ```gleam |
183 | | -/// inspect(<<0, 20, 0x20, 255>>) |
184 | | -/// // -> "<<00 14 20 FF>>" |
185 | | -/// ``` |
186 | | -/// |
187 | | -pub fn inspect_base16(input: BitArray) -> String { |
188 | | - let byte_to_hex_string = fn(b) { |
189 | | - b |
190 | | - |> int.to_base16 |
191 | | - |> string.pad_left(2, "0") |
| 181 | +fn do_inspect(builder: StringBuilder, input: BitArray) -> StringBuilder { |
| 182 | + case input { |
| 183 | + <<>> -> builder |
| 184 | + |
| 185 | + <<x:size(1)>> -> do_inspect_int(builder, x, ":size(1)") |
| 186 | + <<x:size(2)>> -> do_inspect_int(builder, x, ":size(2)") |
| 187 | + <<x:size(3)>> -> do_inspect_int(builder, x, ":size(3)") |
| 188 | + <<x:size(4)>> -> do_inspect_int(builder, x, ":size(4)") |
| 189 | + <<x:size(5)>> -> do_inspect_int(builder, x, ":size(5)") |
| 190 | + <<x:size(6)>> -> do_inspect_int(builder, x, ":size(6)") |
| 191 | + <<x:size(7)>> -> do_inspect_int(builder, x, ":size(7)") |
| 192 | + |
| 193 | + <<x, rest:bits>> -> { |
| 194 | + let suffix = case rest { |
| 195 | + <<>> -> "" |
| 196 | + _ -> ", " |
| 197 | + } |
| 198 | + |
| 199 | + builder |
| 200 | + |> do_inspect_int(x, suffix) |
| 201 | + |> do_inspect(rest) |
| 202 | + } |
| 203 | + |
| 204 | + _ -> builder |
192 | 205 | } |
193 | | - |
194 | | - "<<" |
195 | | - <> input |
196 | | - |> do_inspect(byte_to_hex_string) |
197 | | - |> string.join(" ") |
198 | | - <> ">>" |
199 | 206 | } |
200 | 207 |
|
201 | | -fn do_inspect( |
202 | | - input: BitArray, |
203 | | - byte_to_string: fn(Int) -> String, |
204 | | -) -> List(String) { |
205 | | - case input { |
206 | | - <<b, rest:bytes>> -> [byte_to_string(b), ..do_inspect(rest, byte_to_string)] |
207 | | - _ -> [] |
208 | | - } |
| 208 | +fn do_inspect_int(builder: StringBuilder, value: Int, suffix: String) { |
| 209 | + builder |
| 210 | + |> string_builder.append(int.to_string(value)) |
| 211 | + |> string_builder.append(suffix) |
209 | 212 | } |
0 commit comments