public static SuperThing <B> Select <A, B>(this SuperThing <A> ma, Func <A, B> f) => sa =>
 {
     var a = ma(sa);
     if (a.State.HasExited)
     {
         return(new SuperState <B>(default(B), a.State));
     }
     return(new SuperState <B>(f(a.Value), a.State));
 };
        public static SuperThing <C> SelectMany <A, B, C>(this SuperThing <A> ma, Func <A, SuperThing <B> > bind, Func <A, B, C> project) => sa =>
        {
            var a = ma(sa);
            if (a.State.HasExited)
            {
                return(new SuperState <C>(default(C), a.State));
            }

            var b = bind(a.Value)(a.State);
            if (b.State.HasExited)
            {
                return(new SuperState <C>(default(C), b.State));
            }

            return(new SuperState <C>(project(a.Value, b.Value), b.State));
        };