From f439c6dcd84ba4d75a0367d28d36955bb656ee72 Mon Sep 17 00:00:00 2001 From: Ciaran Morinan Date: Wed, 5 Nov 2025 13:59:43 +0000 Subject: [PATCH] change how simulation state is sent to hazel --- pocs/petrinaut-hazel/src/main/app.tsx | 39 ++++++++++++++----- .../src/main/app/use-hazel-integration.ts | 12 ++++-- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/pocs/petrinaut-hazel/src/main/app.tsx b/pocs/petrinaut-hazel/src/main/app.tsx index 0cdd3b0..99ec0f9 100644 --- a/pocs/petrinaut-hazel/src/main/app.tsx +++ b/pocs/petrinaut-hazel/src/main/app.tsx @@ -6,6 +6,7 @@ import { } from "@hashintel/petrinaut"; import { useHazelIntegration, + type HazelSimulationState, type HazelValue, } from "./app/use-hazel-integration"; import { produce } from "immer"; @@ -48,19 +49,35 @@ const isValidNetDefinition = ( }; /** - * Hazel errors if sent an empty array at the root of an object value returned, e.g. { simulationState: [] }. + * Converts SimulationState to a 2D array format. + * Each step becomes an array of objects with placeId, marking, and placeLabel. */ -const stripEmptyTuple = ( +const simulationStateTo2DArray = ( + simulationState: SimulationState, +): HazelSimulationState => { + return simulationState.map((step) => { + return Object.entries(step).map(([placeId, { marking, placeLabel }]) => ({ + placeId, + marking, + placeLabel, + })); + }); +}; + +const convertSimulationStateForHazel = ( simulationState: SimulationState, ): HazelValue["simulationState"] => { if ( simulationState.length === 0 || Object.keys(simulationState[0]).length === 0 ) { + /** + * Hazel errors if sent an empty array at the root of an object value returned, e.g. { simulationState: [] }. + */ return undefined; } - return simulationState; + return simulationStateTo2DArray(simulationState); }; /** @@ -83,17 +100,19 @@ export const App = () => { try { const parsedValue = JSON.parse(value); - if (isValidNetDefinition(parsedValue.netDefinition)) { - setNetDefinition(parsedValue.netDefinition); - setSimulationState(parsedValue.simulationState ?? []); + const { netDefinition, simulationState } = parsedValue; + + if (isValidNetDefinition(netDefinition)) { + setNetDefinition(netDefinition); + setSimulationState(simulationState ?? []); } else { - console.error("Invalid net definition", parsedValue.netDefinition); + console.error("Invalid net definition", netDefinition); const defaultNetDefinition = createDefaultNetDefinition(); setNetDefinition(defaultNetDefinition); setSyntax({ netDefinition: defaultNetDefinition, - simulationState: stripEmptyTuple(simulationState), + simulationState: convertSimulationStateForHazel(simulationState), }); } } catch (error) { @@ -109,7 +128,7 @@ export const App = () => { setSyntax({ netDefinition: netDefinition as PetriNetDefinitionObject, - simulationState: stripEmptyTuple(simulationState), + simulationState: convertSimulationStateForHazel(simulationState), }); }, [netDefinition, setSyntax], @@ -121,7 +140,7 @@ export const App = () => { const newDefinition = produce(existingDefinition, definitionMutationFn); setSyntax({ netDefinition: newDefinition as PetriNetDefinitionObject, - simulationState: stripEmptyTuple(simulationState), + simulationState: convertSimulationStateForHazel(simulationState), }); return newDefinition; }); diff --git a/pocs/petrinaut-hazel/src/main/app/use-hazel-integration.ts b/pocs/petrinaut-hazel/src/main/app/use-hazel-integration.ts index 87b5f97..256fa58 100644 --- a/pocs/petrinaut-hazel/src/main/app/use-hazel-integration.ts +++ b/pocs/petrinaut-hazel/src/main/app/use-hazel-integration.ts @@ -1,5 +1,7 @@ -import type { PetriNetDefinitionObject } from "@hashintel/petrinaut"; -import type { SimulationState } from "@hashintel/petrinaut/dist/petrinaut/types"; +import type { + PetriNetDefinitionObject, + TokenCounts, +} from "@hashintel/petrinaut"; import { useCallback, useEffect, useState } from "react"; export type MessageToHazel = @@ -37,9 +39,13 @@ type HazelIntegrationConfig = { onInit: (value: string) => void; }; +export type HazelSimulationState = Array< + Array<{ placeId: string; marking: TokenCounts; placeLabel: string }> +>; + export type HazelValue = { netDefinition: PetriNetDefinitionObject; - simulationState: SimulationState | undefined; + simulationState: HazelSimulationState | undefined; }; const sendToHazel = (message: MessageToHazel, targetOrigin: string) => {