Beispiel #1
0
        private static void TestSerialization <TContext>(StatechartDefinition <TContext> statechart)
            where TContext : IContext <TContext>, IXStateSerializable
        {
            var schema     = JSchema.Parse(File.ReadAllText(Path.GetRelativePath(Directory.GetCurrentDirectory(), $"machine.schema.json")));
            var definition = JObject.Parse(statechart.AsXStateVisualizerV5Definition());

            Assert.True(definition.IsValid(schema));
        }
        private static Action Run <TContext>(StatechartDefinition <TContext> definition)
            where TContext : IContext <TContext>, IXStateSerializable => () =>
        {
            Console.WriteLine(definition.AsXStateVisualizerV4Definition() + Environment.NewLine);

            var statechart = Parser.Parse(definition) as ExecutableStatechart <FetchContext>;
            var running    = Interpreter.Interpret(statechart,
                                                   new InterpreterOptions(wait: (lapse, token) =>
                                                                          Task.Delay((int)lapse.TotalMilliseconds / 1, token)));

            running.OnMacroStep += macrostep =>
            {
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine();
                Console.WriteLine(
                    $" Statenodes: {string.Join(", ", macrostep.State.StateConfiguration.Ids)}");
                Console.WriteLine($"    Context: {macrostep.State.Context}");
                Console.WriteLine($"Next events: {string.Join(", ", running.NextEvents.Distinct())}");
                Console.ResetColor();
            };

            running.RunAsync().ContinueWith(_ => Environment.Exit(0));

            while (true)
            {
                Console.Write("@");
                var eventType = Console.ReadLine();
                switch (eventType)
                {
                case { } when eventType.StartsWith(nameof(IncrementBy)):
                    running.Send(IncrementBy(int.Parse(eventType.Substring(11))));

                    break;

                case null: break;

                default:
                    running.Send(new NamedEvent(eventType));
                    break;
                }
            }

            // ReSharper disable once FunctionNeverReturns
        };
            ).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
 private static string AsXStateV4Definition <TContext>(
     this StatechartDefinition <TContext> statechartDefinition)
     where TContext : IContext <TContext>, IXStateSerializable
 => ObjectValue(
     ("id", statechartDefinition.Id),
 public static string AsXStateVisualizerV5Definition <TContext>(
     this StatechartDefinition <TContext> statechartDefinition)
     where TContext : IContext <TContext>, IXStateSerializable
 => throw new NotImplementedException();
 public static string AsXStateVisualizerV4Definition <TContext>(
     this StatechartDefinition <TContext> statechartDefinition)
     where TContext : IContext <TContext>, IXStateSerializable
 => $"const machine = Machine({statechartDefinition.AsXStateV4Definition()});";