diff --git a/src/CallBlock.tsx b/src/CallBlock.tsx index ab404ce..8bb4872 100644 --- a/src/CallBlock.tsx +++ b/src/CallBlock.tsx @@ -14,17 +14,16 @@ export interface CallBlockState { fn: EditorState; input: EditorState; resolved: undefined | Dynamic; - rollback: EditorState; } interface CallBlockProps extends State2Props { 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(undefined); const setResolved = (resolved?: Dynamic) => { - setState({kind, env, fn, input, resolved, rollback}); + setState({kind, env, fn, input, resolved}); } const makeTheCall = (input, fn) => { @@ -34,7 +33,7 @@ export function CallBlock({ state: {kind, env, fn, input, resolved, rollback }, setResolved(outputResolved); console.log("onResolve callblock..") onResolve({ - kind, env, fn, input, resolved: outputResolved, rollback + kind, env, fn, input, resolved: outputResolved }); setUnifyError(undefined); } @@ -44,16 +43,16 @@ export function CallBlock({ state: {kind, env, fn, input, resolved, rollback }, } setUnifyError(e); onResolve({ - kind, env, fn, input, resolved: undefined, rollback + kind, env, fn, input, resolved: undefined }) } } const setFn = (fn: EditorState) => { - setState({kind, env, fn, input, resolved, rollback}); + setState({kind, env, fn, input, resolved}); } const setInput = (input: EditorState) => { - setState({kind, env, fn, input, resolved, rollback}); + setState({kind, env, fn, input, resolved}); } const onFnResolve = (fnState) => { console.log('my fn resolved') @@ -64,7 +63,7 @@ export function CallBlock({ state: {kind, env, fn, input, resolved, rollback }, // setFn(fnState); setResolved(undefined); 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); setResolved(undefined); 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 = () => { - // we become what we were before we became a CallBlock - if (rollback) { - setState(rollback); - focusPrevElement(); - } + setState(fn); } const filterCompatibleInputs = ([_name, dynamic]: [string, Dynamic]) => { diff --git a/src/Editor.tsx b/src/Editor.tsx index 4b4acb3..6455a81 100644 --- a/src/Editor.tsx +++ b/src/Editor.tsx @@ -8,16 +8,7 @@ import { Type } from "./Type"; import "./Editor.css" import { focusNextElement, focusPrevElement } from "./util/dom_trickery"; - -interface LetInBlockState { - kind: "let"; - env: any; - name: string; - value: EditorState; - inner: EditorState; - resolved: undefined | Dynamic; - rollback?: EditorState; -} +import type { LetInBlockState } from "./LetInBlock"; interface LambdaBlockState { kind: "lambda"; @@ -50,7 +41,7 @@ interface EditorProps extends State2Props { const dontFilter = () => true; function getCommands(type) { - const commands = ['u', 't', 'Enter', 'Backspace', 'ArrowLeft', 'Tab']; + const commands = ['u', 't', 'Enter', 'Backspace', 'ArrowLeft', 'Tab', 'l', '=']; if (getSymbol(type) === symbolFunction) { commands.push('c'); } @@ -114,6 +105,21 @@ export function Editor({state, setState, onResolve, onCancel}: EditorProps) { focusPrevElement(); 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 = () => { diff --git a/src/InputBlock.tsx b/src/InputBlock.tsx index f7d5777..ec09c0b 100644 --- a/src/InputBlock.tsx +++ b/src/InputBlock.tsx @@ -151,7 +151,15 @@ export function InputBlock({ state: {kind, env, text, resolved, rollback}, setSt return - setHaveFocus(true)} onBlur={() => setTimeout(() => setHaveFocus(false), 200)}/> + setHaveFocus(true)} + onBlur={() => setHaveFocus(false)} + /> {singleSuggestion} diff --git a/src/LetInBlock.tsx b/src/LetInBlock.tsx new file mode 100644 index 0000000..490eb96 --- /dev/null +++ b/src/LetInBlock.tsx @@ -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 { + onResolve: (resolved: EditorState) => void; +} + + +export function LetInBlock({env, name, value, inner, resolved, rollback, onResolve}) { + +} \ No newline at end of file