From f89c424cfabd30e6170f9010bbd4fa53949e716e Mon Sep 17 00:00:00 2001 From: Richard Viney Date: Sun, 19 May 2024 21:39:43 +1200 Subject: [PATCH] Fix `bit_array` slices of slices on JavaScript --- CHANGELOG.md | 1 + src/gleam_stdlib.mjs | 3 ++- test/gleam/bit_array_test.gleam | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34c5b3d4..311380a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - Fixed `string.inspect` not formatting the `\f` form feed control character correctly on Erlang. - `dynamic.unsafe_coerce` function has been deprecated. +- Fixed `bit_array` slices of slices sometimes being incorrect on JavaScript. ## v0.37.0 - 2024-04-19 diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs index d921c63e..256850a4 100644 --- a/src/gleam_stdlib.mjs +++ b/src/gleam_stdlib.mjs @@ -362,7 +362,8 @@ export function bit_array_slice(bits, position, length) { const start = Math.min(position, position + length); const end = Math.max(position, position + length); if (start < 0 || end > bits.length) return new Error(Nil); - const buffer = new Uint8Array(bits.buffer.buffer, start, Math.abs(length)); + const byteOffset = bits.buffer.byteOffset + start; + const buffer = new Uint8Array(bits.buffer.buffer, byteOffset, Math.abs(length)); return new Ok(new BitArray(buffer)); } diff --git a/test/gleam/bit_array_test.gleam b/test/gleam/bit_array_test.gleam index bf38aae3..7c4a5f4d 100644 --- a/test/gleam/bit_array_test.gleam +++ b/test/gleam/bit_array_test.gleam @@ -1,4 +1,5 @@ import gleam/bit_array +import gleam/result import gleam/should pub fn byte_size_test() { @@ -88,6 +89,11 @@ pub fn slice_test() { bit_array.from_string("hello") |> bit_array.slice(1, 6) |> should.equal(Error(Nil)) + + bit_array.from_string("ab") + |> bit_array.slice(1, 1) + |> result.try(bit_array.slice(_, 0, 1)) + |> should.equal(Ok(<<"b":utf8>>)) } pub fn to_string_test() {