aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2021-08-29 15:03:14 +0100
committerLouis Pilfold <louis@lpil.uk>2021-08-29 15:03:14 +0100
commit0d558ccee2ce740a3f2dea694527a8d1d21980cb (patch)
treeb6642a23e047ee98926a74d1ca04fcc96bf24490
parent28e0d90719789349e64fd0900d12077929355a6d (diff)
downloadjavascript-0d558ccee2ce740a3f2dea694527a8d1d21980cb.tar.gz
javascript-0d558ccee2ce740a3f2dea694527a8d1d21980cb.zip
Arrays
-rw-r--r--.gitignore3
-rw-r--r--CHANGELOG.md6
-rw-r--r--bin/run-tests.js42
-rw-r--r--bin/test.sh42
-rw-r--r--package-lock.json24
-rw-r--r--package.json3
-rw-r--r--src/ffi.js12
-rw-r--r--src/gleam/javascript/array.gleam10
-rw-r--r--src/main.gleam3
-rw-r--r--test/gleam/javascript/array_test.gleam19
-rw-r--r--test/gleam/javascript_test.gleam0
11 files changed, 116 insertions, 48 deletions
diff --git a/.gitignore b/.gitignore
index a60093f..1727b50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,2 @@
-out
-lib
+_build
node_modules
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..af4285a
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,6 @@
+# Changelog
+
+## Unreleased
+
+- The `array` module was created with the `Array(element)` type and `to_list`,
+ `from_list` and `length` functions.
diff --git a/bin/run-tests.js b/bin/run-tests.js
index b8ab5d0..afbd7ec 100644
--- a/bin/run-tests.js
+++ b/bin/run-tests.js
@@ -1,18 +1,7 @@
-import { readdir } from "fs/promises";
-import { resolve, relative, basename } from "path";
+import { readdir, stat } from "fs/promises";
+import { resolve, relative } from "path";
-const dir = "node_modules/gleam_javascript";
-
-async function getFiles(dir) {
- const dirents = await readdir(dir, { withFileTypes: true });
- const files = await Promise.all(
- dirents.map((dirent) => {
- const res = resolve(dir, dirent.name);
- return dirent.isDirectory() ? getFiles(res) : res;
- })
- );
- return Array.prototype.concat(...files);
-}
+const dir = "_build/lib/gleam_javascript";
async function main() {
console.log("Running tests...");
@@ -20,18 +9,19 @@ async function main() {
let passes = 0;
let failures = 0;
- for (let path of await getFiles(dir)) {
+ for await (let path of await getFiles(dir)) {
if (!path.endsWith("_test.js")) continue;
- process.stdout.write("\n" + relative(dir, path).slice(0, -3) + ":\n ");
let module = await import(path);
- for (let fnName of Object.keys(module)) {
+
+ for await (let fnName of Object.keys(module)) {
if (!fnName.endsWith("_test")) continue;
try {
- module[fnName]();
- process.stdout.write("✨");
+ await module[fnName]();
+ process.stdout.write(`\u001b[32m.\u001b[0m`);
passes++;
} catch (error) {
- process.stdout.write(`❌ ${fnName}: ${error}\n `);
+ let moduleName = "\n" + relative(dir, path).slice(0, -3);
+ process.stdout.write(`\n❌ ${moduleName}.${fnName}: ${error}\n`);
failures++;
}
}
@@ -40,9 +30,19 @@ async function main() {
console.log(`
${passes + failures} tests
-${passes} passes
${failures} failures`);
process.exit(failures ? 1 : 0);
}
+async function getFiles(dir) {
+ const subdirs = await readdir(dir);
+ const files = await Promise.all(
+ subdirs.map(async (subdir) => {
+ const res = resolve(dir, subdir);
+ return (await stat(res)).isDirectory() ? getFiles(res) : res;
+ })
+ );
+ return files.reduce((a, f) => a.concat(f), []);
+}
+
main();
diff --git a/bin/test.sh b/bin/test.sh
index d5c28b1..dbf6fa2 100644
--- a/bin/test.sh
+++ b/bin/test.sh
@@ -2,11 +2,11 @@
set -eu
library_dir() {
- echo "lib/$1"
+ echo "_build/deps/$1"
}
-library_out_dir() {
- echo "node_modules/$1"
+project_dir() {
+ echo "_build/lib/$1"
}
clone_dep() {
@@ -15,7 +15,7 @@ clone_dep() {
local url="$3"
if [ ! -d "$dir" ] ; then
- mkdir -p lib
+ mkdir -p "$dir"
git clone --depth=1 --branch="$tag" "$url" "$dir"
fi
}
@@ -27,36 +27,36 @@ compile_library() {
shift
local lib_flags=()
for dep in "$@"; do
- lib_flags+=("--lib=$(library_out_dir $dep)")
+ lib_flags+=("--lib=$(project_dir $dep)")
done
local dir=$(library_dir "$name")
local src="$dir/src"
- local test="$dir/test"
- local out=$(library_out_dir "$name")
- rm -rf out
-
- gleam compile-package \
- --name "$name" \
- --target javascript \
- --src "$src" \
- --out $(library_out_dir "$name") \
- "${lib_flags[@]: }"
-
- cp "$src/"*.js "$out/"
+ local out=$(project_dir "$name")
+
+
+ if [ ! -d "$out" ] ; then
+ gleam compile-package \
+ --name "$name" \
+ --target javascript \
+ --src "$src" \
+ --out $(project_dir "$name") \
+ "${lib_flags[@]: }"
+ cp "$src/"*.js "$out/"
+ fi
}
clone_dep gleam_stdlib main https://github.com/gleam-lang/stdlib.git
compile_library gleam_stdlib
-rm -rf node_modules/gleam_javascript
+rm -rf $(project_dir gleam_javascript)
gleam compile-package \
--name gleam_javascript \
--target javascript \
--src src \
--test test \
- --out node_modules/gleam_javascript \
- --lib node_modules/gleam_stdlib
-cp "src/"*.js "node_modules/gleam_javascript/"
+ --out $(project_dir gleam_javascript) \
+ --lib $(project_dir gleam_stdlib)
+cp "src/"*.js $(project_dir gleam_javascript)/
node bin/run-tests.js
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..49b1683
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,24 @@
+{
+ "name": "javascript",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "gleam-packages": "file:./_build/lib"
+ }
+ },
+ "_build/lib": {
+ "dev": true
+ },
+ "node_modules/gleam-packages": {
+ "resolved": "_build/lib",
+ "link": true
+ }
+ },
+ "dependencies": {
+ "gleam-packages": {
+ "version": "file:_build/lib"
+ }
+ }
+}
diff --git a/package.json b/package.json
index d7d3212..5008aef 100644
--- a/package.json
+++ b/package.json
@@ -2,5 +2,8 @@
"type": "module",
"scripts": {
"test": "bash bin/test.sh"
+ },
+ "devDependencies": {
+ "gleam-packages": "file:./_build/lib"
}
}
diff --git a/src/ffi.js b/src/ffi.js
index cb0ff5c..06303fc 100644
--- a/src/ffi.js
+++ b/src/ffi.js
@@ -1 +1,11 @@
-export {};
+export function toArray(list) {
+ return list.toArray();
+}
+
+export function map(thing, fn) {
+ return thing.map(fn);
+}
+
+export function length(thing) {
+ return thing.length;
+}
diff --git a/src/gleam/javascript/array.gleam b/src/gleam/javascript/array.gleam
new file mode 100644
index 0000000..b2e5992
--- /dev/null
+++ b/src/gleam/javascript/array.gleam
@@ -0,0 +1,10 @@
+pub external type Array(element)
+
+pub external fn to_list(Array(element)) -> List(element) =
+ "../../gleam.js" "toList"
+
+pub external fn from_list(List(element)) -> Array(element) =
+ "../../ffi.js" "toArray"
+
+pub external fn length(Array(element)) -> Int =
+ "../../ffi.js" "length"
diff --git a/src/main.gleam b/src/main.gleam
deleted file mode 100644
index 69d3bea..0000000
--- a/src/main.gleam
+++ /dev/null
@@ -1,3 +0,0 @@
-pub fn yo() {
- "yo"
-}
diff --git a/test/gleam/javascript/array_test.gleam b/test/gleam/javascript/array_test.gleam
index e69de29..2f5e627 100644
--- a/test/gleam/javascript/array_test.gleam
+++ b/test/gleam/javascript/array_test.gleam
@@ -0,0 +1,19 @@
+import gleam/javascript/array
+
+pub fn to_and_from_list_test() {
+ assert [] =
+ []
+ |> array.from_list
+ |> array.to_list
+
+ assert [1, 2, 3] =
+ [1, 2, 3]
+ |> array.from_list
+ |> array.to_list
+}
+
+pub fn length_test() {
+ assert 0 =
+ array.from_list([])
+ |> array.length
+}
diff --git a/test/gleam/javascript_test.gleam b/test/gleam/javascript_test.gleam
deleted file mode 100644
index e69de29..0000000
--- a/test/gleam/javascript_test.gleam
+++ /dev/null