static IEnumerable<R> Zip<T1, T2, R>((IEnumerable<T1> foo, IEnumerable<T2> bar) sequences, Func<(T1 foo, T2 bar), R> resultSelector)
{
using (IEnumerator<T1> it1 = sequences.foo.GetEnumerator())
using (IEnumerator<T2> it2 = sequences.bar.GetEnumerator())
{
while (it1.MoveNext() && it2.MoveNext())
yield return resultSelector((it1.Current, it2.Current));
}
}