Пример #1
0
        private static void Main(string[] args)
        {
            CalculatorServer server = new CalculatorServer();

            server.Start();
            Console.WriteLine("Calculator service is listening...");
            Console.WriteLine("Press any key to stop the server...");
            Console.ReadKey();
        }
Пример #2
0
        /// <summary>
        /// Set up three calculator model objects for each calculator view
        /// Explicitly set to null to enforce loading needed (unlike in F#)
        /// </summary>
        public static WebSharper.UI.Doc MainDoc(Var <string> page)
        {
            var varViewStateCalculator = Var.Create(new CalculatorViewModel());

            varViewStateCalculator.Set(null);
            var viewViewStateCalculator = varViewStateCalculator.View.MapAsync <CalculatorViewModel, CalculatorViewModel>(c =>
            {
                if (c == null)
                {
                    return(CalculatorServer.Load(SessionStorage.ViewState));
                }
                else
                {
                    return(Task.FromResult(c));
                }
            });

            var varSessionCalculator = Var.Create(new CalculatorViewModel());

            varSessionCalculator.Set(null);
            var viewSessionCalculator = varSessionCalculator.View.MapAsync <CalculatorViewModel, CalculatorViewModel>(c =>
            {
                if (c == null)
                {
                    return(CalculatorServer.Load(SessionStorage.Session));
                }
                else
                {
                    return(Task.FromResult(c));
                }
            });

            var varDatabaseCalculator = Var.Create(new CalculatorViewModel());

            varDatabaseCalculator.Set(null);
            var viewDatabaseCalculator = varDatabaseCalculator.View.MapAsync <CalculatorViewModel, CalculatorViewModel>(c =>
            {
                if (c == null)
                {
                    return(CalculatorServer.Load(SessionStorage.Database));
                }
                else
                {
                    return(Task.FromResult(c));
                }
            });

            return(new Template.Triptych.Main()
                   .ViewState(CalculatorDoc.MainDoc(viewViewStateCalculator, varViewStateCalculator, page, id: ViewStateDoc))
                   .Session(CalculatorDoc.MainDoc(viewSessionCalculator, varSessionCalculator, page, id: SessionDoc))
                   .Database(CalculatorDoc.MainDoc(viewDatabaseCalculator, varDatabaseCalculator, page, id: DatabaseDoc))
                   .Doc());
        }
Пример #3
0
    static void Main()
    {
        var server = new CalculatorServer();

        server.LogChanged += (sender, args) => Console.WriteLine(
            $"SERVER [{args.Level} {args.Category}] {args.Message}");

        server.RunAsync();

        Console.ReadKey(intercept: true);

        server.Shutdown();
    }
Пример #4
0
 /// <summary>
 /// Footer: The Enter button mutates the calculator state, therefore
 /// View and Variable required.
 /// </summary>
 /// <param name="viewCalculator">The calculator.</param>
 /// <param name="varCalculator">The variable calculator.</param>
 /// <returns></returns>
 public static object FooterDoc(View <CalculatorViewModel> viewCalculator,
                                Var <CalculatorViewModel> varCalculator,
                                Var <string> varOperand,
                                string idParent) =>
 V(viewCalculator.V.ViewState).Map(viewState =>
 {
     return(new Template.Footer.Main()
            .IdEnterButton(Id(idParent, EnterButton))
            .Enter(async(el, ev) =>
     {
         varCalculator.Set(
             await CalculatorServer.Enter(viewState, varOperand.Value));
         varOperand.Set("");         // Reactively clears the text box
     })
            .Doc());
 });
Пример #5
0
        public static void ClientMain()
        {
            var varCalculator  = Var.Create(new CalculatorViewModel());
            var viewCalculator = varCalculator.View.MapAsync <CalculatorViewModel, CalculatorViewModel>(c =>
            {
                if (c == null)
                {
                    JSConsole.Log("C#: c == null instead of c.IsNew as in F#");
                    return(CalculatorServer.Load()); // Get a new instance from the server
                }
                else
                {
                    JSConsole.Log("Task.FromResult(c)");
                    return(Task.FromResult(c));      // Return the persistent instance
                }
            });

            MainDoc(viewCalculator, varCalculator).RunById("main");
        }
Пример #6
0
        /// <summary>
        /// Calculate: Mutates the calculator's persistent Stack, therefore
        /// View and Variable required.
        /// </summary>
        /// <param name="viewCalculator">The calculator.</param>
        /// <param name="varCalculator">The variable calculator.</param>
        /// <returns></returns>
        public static object CalculateDoc(View <CalculatorViewModel> viewCalculator,
                                          Var <CalculatorViewModel> varCalculator,
                                          string idParent) =>
        V(viewCalculator.V.ViewState).Map(viewState =>
                                          V(viewCalculator.V.State).Map2(V(viewCalculator.V.Map1.Calculate), (state, calculate) =>
        {
            return((state == calculate) ?
                   new Template.Calculate.Main()
                   .IdAddButton(Id(idParent, AddButton))
                   .IdSubButton(Id(idParent, SubButton))
                   .IdMulButton(Id(idParent, MulButton))
                   .IdDivButton(Id(idParent, DivButton))
                   .IdPowButton(Id(idParent, PowButton))
                   .IdSqrtButton(Id(idParent, SqrtButton))
                   .IdClrButton(Id(idParent, ClrButton))
                   .IdClrAllButton(Id(idParent, ClrAllButton))
                   .Add(async(el, ev) =>
            {
                varCalculator.Set(
                    await CalculatorServer.Add(viewState));
            })
                   .Sub(async(el, ev) =>
            {
                varCalculator.Set(
                    await CalculatorServer.Sub(viewState));
            })
                   .Mul(async(el, ev) =>
            {
                varCalculator.Set(
                    await CalculatorServer.Mul(viewState));
            })
                   .Div(async(el, ev) =>
            {
                varCalculator.Set(
                    await CalculatorServer.Div(viewState));
            })
                   .Pow(async(el, ev) =>
            {
                varCalculator.Set(
                    await CalculatorServer.Pow(viewState));
            })
                   .Sqrt(async(el, ev) =>
            {
                varCalculator.Set(
                    await CalculatorServer.Sqrt(viewState));
            })
                   .Clr(async(el, ev) =>
            {
                varCalculator.Set(
                    await CalculatorServer.Clr(viewState));
            })
                   .ClrAll(async(el, ev) =>
            {
                varCalculator.Set(
                    await CalculatorServer.ClrAll(viewState));
            })

                   .StackContainer(
                       V((IEnumerable <string>)viewCalculator.V.Stack).DocSeqCached((string x) =>
                                                                                    new Template.Calculate.StackItem().Line(x).Doc()
                                                                                    )
                       )
                   .Doc()
                    : WebSharper.UI.Doc.Empty);
        }));