From 4398f8989fb3daada7aba33ddb4c16d4ec1f5795 Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Tue, 11 Jan 2022 20:14:30 +0000 Subject: Latest Gleam --- gleam.toml | 5 +- manifest.toml | 6 +- src/ffi.js | 128 ------------------------------------- src/ffi.mjs | 128 +++++++++++++++++++++++++++++++++++++ src/gleam/javascript.gleam | 10 +-- src/gleam/javascript/array.gleam | 14 ++-- src/gleam/javascript/promise.gleam | 22 +++---- test/gleam_javascript_test.gleam | 5 ++ 8 files changed, 164 insertions(+), 154 deletions(-) delete mode 100644 src/ffi.js create mode 100644 src/ffi.mjs create mode 100644 test/gleam_javascript_test.gleam diff --git a/gleam.toml b/gleam.toml index 50955b6..9be28fd 100644 --- a/gleam.toml +++ b/gleam.toml @@ -3,6 +3,8 @@ version = "0.1.0" licences = ["Apache-2.0"] description = "Work with JavaScript types and values in Gleam" +target = "javascript" + repository = { type = "github", user = "gleam-lang", repo = "javascript" } links = [ { title = "Website", href = "https://gleam.run" }, @@ -10,6 +12,7 @@ links = [ ] [dependencies] -gleam_stdlib = "~> 0.18" +gleam_stdlib = "~> 0.19" [dev-dependencies] +gleeunit = "~> 0.6" diff --git a/manifest.toml b/manifest.toml index 017fbe5..bef7781 100644 --- a/manifest.toml +++ b/manifest.toml @@ -2,8 +2,10 @@ # You typically do not need to edit this file packages = [ - { name = "gleam_stdlib", version = "0.18.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "763ECD87D54D08755EE4C8551720D122FDCA47F61D1CA8AF23B19A90395A7468" }, + { name = "gleam_stdlib", version = "0.19.2", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "FFA79EA12369F122B68885E694E097D6810402A2F86BFF48AAE9E40ACE654F4C" }, + { name = "gleeunit", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "77701A5E5A565727E1EEAC9196FB878D544049B6331CD0305B5A69699135EA1C" }, ] [requirements] -gleam_stdlib = "~> 0.18" +gleam_stdlib = "~> 0.19" +gleeunit = "~> 0.6" diff --git a/src/ffi.js b/src/ffi.js deleted file mode 100644 index ded63ae..0000000 --- a/src/ffi.js +++ /dev/null @@ -1,128 +0,0 @@ -import { Ok, Error } from "./gleam.js"; -import { - UndefinedType, - ObjectType, - BooleanType, - NumberType, - BigIntType, - StringType, - SymbolType, - FunctionType, -} from "./gleam/javascript.js"; - -export function toArray(list) { - return list.toArray(); -} - -export function map(thing, fn) { - return thing.map(fn); -} - -export function length(thing) { - return thing.length; -} - -export function reduce(thing, acc, fn) { - return thing.reduce(fn, acc); -} - -export function reduceRight(thing, acc, fn) { - return thing.reduceRight(fn, acc); -} - -export function index(thing, index) { - return index in thing ? new Ok(thing[index]) : new Error(undefined); -} - -export function object_from_entries(entries) { - return Object.fromEntries(entries); -} - -export function type_of(value) { - switch (typeof value) { - case "undefined": - return new UndefinedType(); - case "object": - return new ObjectType(); - case "boolean": - return new BooleanType(); - case "number": - return new NumberType(); - case "bigint": - return new BigIntType(); - case "string": - return new StringType(); - case "symbol": - return new SymbolType(); - case "function": - return new FunctionType(); - default: - throw new globalThis.Error(`Unexpected typeof ${typeof value}`); - } -} - -export function get_symbol(name) { - return Symbol.for(name); -} - -// A wrapper around a promise to prevent `Promise>` collapsing into -// `Promise`. -class PromiseLayer { - constructor(promise) { - this.promise = promise; - } - - static wrap(value) { - return value instanceof Promise ? new PromiseLayer(value) : value; - } - - static unwrap(value) { - return value instanceof PromiseLayer ? value.promise : value; - } -} - -export function resolve(value) { - return Promise.resolve(PromiseLayer.wrap(value)); -} - -export function then(promise, fn) { - return promise.then((value) => fn(PromiseLayer.unwrap(value))); -} - -export function map_promise(promise, fn) { - return promise.then((value) => - PromiseLayer.wrap(fn(PromiseLayer.unwrap(value))) - ); -} - -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; -} - -export function all_promises(...promises) { - if (promises.length === 1) { - return Promise.all(promises[0]); - } else { - return Promise.all(promises); - } -} diff --git a/src/ffi.mjs b/src/ffi.mjs new file mode 100644 index 0000000..4aa6995 --- /dev/null +++ b/src/ffi.mjs @@ -0,0 +1,128 @@ +import { Ok, Error } from "./gleam.mjs"; +import { + UndefinedType, + ObjectType, + BooleanType, + NumberType, + BigIntType, + StringType, + SymbolType, + FunctionType, +} from "./gleam/javascript.mjs"; + +export function toArray(list) { + return list.toArray(); +} + +export function map(thing, fn) { + return thing.map(fn); +} + +export function length(thing) { + return thing.length; +} + +export function reduce(thing, acc, fn) { + return thing.reduce(fn, acc); +} + +export function reduceRight(thing, acc, fn) { + return thing.reduceRight(fn, acc); +} + +export function index(thing, index) { + return index in thing ? new Ok(thing[index]) : new Error(undefined); +} + +export function object_from_entries(entries) { + return Object.fromEntries(entries); +} + +export function type_of(value) { + switch (typeof value) { + case "undefined": + return new UndefinedType(); + case "object": + return new ObjectType(); + case "boolean": + return new BooleanType(); + case "number": + return new NumberType(); + case "bigint": + return new BigIntType(); + case "string": + return new StringType(); + case "symbol": + return new SymbolType(); + case "function": + return new FunctionType(); + default: + throw new globalThis.Error(`Unexpected typeof ${typeof value}`); + } +} + +export function get_symbol(name) { + return Symbol.for(name); +} + +// A wrapper around a promise to prevent `Promise>` collapsing into +// `Promise`. +class PromiseLayer { + constructor(promise) { + this.promise = promise; + } + + static wrap(value) { + return value instanceof Promise ? new PromiseLayer(value) : value; + } + + static unwrap(value) { + return value instanceof PromiseLayer ? value.promise : value; + } +} + +export function resolve(value) { + return Promise.resolve(PromiseLayer.wrap(value)); +} + +export function then(promise, fn) { + return promise.then((value) => fn(PromiseLayer.unwrap(value))); +} + +export function map_promise(promise, fn) { + return promise.then((value) => + PromiseLayer.wrap(fn(PromiseLayer.unwrap(value))) + ); +} + +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; +} + +export function all_promises(...promises) { + if (promises.length === 1) { + return Promise.all(promises[0]); + } else { + return Promise.all(promises); + } +} diff --git a/src/gleam/javascript.gleam b/src/gleam/javascript.gleam index f4af2ed..c7efddb 100644 --- a/src/gleam/javascript.gleam +++ b/src/gleam/javascript.gleam @@ -13,21 +13,21 @@ pub type TypeOf { pub external type Symbol pub external fn type_of(value) -> TypeOf = - "../ffi.js" "type_of" + "../ffi.mjs" "type_of" pub external fn get_symbol(String) -> Symbol = - "../ffi.js" "get_symbol" + "../ffi.mjs" "get_symbol" pub external type Reference(value) pub external fn dereference(Reference(a)) -> a = - "../ffi.js" "dereference" + "../ffi.mjs" "dereference" pub external fn set_reference(Reference(a), a) -> a = - "../ffi.js" "set_reference" + "../ffi.mjs" "set_reference" pub external fn make_reference(a) -> Reference(a) = - "../ffi.js" "make_reference" + "../ffi.mjs" "make_reference" // returns the old value pub fn update_reference(ref: Reference(a), f: fn(a) -> a) -> a { diff --git a/src/gleam/javascript/array.gleam b/src/gleam/javascript/array.gleam index 4b59b85..9718fc8 100644 --- a/src/gleam/javascript/array.gleam +++ b/src/gleam/javascript/array.gleam @@ -3,22 +3,22 @@ pub external type Array(element) pub external fn to_list(Array(element)) -> List(element) = - "../../gleam.js" "toList" + "../../gleam.mjs" "toList" pub external fn from_list(List(element)) -> Array(element) = - "../../ffi.js" "toArray" + "../../ffi.mjs" "toArray" pub external fn length(Array(element)) -> Int = - "../../ffi.js" "length" + "../../ffi.mjs" "length" pub external fn map(Array(a), fn(a) -> b) -> Array(b) = - "../../ffi.js" "map" + "../../ffi.mjs" "map" pub external fn fold(Array(e), a, fn(a, e) -> a) -> a = - "../../ffi.js" "reduce" + "../../ffi.mjs" "reduce" pub external fn fold_right(Array(e), a, fn(a, e) -> a) -> a = - "../../ffi.js" "reduceRight" + "../../ffi.mjs" "reduceRight" pub external fn get(Array(e), Int) -> Result(e, Nil) = - "../../ffi.js" "index" + "../../ffi.mjs" "index" diff --git a/src/gleam/javascript/promise.gleam b/src/gleam/javascript/promise.gleam index bdd3211..8f90022 100644 --- a/src/gleam/javascript/promise.gleam +++ b/src/gleam/javascript/promise.gleam @@ -6,16 +6,16 @@ import gleam/javascript/array.{Array} pub external type Promise(value) pub external fn resolve(value) -> Promise(value) = - "../../ffi.js" "resolve" + "../../ffi.mjs" "resolve" pub external fn rescue(Promise(value), fn(Dynamic) -> value) -> Promise(value) = - "../../ffi.js" "rescue" + "../../ffi.mjs" "rescue" pub external fn then(Promise(a), fn(a) -> Promise(b)) -> Promise(b) = - "../../ffi.js" "then" + "../../ffi.mjs" "then" pub external fn map(Promise(a), fn(a) -> b) -> Promise(b) = - "../../ffi.js" "map_promise" + "../../ffi.mjs" "map_promise" pub fn tap(promise: Promise(a), callback: fn(a) -> b) -> Promise(a) { promise @@ -52,14 +52,14 @@ pub fn then_try( } pub external fn await2(Promise(a), Promise(b)) -> Promise(#(a, b)) = - "../../ffi.js" "all_promises" + "../../ffi.mjs" "all_promises" pub external fn await3( Promise(a), Promise(b), Promise(c), ) -> Promise(#(a, b, c)) = - "../../ffi.js" "all_promises" + "../../ffi.mjs" "all_promises" pub external fn await4( Promise(a), @@ -67,7 +67,7 @@ pub external fn await4( Promise(c), Promise(d), ) -> Promise(#(a, b, c, d)) = - "../../ffi.js" "all_promises" + "../../ffi.mjs" "all_promises" pub external fn await5( Promise(a), @@ -76,7 +76,7 @@ pub external fn await5( Promise(d), Promise(e), ) -> Promise(#(a, b, c, d, e)) = - "../../ffi.js" "all_promises" + "../../ffi.mjs" "all_promises" pub external fn await6( Promise(a), @@ -86,10 +86,10 @@ pub external fn await6( Promise(e), Promise(f), ) -> Promise(#(a, b, c, d, e, f)) = - "../../ffi.js" "all_promises" + "../../ffi.mjs" "all_promises" pub external fn await_array(Array(Promise(a))) -> Promise(Array(a)) = - "../../ffi.js" "all_promises" + "../../ffi.mjs" "all_promises" pub fn await_list(xs: List(Promise(a))) -> Promise(List(a)) { xs @@ -98,4 +98,4 @@ pub fn await_list(xs: List(Promise(a))) -> Promise(List(a)) { } pub external fn do_await_list(List(Promise(a))) -> Promise(Array(a)) = - "../../ffi.js" "all_promises" + "../../ffi.mjs" "all_promises" diff --git a/test/gleam_javascript_test.gleam b/test/gleam_javascript_test.gleam new file mode 100644 index 0000000..ecd12ad --- /dev/null +++ b/test/gleam_javascript_test.gleam @@ -0,0 +1,5 @@ +import gleeunit + +pub fn main() { + gleeunit.main() +} -- cgit v1.2.3