diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-08-29 18:44:55 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-08-29 18:44:55 +0100 |
commit | e57c18156cf11aaeae89e66828811c9fcc42fa81 (patch) | |
tree | 4a5ceb7226481ed676f39e325bb359bcf98482ea /src | |
parent | 30e5e540ab4edf6582ae77f9440044e22d6d197e (diff) | |
download | javascript-e57c18156cf11aaeae89e66828811c9fcc42fa81.tar.gz javascript-e57c18156cf11aaeae89e66828811c9fcc42fa81.zip |
Mutable references
Diffstat (limited to 'src')
-rw-r--r-- | src/ffi.js | 20 | ||||
-rw-r--r-- | src/gleam/javascript.gleam | 18 |
2 files changed, 38 insertions, 0 deletions
@@ -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 +} |