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)));
            };
        }