Adding applyModule! function
This commit is contained in:
parent
b4372b69fa
commit
99ee0da8c1
1 changed files with 40 additions and 0 deletions
|
|
@ -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<string>();
|
||||||
|
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) => {
|
"saveModule!": (moduleName: string) => {
|
||||||
const moduleDefs = [...definitions.values()]
|
const moduleDefs = [...definitions.values()]
|
||||||
.filter(d => d.module === moduleName);
|
.filter(d => d.module === moduleName);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue