public static async ValueTask <Maybe <T> > TryReadSafeAsync <T>(this IReadableChannel <T> channel) { T result; while (!channel.TryReadSafe(out result)) { if (!await channel.WaitForNextSafeAsync().ConfigureAwait(false)) { return(Maybe <T> .Nothing); } } return(new Maybe <T>(result)); }