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