From 99ee0da8c12b449ed1e12128e64c7fe29b857680 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Mon, 6 Apr 2026 19:54:16 -0600 Subject: [PATCH] Adding applyModule! function --- src/runtime-js.ts | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/runtime-js.ts b/src/runtime-js.ts index 94bd6c4..6f0c505 100644 --- a/src/runtime-js.ts +++ b/src/runtime-js.ts @@ -169,6 +169,46 @@ export const _rt = { }); } }, + "applyModule!": (moduleName: string) => (code: string) => { + try { + const tokens = tokenize(code); + const parser = new Parser(tokens, code); + const { definitions: defs } = parser.parse(); + + // Find existing module defs + const existingNames = new Set( + [...definitions.values()] + .filter(d => d.module === moduleName) + .map(d => d.name) + ); + + // Apply new defs + const newNames = new Set(); + for (const def of defs) { + def.module = moduleName; + if (def.body) { + recompile(def.name, def.body); + definitions.set(def.name, def); + newNames.add(def.name); + } + } + + // Delete missing defs + for (const name of existingNames) { + if (!newNames.has(name)) { + delete store[name]; + definitions.delete(name); + } + } + + // Sync to disk + syncToFilesystem([...newNames][0] || moduleName); + + return { _tag: 'Defined', _0: moduleName }; + } catch (e: any) { + return { _tag: 'Err', _0: e.message }; + } + }, "saveModule!": (moduleName: string) => { const moduleDefs = [...definitions.values()] .filter(d => d.module === moduleName);