aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ffi.js20
-rw-r--r--src/gleam/javascript.gleam18
2 files changed, 38 insertions, 0 deletions
diff --git a/src/ffi.js b/src/ffi.js
index d3ee8ce..d7b6bf9 100644
--- a/src/ffi.js
+++ b/src/ffi.js
@@ -98,3 +98,23 @@ export function map_promise(promise, fn) {
export function rescue(promise, fn) {
return promise.catch((error) => fn(error));
}
+
+class Reference {
+ constructor(value) {
+ this.value = value;
+ }
+}
+
+export function dereference(reference) {
+ return reference.value;
+}
+
+export function make_reference(value) {
+ return new Reference(value);
+}
+
+export function set_reference(ref, value) {
+ let previous = ref.value;
+ ref.value = value;
+ return previous;
+}
diff --git a/src/gleam/javascript.gleam b/src/gleam/javascript.gleam
index 590dece..f4af2ed 100644
--- a/src/gleam/javascript.gleam
+++ b/src/gleam/javascript.gleam
@@ -17,3 +17,21 @@ pub external fn type_of(value) -> TypeOf =
pub external fn get_symbol(String) -> Symbol =
"../ffi.js" "get_symbol"
+
+pub external type Reference(value)
+
+pub external fn dereference(Reference(a)) -> a =
+ "../ffi.js" "dereference"
+
+pub external fn set_reference(Reference(a), a) -> a =
+ "../ffi.js" "set_reference"
+
+pub external fn make_reference(a) -> Reference(a) =
+ "../ffi.js" "make_reference"
+
+// returns the old value
+pub fn update_reference(ref: Reference(a), f: fn(a) -> a) -> a {
+ let value = dereference(ref)
+ set_reference(ref, f(value))
+ value
+}