aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortynanbe <contact@tynan.be>2022-02-28 06:05:50 -0600
committerLouis Pilfold <louis@lpil.uk>2022-03-06 15:11:13 +0000
commitd032bcb450777875c046d9950f45971e3a47d286 (patch)
tree635ceb92a4c7d48ff72eb1a360e879b1b823e1f8
parent2c9f014c1c6d185dd5d58a43f650441d57009af3 (diff)
downloadgleam_stdlib-d032bcb450777875c046d9950f45971e3a47d286.tar.gz
gleam_stdlib-d032bcb450777875c046d9950f45971e3a47d286.zip
Fix record-based map keys for JS
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/gleam_stdlib.mjs2
-rw-r--r--test/gleam/map_test.gleam21
3 files changed, 23 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bbf9e55..cb51916 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
## Unreleased
+- Fixed a bug where record-based map keys would clash in JavaScript.
- The `eunit` Erlang headers are no longer required to compile this package.
- Fixed a bug where the `string.length` function would cause a JavaScript error
for empty strings on older JavaScript runtimes.
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index a4afc1b..280cd95 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -279,7 +279,7 @@ class Map {
if (existing) {
return existing;
} else if (value instanceof Object) {
- let hashcode = JSON.stringify(value);
+ let hashcode = inspect(value);
HASHCODE_CACHE.set(value, hashcode);
return hashcode;
} else {
diff --git a/test/gleam/map_test.gleam b/test/gleam/map_test.gleam
index 95ed66b..17db0ac 100644
--- a/test/gleam/map_test.gleam
+++ b/test/gleam/map_test.gleam
@@ -46,6 +46,12 @@ pub fn new_test() {
|> should.equal([])
}
+type Key {
+ A
+ B
+ C
+}
+
pub fn get_test() {
let proplist = [#(4, 0), #(1, 1)]
let m = map.from_list(proplist)
@@ -61,6 +67,21 @@ pub fn get_test() {
m
|> map.get(2)
|> should.equal(Error(Nil))
+
+ let proplist = [#(A, 0), #(B, 1)]
+ let m = map.from_list(proplist)
+
+ m
+ |> map.get(A)
+ |> should.equal(Ok(0))
+
+ m
+ |> map.get(B)
+ |> should.equal(Ok(1))
+
+ m
+ |> map.get(C)
+ |> should.equal(Error(Nil))
}
pub fn insert_test() {