diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-08-29 15:03:14 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-08-29 15:03:14 +0100 |
commit | 0d558ccee2ce740a3f2dea694527a8d1d21980cb (patch) | |
tree | b6642a23e047ee98926a74d1ca04fcc96bf24490 | |
parent | 28e0d90719789349e64fd0900d12077929355a6d (diff) | |
download | javascript-0d558ccee2ce740a3f2dea694527a8d1d21980cb.tar.gz javascript-0d558ccee2ce740a3f2dea694527a8d1d21980cb.zip |
Arrays
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | CHANGELOG.md | 6 | ||||
-rw-r--r-- | bin/run-tests.js | 42 | ||||
-rw-r--r-- | bin/test.sh | 42 | ||||
-rw-r--r-- | package-lock.json | 24 | ||||
-rw-r--r-- | package.json | 3 | ||||
-rw-r--r-- | src/ffi.js | 12 | ||||
-rw-r--r-- | src/gleam/javascript/array.gleam | 10 | ||||
-rw-r--r-- | src/main.gleam | 3 | ||||
-rw-r--r-- | test/gleam/javascript/array_test.gleam | 19 | ||||
-rw-r--r-- | test/gleam/javascript_test.gleam | 0 |
11 files changed, 116 insertions, 48 deletions
@@ -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" } } @@ -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 |