using System.Threading.Tasks;
public static async Task Main()
var f = new MemoFactory();
var one = f.CreateSignal(2);
var two = f.CreateSignal(2);
var squareOne = f.CreateMemoizR(async () =>
var value = await one.Get();
Console.WriteLine($"Square One: {value}");
return Math.Pow(value, 2);
var squareTwo = f.CreateMemoizR(async () =>
var value = await two.Get();
Console.WriteLine($"Square Two: {value}");
return Math.Pow(value, 2);
var final = f.CreateMemoizR(async () =>
var result = await squareOne.Get() + await squareTwo.Get();
Console.WriteLine("Add Squares");
Console.Write($"Set one (current: {await one.Get()}):");
var user1 = Console.ReadLine();
if (user1 is not null && int.TryParse(user1, out var value))
Console.Write($"Set two (current: {await two.Get()}):");
var user2 = Console.ReadLine();
if (user2 is not null && int.TryParse(user2, out value))
var result = await final.Get();
Console.WriteLine($"Result is {result}.\n");