aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/ffi.mjs19
-rw-r--r--src/gleam/javascript/map.gleam13
-rw-r--r--test/gleam/javascript/map_test.gleam27
4 files changed, 60 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0f1843c..57ea02a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# Changelog
+- Add `map` module native JavaScript maps.
- `promise.new` is added to enable creating promises with a delayed resolve.
## v0.5.0 - 2023-01-19
diff --git a/src/ffi.mjs b/src/ffi.mjs
index 4d76d2d..6f667c0 100644
--- a/src/ffi.mjs
+++ b/src/ffi.mjs
@@ -134,3 +134,22 @@ export function all_promises(...promises) {
return Promise.all(promises);
}
}
+
+export function map_new() {
+ return new Map();
+}
+
+export function map_set(map, key, value) {
+ return map.set(key, value);
+}
+
+export function map_get(map, key) {
+ if (map.has(key)) {
+ return new Ok(map.get(key));
+ }
+ return new Error(undefined);
+}
+
+export function map_size(map) {
+ return map.size;
+}
diff --git a/src/gleam/javascript/map.gleam b/src/gleam/javascript/map.gleam
new file mode 100644
index 0000000..a2fa282
--- /dev/null
+++ b/src/gleam/javascript/map.gleam
@@ -0,0 +1,13 @@
+pub type Map(key, value)
+
+@external(javascript, "../../ffi.mjs", "map_new")
+pub fn new() -> Map(key, value)
+
+@external(javascript, "../../ffi.mjs", "map_set")
+pub fn set(a: Map(key, value), b: key, c: value) -> Map(key, value)
+
+@external(javascript, "../../ffi.mjs", "map_get")
+pub fn get(a: Map(key, value), b: key) -> Result(value, Nil)
+
+@external(javascript, "../../ffi.mjs", "map_size")
+pub fn size(a: Map(key, value)) -> Int
diff --git a/test/gleam/javascript/map_test.gleam b/test/gleam/javascript/map_test.gleam
new file mode 100644
index 0000000..9620bff
--- /dev/null
+++ b/test/gleam/javascript/map_test.gleam
@@ -0,0 +1,27 @@
+import gleam/javascript/map
+import gleeunit/should
+
+pub fn map_size_test() {
+ let m = map.new()
+ should.equal(map.size(m), 0)
+
+ map.set(m, "a", 1)
+ should.equal(map.size(m), 1)
+
+ map.set(m, "b", 1)
+ should.equal(map.size(m), 2)
+
+ map.set(m, "b", 10)
+ should.equal(map.size(m), 2)
+}
+
+pub fn map_retrieve_test() {
+ let m = map.new()
+ should.equal(map.get(m, "a"), Error(Nil))
+
+ map.set(m, "a", 1)
+ should.equal(map.get(m, "a"), Ok(1))
+
+ map.set(m, "a", 2)
+ should.equal(map.get(m, "a"), Ok(2))
+}