Пример #1
0
        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