diff options
author | Peter Saxton <peterhsaxton@gmail.com> | 2023-08-12 16:25:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-12 15:25:16 +0100 |
commit | d5ba78077556b4d2554d31f8a190192a9a7100f4 (patch) | |
tree | 0b11fc82cadb6d31b5859506ef642995c8b057c8 | |
parent | 6cbbfcb60bde93682c3cb7289b92f3f9d0a3891c (diff) | |
download | javascript-d5ba78077556b4d2554d31f8a190192a9a7100f4.tar.gz javascript-d5ba78077556b4d2554d31f8a190192a9a7100f4.zip |
add ffi bindings for maps (#5)
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | src/ffi.mjs | 19 | ||||
-rw-r--r-- | src/gleam/javascript/map.gleam | 13 | ||||
-rw-r--r-- | test/gleam/javascript/map_test.gleam | 27 |
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)) +} |