import { Dispatch, memo, Ref, SetStateAction, useCallback } from "react"; import { Statechart, stateDescription } from "../statecharts/abstract_syntax"; import { BigStep, Mode, RaisedEvent, RT_Event } from "../statecharts/runtime_types"; import { formatTime } from "../util/util"; import { TimeMode } from "../statecharts/time"; import { TraceItem, TraceState } from "./App"; import { Environment } from "@/statecharts/environment"; type RTHistoryProps = { trace: TraceState|null, setTrace: Dispatch>; ast: Statechart, setTime: Dispatch>, } export function RTHistory({trace, setTrace, ast, setTime}: RTHistoryProps) { const onMouseDown = useCallback((idx: number, timestamp: number) => { setTrace(trace => trace && { ...trace, idx, }); setTime({kind: "paused", simtime: timestamp}); }, [setTrace, setTime]); if (trace === null) { return <>; } return
{trace.trace.map((item, i) => )}
; } export const RTHistoryItem = memo(function RTHistoryItem({ast, idx, item, prevItem, active, onMouseDown}: {idx: number, ast: Statechart, item: TraceItem, prevItem?: TraceItem, active: boolean, onMouseDown: (idx: number, timestamp: number) => void}) { if (item.kind === "bigstep") { // @ts-ignore const newStates = item.mode.difference(prevItem?.mode || new Set()); return
onMouseDown(idx, item.simtime), [idx, item.simtime])}>
{formatTime(item.simtime)}  
{item.inputEvent || ""}
{item.outputEvents.length>0 && <>^ {item.outputEvents.map((e:RaisedEvent) => {e.name})} }
; } else { return
{formatTime(item.simtime)}  
{item.inputEvent}
{item.error.message}
; } }); function ShowEnvironment(props: {environment: Environment}) { return
{ [...props.environment.entries()] .filter(([variable]) => !variable.startsWith('_')) .map(([variable,value]) => `${variable}: ${value}`).join(', ') }
; } function ShowMode(props: {mode: Mode, statechart: Statechart}) { const activeLeafs = getActiveLeafs(props.mode, props.statechart); return
{[...activeLeafs].map(uid => {stateDescription(props.statechart.uid2State.get(uid)!)})}
; } function getActiveLeafs(mode: Mode, sc: Statechart) { return new Set([...mode].filter(uid => // @ts-ignore sc.uid2State.get(uid)?.children?.length === 0 )); }