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(); }
/// <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()); }
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(); }
/// <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()); });
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"); }
/// <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); }));