diff --git a/incremental/demo-playground/package.json b/incremental/demo-playground/package.json index 2a01209b250619c1957be0abdf2b68c5fb521567..88d08a6072bbe07c5752f0c8fd8102dbc1de5c85 100644 --- a/incremental/demo-playground/package.json +++ b/incremental/demo-playground/package.json @@ -23,11 +23,14 @@ "compile:arkts:unmemoize": "ets-tsc -b tsconfig-unmemoize.json", "compile:arkts:unmemoized": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-run-unmemoized.json build/unmemoized/src/main.ts --output build/unmemoized/src/main.abc", "compile:arkts:unmemoizing": "npm run compile:unmemoize && npm run compile:arkts:unmemoized", + "annotate": "node ../tools/annotate ./src build/annotated/src '@koalaui/runtime'", + "compile:arkts:annotated": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-annotated.json build/annotated/src/main.ts --output build/annotated/src/main.abc", "panda:sdk:install": "cd ../tools/panda && npm run panda:sdk:install", "run": "npm run compile && node lib/js/app.js", "run:unmemoizing": "npm run compile:unmemoizing && node lib/unmemoized/js/app.js", "run:panda": "bash ../tools/panda/arkts/ark build/abc/src/main.abc --ark-boot-files $(find ../compat/build/abc ../common/build/abc/ ../runtime/build/abc/ -name '*.abc' | paste -sd ':' -) --ark-entry-point main.ETSGLOBAL::main", "run:panda:unmemoizing:linked": "bash ../tools/panda/arkts/ark build/unmemoized/src/main.abc --ark-boot-files ../runtime/build/incremental.abc --ark-entry-point @koalaui.demo.build.unmemoized.src.main.ETSGLOBAL::main", + "run:panda:annotated:linked": "bash ../tools/panda/arkts/ark build/annotated/src/main.abc --ark-boot-files ../runtime/build/annotated/incremental.abc --ark-entry-point @koalaui.demo.build.annotated.src.main.ETSGLOBAL::main", "run:panda:unmemoizing": "npm run compile:arkts:unmemoizing && npm run build:incremental:inc --prefix ../runtime && npm run run:panda:unmemoizing:linked", "clean:unmemoized": "rimraf unmemoized", "clean": "rimraf build unmemoized" diff --git a/incremental/runtime/package.json b/incremental/runtime/package.json index 16e37cdcde473b847037a98ee92a0bc3db7406ac..32d92a5f11656eefc6396efc2ee7e6e3d0009378 100644 --- a/incremental/runtime/package.json +++ b/incremental/runtime/package.json @@ -18,9 +18,11 @@ "panda:sdk:install": "cd ../tools/panda && npm run panda:sdk:install", "arkts:test:run": "bash ../tools/panda/arkts/ark build/runtime-tests.abc --ark-boot-files ../compat/build/compat.abc:../common/build/common.abc:../harness/build/harness.abc --ark-entry-point @koalaui.runtime-tests.test-arkts.tests.ETSGLOBAL::main", "arkts:test": "npm run panda:sdk:install && npm run build:compat && npm run build:common && npm run build:harness && npm run build:runtime:with:tests && npm run arkts:test:run", + "annotate": "node ../tools/annotate ./src build/annotated/src 'annotations'", "unmemoize": "mkdir -p build/unmemoized/abc && mkdir -p build/test/lib && ets-tsc -b tsconfig-unmemoize.json && mkdir -p build/test/lib", "unmemoize:with:tests": "npm run compile:all --prefix ../harness && mkdir -p build/unmemoized/abc && mkdir -p build/test/lib && ets-tsc -b tsconfig-unmemoize-with-tests.json && mkdir -p build/test/lib", "compile:arkts": "npm run unmemoize && ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-run-unmemoized.json", + "compile:arkts:annotated": "npx fast-arktsc --input-files ./arktsconfig-annotated.json --output-dir ./build/annotated/ --compiler ../tools/panda/arkts/arktsc --link-name runtime && PANDA_SDK_PATH=../tools/panda/node_modules/@panda/sdk ninja ${NINJA_OPTIONS} -f build/annotated/build.ninja", "build:compat": "npm run build:compat --prefix ../compat", "build:compat:inc": "npm run build:compat:inc --prefix ../compat", "build:common": "npm run build:common --prefix ../common", @@ -34,6 +36,7 @@ "build:incremental:components": "npm run build:compat && npm run build:common && npm run build:runtime", "build:incremental:components:inc": "npm run build:compat:inc && npm run build:common:inc && npm run build:runtime:inc", "link:incremental": "../tools/panda/arkts/arklink --output build/incremental.abc -- ../compat/build/compat.abc ../common/build/common.abc build/runtime.abc", + "link:annotated:incremental": "../tools/panda/arkts/arklink --output build/annotated/incremental.abc -- ../compat/build/compat.abc ../common/build/common.abc build/annotated/runtime.abc", "build:incremental": "npm run build:incremental:components && npm run link:incremental", "build:incremental:inc": "npm run build:incremental:components:inc && npm run link:incremental", "clean:incremental": "npm run clean" @@ -55,4 +58,4 @@ "mocha": "^9.2.2", "source-map-support": "^0.5.21" } -} \ No newline at end of file +} diff --git a/incremental/runtime/src/index.ts b/incremental/runtime/src/index.ts index 6c584c0f683009d091e4b849f80924a936cce073..40959ec5e15273a06b97c8562034a9b2a1165c53 100644 --- a/incremental/runtime/src/index.ts +++ b/incremental/runtime/src/index.ts @@ -93,7 +93,7 @@ export { contextNode, } from "./memo/node" export { - memo, + memoize, memoLifecycle, once, remember, @@ -162,3 +162,4 @@ export { PrimeNumbers } from "./tree/PrimeNumbers" export { ReadonlyTreeNode } from "./tree/ReadonlyTreeNode" export { TreeNode } from "./tree/TreeNode" export { TreePath } from "./tree/TreePath" + diff --git a/incremental/runtime/src/memo/remember.ts b/incremental/runtime/src/memo/remember.ts index 97bf91867ccf8ba2a78d14cd65f610cc436c8d1e..827f6a6f75876d83ecf8deb40c6cbebb79b324a8 100644 --- a/incremental/runtime/src/memo/remember.ts +++ b/incremental/runtime/src/memo/remember.ts @@ -30,7 +30,7 @@ import { ArrayState, ControlledScope, MutableState } from "../states/State" * @experimental */ /** @memo:intrinsic */ -export function memo(compute: () => Value): Value { +export function memoize(compute: () => Value): Value { const scope = __context().scope(__id()) return scope.unchanged ? scope.cached : scope.recache(compute()) } @@ -83,7 +83,7 @@ export function once(callback: () => void): void { * * @param compute - a function to compute cacheable result * @returns the last calculated value - * @see memo + * @see memoize */ /** @memo:intrinsic */ export function remember(compute: () => Value): Value { diff --git a/incremental/tools/annotate/package.json b/incremental/tools/annotate/package.json new file mode 100644 index 0000000000000000000000000000000000000000..a078de275318d6a95345ee6b599b590a84463486 --- /dev/null +++ b/incremental/tools/annotate/package.json @@ -0,0 +1,24 @@ +{ + "name": "@koalaui/annotate", + "version": "1.5.0+devel", + "description": "", + "main": "lib/annotate.js", + "bin": "lib/annotate.js", + "scripts": { + "clean": "rimraf out lib", + "compile": "npx tsc -p ." + }, + "keywords": [], + "dependencies": { + "commander": "^10.0.0", + "minimatch": "10.0.1" + }, + "devDependencies": { + "@types/node": "^18.0.0", + "typescript": "^4.9.5", + "webpack": "5.95.0", + "copy-webpack-plugin": "12.0.2", + "webpack-cli": "5.1.4", + "rimraf": "^6.0.1" + } +} diff --git a/incremental/tools/annotate/src/annotate.ts b/incremental/tools/annotate/src/annotate.ts new file mode 100644 index 0000000000000000000000000000000000000000..df3a4cbadaf58fa9e5de9b927c15a346fe8b6d31 --- /dev/null +++ b/incremental/tools/annotate/src/annotate.ts @@ -0,0 +1,59 @@ +import * as fs from 'fs' +import * as path from 'path' +import { text } from 'stream/consumers' + +export function main() { + + const inputDir = process.argv[2] + const outputDir = process.argv[3] + const memoImport = process.argv[4] ?? "@koalaui/runtime" + + console.log("input = ", inputDir) + console.log("output = ", outputDir) + + const readdirSyncRecursive: (dir: string) => string[] = (dir: string) => + fs.readdirSync(dir).reduce((files: string[], file: string) => { + const name = path.join(dir, file) + return fs.lstatSync(name).isDirectory() ? [...files, ...readdirSyncRecursive(name)] : [...files, name] + }, []) + + + const files = readdirSyncRecursive(inputDir) + .map(it => path.relative(inputDir, it)) + + fs.mkdirSync(outputDir, { recursive: true }) + + files.forEach(it => { + const inputFile = path.join(inputDir, it) + const outputFile = path.join(outputDir, it) + const text = fs.readFileSync(inputFile, 'utf8').toString() + const newText = convertMemo(text, memoImport) + console.log(inputFile, " -> ", outputFile) + fs.mkdirSync(path.dirname(outputFile), { recursive: true }) + fs.writeFileSync(outputFile, newText, 'utf8') + }) + + const annotations = ` +export @interface memo {} +export @interface memo_intrinsic {} +export @interface memo_entry {} +export @interface memo_stable {} +export @interface memo_skip {} +` + + fs.mkdirSync(path.join(outputDir, "annotations"), {recursive: true}) + fs.writeFileSync(path.join(outputDir, "annotations/index.ts"), annotations, 'utf8') +} + +function convertMemo(text: string, memoImport: string): string { + return `import { memo, memo_intrinsic, memo_entry, memo_stable, memo_skip } from "${memoImport}"\n` + + text + .replaceAll(/\/\*\* @memo \*\//g, "@memo") + .replaceAll(/\/\*\* @memo:interinsic \*\//g, "@memo_intrinsic") + .replaceAll(/\/\*\* @memo:stable \*\//g, "@memo_stable") + .replaceAll(/\/\*\* @memo:entry \*\//g, "@memo_entry") + .replaceAll(/\/\*\* @skip:memo \*\//g, "@memo_skip") +} + + +main() diff --git a/incremental/tools/annotate/test/test.ts b/incremental/tools/annotate/test/test.ts new file mode 100644 index 0000000000000000000000000000000000000000..5c5b8275922df9087157e95f5a286779aa77a629 --- /dev/null +++ b/incremental/tools/annotate/test/test.ts @@ -0,0 +1 @@ +/** @memo */ diff --git a/incremental/tools/annotate/tsconfig.json b/incremental/tools/annotate/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..3de03062e66b16503a1ca8639501e3de5ecae3da --- /dev/null +++ b/incremental/tools/annotate/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "esnext", + "lib": ["esnext"], + "module": "CommonJS", + "moduleResolution": "node", + "sourceMap": true, + "noEmitOnError": true, + "strict": true, + "removeComments": false, + "outDir": "lib", + "rootDir": "src" + }, + "include": ["./src"] +}