fibの美容整形

まだこのネタを引っ張る気か・・・!と言われそうですが。。。
前回のヤツがどうも気に入らなかったのでもう1度。
前よりはマシかなぁ

class Fibonacci2
{
    public class LazyZipper<T1, T2, TResult>
    {
        private List<TResult> memo = new List<TResult>();

        public IEnumerable<TResult> ZipWith(
            IEnumerable<T1> a, IEnumerable<T2> b, Func<T1, T2, TResult> f )
        {
            using ( var e1 = a.GetEnumerator() )
            using ( var e2 = b.GetEnumerator() )
            {
                for ( int i = 0 ; true ; i++ )
                {
                    bool evals = memo.Count == i;
                    if ( evals )
                    {
                        if ( (e1.MoveNext() && e2.MoveNext()) == false ) break;
                        memo.Add( f( e1.Current, e2.Current ) );
                    }
                    yield return memo[ i ];
                }
            }
        }
    }

    private readonly LazyZipper<uint, uint, uint> lazy = new LazyZipper<uint,uint,uint>();
    public IEnumerable<uint> Fib()
    {
        yield return 1;
        yield return 1;
        foreach ( var item in this.lazy.ZipWith( Fib(), Fib().Skip( 1 ), (( x, y ) => x + y) ) )
            yield return item;
    }

    public void Test1()
    {
        Fib().Take( 50 ).ToList().ForEach( x => Console.Write( "{0}.", x ) );
    }
}


F#がVS2010に正式採用らしいです!おめでとう!ありがとう!