public static EitherAsync <L, Seq <B> > TraverseSerial <L, A, B>(this Seq <EitherAsync <L, A> > ma, Func <A, B> f) { return(new EitherAsync <L, Seq <B> >(Go(ma, f))); async Task <EitherData <L, Seq <B> > > Go(Seq <EitherAsync <L, A> > ma, Func <A, B> f) { var rb = new B[ma.Count]; var ix = 0; foreach (var a in ma) { var mb = await a; if (mb.IsBottom) { return(EitherData.Bottom <L, Seq <B> >()); } if (mb.IsLeft) { return(EitherData.Left <L, Seq <B> >(mb.LeftValue)); } rb[ix] = f(mb.RightValue); ix++; } return(EitherData.Right <L, Seq <B> >(Seq.FromArray <B>(rb))); }; }