aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Viney <richard.viney@gmail.com>2024-05-19 21:39:43 +1200
committerLouis Pilfold <louis@lpil.uk>2024-05-20 14:29:40 +0100
commit9610f1c05270ab88ea9209c16bea5ba1873a9aaa (patch)
tree92f8867834c8e359c25beb7221434ffb7a4606dc
parent6814f28bc59cc4efe0cf34eefc519209f1d8a9ec (diff)
downloadgleam_stdlib-9610f1c05270ab88ea9209c16bea5ba1873a9aaa.tar.gz
gleam_stdlib-9610f1c05270ab88ea9209c16bea5ba1873a9aaa.zip
Fix `bit_array` slices of slices on JavaScript
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/gleam_stdlib.mjs3
-rw-r--r--test/gleam/bit_array_test.gleam6
3 files changed, 9 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 34c5b3d..311380a 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 d921c63..256850a 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 bf38aae..7c4a5f4 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() {