simplify rollback

This commit is contained in:
Joeri Exelmans 2025-05-12 11:26:37 +02:00
parent ebae0afc81
commit 0a9dbd454f
4 changed files with 57 additions and 26 deletions

View file

@ -14,17 +14,16 @@ export interface CallBlockState {
fn: EditorState; fn: EditorState;
input: EditorState; input: EditorState;
resolved: undefined | Dynamic; resolved: undefined | Dynamic;
rollback: EditorState;
} }
interface CallBlockProps extends State2Props<CallBlockState> { interface CallBlockProps extends State2Props<CallBlockState> {
onResolve: (resolved: EditorState) => void; onResolve: (resolved: EditorState) => void;
} }
export function CallBlock({ state: {kind, env, fn, input, resolved, rollback }, setState, onResolve }: CallBlockProps) { export function CallBlock({ state: {kind, env, fn, input, resolved }, setState, onResolve }: CallBlockProps) {
const [unifyError, setUnifyError] = useState<UnifyError | undefined>(undefined); const [unifyError, setUnifyError] = useState<UnifyError | undefined>(undefined);
const setResolved = (resolved?: Dynamic) => { const setResolved = (resolved?: Dynamic) => {
setState({kind, env, fn, input, resolved, rollback}); setState({kind, env, fn, input, resolved});
} }
const makeTheCall = (input, fn) => { const makeTheCall = (input, fn) => {
@ -34,7 +33,7 @@ export function CallBlock({ state: {kind, env, fn, input, resolved, rollback },
setResolved(outputResolved); setResolved(outputResolved);
console.log("onResolve callblock..") console.log("onResolve callblock..")
onResolve({ onResolve({
kind, env, fn, input, resolved: outputResolved, rollback kind, env, fn, input, resolved: outputResolved
}); });
setUnifyError(undefined); setUnifyError(undefined);
} }
@ -44,16 +43,16 @@ export function CallBlock({ state: {kind, env, fn, input, resolved, rollback },
} }
setUnifyError(e); setUnifyError(e);
onResolve({ onResolve({
kind, env, fn, input, resolved: undefined, rollback kind, env, fn, input, resolved: undefined
}) })
} }
} }
const setFn = (fn: EditorState) => { const setFn = (fn: EditorState) => {
setState({kind, env, fn, input, resolved, rollback}); setState({kind, env, fn, input, resolved});
} }
const setInput = (input: EditorState) => { const setInput = (input: EditorState) => {
setState({kind, env, fn, input, resolved, rollback}); setState({kind, env, fn, input, resolved});
} }
const onFnResolve = (fnState) => { const onFnResolve = (fnState) => {
console.log('my fn resolved') console.log('my fn resolved')
@ -64,7 +63,7 @@ export function CallBlock({ state: {kind, env, fn, input, resolved, rollback },
// setFn(fnState); // setFn(fnState);
setResolved(undefined); setResolved(undefined);
onResolve({ onResolve({
kind, env, fn: fnState, input, resolved: undefined, rollback kind, env, fn: fnState, input, resolved: undefined
}); });
} }
} }
@ -77,7 +76,7 @@ export function CallBlock({ state: {kind, env, fn, input, resolved, rollback },
// setInput(inputState); // setInput(inputState);
setResolved(undefined); setResolved(undefined);
onResolve({ onResolve({
kind, env, fn, input: inputState, resolved: undefined, rollback kind, env, fn, input: inputState, resolved: undefined
}); });
} }
} }
@ -85,11 +84,7 @@ export function CallBlock({ state: {kind, env, fn, input, resolved, rollback },
} }
const onInputCancel = () => { const onInputCancel = () => {
// we become what we were before we became a CallBlock setState(fn);
if (rollback) {
setState(rollback);
focusPrevElement();
}
} }
const filterCompatibleInputs = ([_name, dynamic]: [string, Dynamic]) => { const filterCompatibleInputs = ([_name, dynamic]: [string, Dynamic]) => {

View file

@ -8,16 +8,7 @@ import { Type } from "./Type";
import "./Editor.css" import "./Editor.css"
import { focusNextElement, focusPrevElement } from "./util/dom_trickery"; import { focusNextElement, focusPrevElement } from "./util/dom_trickery";
import type { LetInBlockState } from "./LetInBlock";
interface LetInBlockState {
kind: "let";
env: any;
name: string;
value: EditorState;
inner: EditorState;
resolved: undefined | Dynamic;
rollback?: EditorState;
}
interface LambdaBlockState { interface LambdaBlockState {
kind: "lambda"; kind: "lambda";
@ -50,7 +41,7 @@ interface EditorProps extends State2Props<EditorState> {
const dontFilter = () => true; const dontFilter = () => true;
function getCommands(type) { function getCommands(type) {
const commands = ['u', 't', 'Enter', 'Backspace', 'ArrowLeft', 'Tab']; const commands = ['u', 't', 'Enter', 'Backspace', 'ArrowLeft', 'Tab', 'l', '='];
if (getSymbol(type) === symbolFunction) { if (getSymbol(type) === symbolFunction) {
commands.push('c'); commands.push('c');
} }
@ -114,6 +105,21 @@ export function Editor({state, setState, onResolve, onCancel}: EditorProps) {
focusPrevElement(); focusPrevElement();
return; return;
} }
// l -> Let ... in ...
// = -> assign to name
if (e.key === 'l' || e.key === '=') {
// we become LetInBlock
setState({
kind: "let",
env: state.env,
inner: initialEditorState,
name: "",
value: state,
resolved: undefined,
rollback: state,
});
return;
}
}; };
const renderBlock = () => { const renderBlock = () => {

View file

@ -151,7 +151,15 @@ export function InputBlock({ state: {kind, env, text, resolved, rollback}, setSt
return <span> return <span>
<span className=""> <span className="">
<input ref={ref} placeholder="start typing..." className="editable" value={text} onInput={onInput} onKeyDown={onKeyDown} onFocus={() => setHaveFocus(true)} onBlur={() => setTimeout(() => setHaveFocus(false), 200)}/> <input ref={ref}
placeholder="start typing..."
className="editable"
value={text}
onInput={onInput}
onKeyDown={onKeyDown}
onFocus={() => setHaveFocus(true)}
onBlur={() => setHaveFocus(false)}
/>
<span className="text-block suggest">{singleSuggestion}</span> <span className="text-block suggest">{singleSuggestion}</span>
</span> </span>
<ShowIf cond={haveFocus}> <ShowIf cond={haveFocus}>

22
src/LetInBlock.tsx Normal file
View file

@ -0,0 +1,22 @@
import type { EditorState } from "./Editor";
import type { Dynamic, State2Props } from "./util/extra";
export interface LetInBlockState {
kind: "let";
env: any;
name: string;
value: EditorState;
inner: EditorState;
resolved: undefined | Dynamic;
rollback?: EditorState;
}
interface LetInBlockProps extends State2Props<LetInBlockState> {
onResolve: (resolved: EditorState) => void;
}
export function LetInBlock({env, name, value, inner, resolved, rollback, onResolve}) {
}