using System.Collections.Generic;
public static void Main()
Console.WriteLine(a.Next(1));
Console.WriteLine(a.Next(1));
var withCache = a.AddCaching<A,int,int>(x => x.Next);
Console.WriteLine(withCache(1));
Console.WriteLine(withCache(1));
Console.WriteLine("Called Next("+n+")");
public static class ExtensionMethods
public static Func<TKey,TVal> AddCaching<T,TKey,TVal>(this T wrapped, Func<T,Func<TKey,TVal>> fetcher)
var cache = new Dictionary<TKey, TVal>();
if (!cache.ContainsKey(k)) cache[k] = fetcher(wrapped)(k);