// Two versions of the Transpose operation based on
        // ZipList idiom using IEnumerable<T>. One version is written
        // directly and the other one uses LINQ syntax with 'join'

        #region Transpose from the blog post

        static IEnumerable <IEnumerable <T> > Transpose2 <T>(this IEnumerable <IEnumerable <T> > matrix)
        {
            if (matrix.Count() == 0)
            {
                return(ZipEnumerable.Return(Enumerable.Empty <T>()));
            }
            else
            {
                return
                    (ZipEnumerable.
                     Merge(matrix.First(), Transpose(matrix.Skip(1))).
                     Select(tuple =>
                            Enumerable.Concat(new[] { tuple.Item1 }, tuple.Item2)));
            }
        }