|
|
|
@ -187,7 +187,7 @@ export function runApp(app: App, canvas: HTMLCanvasElement, source: string, env:
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const callEnv = new Map(app.view.env);
|
|
|
|
const callEnv = new Map(env);
|
|
|
|
callEnv.set(app.view.params[0], state);
|
|
|
|
callEnv.set(app.view.params[0], state);
|
|
|
|
callEnv.set(app.view.params[1], viewport);
|
|
|
|
callEnv.set(app.view.params[1], viewport);
|
|
|
|
const uiValue = evaluate(app.view.body, callEnv, source);
|
|
|
|
const uiValue = evaluate(app.view.body, callEnv, source);
|
|
|
|
@ -223,13 +223,25 @@ export function runApp(app: App, canvas: HTMLCanvasElement, source: string, env:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (event.kind === 'constructor' && event.name === 'Rebind') {
|
|
|
|
if (event.kind === 'constructor' && event.name === 'Rebind') {
|
|
|
|
if (event.args.length === 2 && event.args[0].kind === 'string') {
|
|
|
|
if (event.args[0].kind !== 'string') return;
|
|
|
|
const name = event.args[0].value;
|
|
|
|
const name = event.args[0].value;
|
|
|
|
const value = event.args[1];
|
|
|
|
|
|
|
|
env.set(name, value);
|
|
|
|
if (event.args.length === 2) {
|
|
|
|
rerender();
|
|
|
|
// Rebind "name" value
|
|
|
|
return;
|
|
|
|
env.set(name, event.args[1]);
|
|
|
|
|
|
|
|
} else if (event.args.length === 3 && event.args[1].kind === 'list') {
|
|
|
|
|
|
|
|
// Rebind "name" ["path"]
|
|
|
|
|
|
|
|
const pathList = (event.args[1] as { elements: Value[] });
|
|
|
|
|
|
|
|
const path = pathList.elements.map((e: Value) => e.kind === 'string' ? e.value : '');
|
|
|
|
|
|
|
|
const currentValue = env.get(name);
|
|
|
|
|
|
|
|
if (currentValue) {
|
|
|
|
|
|
|
|
const newValue = updatePath(currentValue, path, event.args[2]);
|
|
|
|
|
|
|
|
env.set(name, newValue);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rerender();
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (app.update.kind !== 'closure')
|
|
|
|
if (app.update.kind !== 'closure')
|
|
|
|
@ -321,3 +333,19 @@ export function runApp(app: App, canvas: HTMLCanvasElement, source: string, env:
|
|
|
|
|
|
|
|
|
|
|
|
rerender();
|
|
|
|
rerender();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function updatePath(obj: Value, path: string[], value: Value): Value {
|
|
|
|
|
|
|
|
if (path.length === 0) return value;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (obj.kind !== 'record')
|
|
|
|
|
|
|
|
throw new Error('Cannot access field on non-record');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const [field, ...rest] = path;
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
|
|
kind: 'record',
|
|
|
|
|
|
|
|
fields: {
|
|
|
|
|
|
|
|
...obj.fields,
|
|
|
|
|
|
|
|
[field]: updatePath(obj.fields[field], rest, value)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|