import React, {useCallback, useEffect, useState} from 'react'; import Interpreter from "../brainfuck/Interpreter"; import CodeDisplay from "./CodeDisplay"; import RunDisplay from "./RunDisplay"; interface RunInfoProps { input: string, setRunning: (running: boolean) => void, running: boolean inHandler: () => number, outHandler: (char: number) => void, } const Runner = ({setRunning, running, inHandler, outHandler, input}: RunInfoProps) => { const [speed, setSpeed] = useState(0); const [interpreter, setInterpreter] = useState(null); const [, setRerenderNumber] = useState(0); const startHandler = useCallback(() => { setSpeed(0); setInterpreter(new Interpreter(input, outHandler, inHandler)); setRunning(true); }, [input, inHandler, outHandler, setRunning]); const stopHandler = () => setRunning(false); const nextHandler = useCallback(() => { interpreter?.next(); setRerenderNumber(n => n + 1); }, [interpreter]); useEffect(() => { if (running) { if (speed === 0) { return; } const interval = setInterval(() => { nextHandler(); }, 1000 / (speed)); return () => clearInterval(interval); } }, [running, nextHandler, speed]); return (
{running && interpreter && <> }
{ running && <>
setSpeed(+e.target.value)}/> {speed}
}
); } ; export default Runner;