private static (ParsedStatenode root, IDictionary <StatenodeId, StatenodeDefinition> definitions) ParseStatenode( StatenodeDefinition definition, ParsedStatenode parent, IDictionary <StatenodeId, StatenodeDefinition> definitions, int documentIndex) { IEnumerable <(ParsedStatenode statenode, StatenodeDefinition definition)> ParseChildren( IEnumerable <StatenodeDefinition> substateNodeDefinitions, ParsedStatenode recursedParent) => substateNodeDefinitions.Select((substateDefinition, index) => (ParseStatenode(substateDefinition, recursedParent, definitions, index).root, substateDefinition)); var name = definition.Name; var uniqueIdentifier = definition.UniqueIdentifier; var entryActions = definition.EntryActions.Convert(); var exitActions = definition.ExitActions.Convert(); (ParsedStatenode root, IDictionary <StatenodeId, StatenodeDefinition> definitions) CreateAtomicStatenode(AtomicStatenodeDefinition atomicDefinition) { var statenode = new ParsedAtomicStatenode(parent, name, uniqueIdentifier, documentIndex, entryActions, exitActions); statenode.Services = atomicDefinition.Services.Convert(statenode); definitions.Add(statenode.Id, atomicDefinition); return(statenode, definitions); } (ParsedStatenode root, IDictionary <StatenodeId, StatenodeDefinition> definitions) CreateFinalStatenode(FinalStatenodeDefinition finalDefinition) { var statenode = new ParsedFinalStatenode(parent, name, uniqueIdentifier, documentIndex, entryActions, exitActions); definitions.Add(statenode.Id, finalDefinition); return(statenode, definitions); } (ParsedStatenode root, IDictionary <StatenodeId, StatenodeDefinition> definitions) CreateCompoundStatenode(CompoundStatenodeDefinition compoundDefinition) { var statenode = new ParsedCompoundStatenode(parent, name, uniqueIdentifier, documentIndex, entryActions, exitActions); var children = ParseChildren(compoundDefinition.Statenodes, statenode).ToList(); var statenodes = children.Select(child => child.statenode); statenode.Statenodes = statenodes; statenode.Services = compoundDefinition.Services.Convert(statenode); definitions.Add(statenode.Id, compoundDefinition); return(statenode, definitions); } (ParsedStatenode root, IDictionary <StatenodeId, StatenodeDefinition> definitions) CreateOrthogonalStatenode(OrthogonalStatenodeDefinition orthogonalDefinition) { var statenode = new ParsedOrthogonalStatenode(parent, name, uniqueIdentifier, documentIndex, entryActions, exitActions); var children = ParseChildren(orthogonalDefinition.Statenodes, statenode).ToList(); var statenodes = children.Select(child => child.statenode); statenode.Statenodes = statenodes; statenode.Services = orthogonalDefinition.Services.Convert(statenode); definitions.Add(statenode.Id, orthogonalDefinition); return(statenode, definitions); } return(definition.Match( CreateAtomicStatenode, CreateFinalStatenode, CreateCompoundStatenode, CreateOrthogonalStatenode)); }
).With(statechartDefinition.RootStateNode.AsJSProperty(statechartDefinition).Value as ObjectValue).AsString(); // this cast is necessary because of the way xstate merges the top-level state node with the machine definition private static JSProperty AsJSProperty <TContext>( this StatenodeDefinition stateNodeDefinition, StatechartDefinition <TContext> statechartDefinition) where TContext : IContext <TContext> => stateNodeDefinition.CataFold <JSProperty>( // TODO: add actions, transitions