public ProblemQualified <V> SelectMany <U, V>(Func <T, ProblemQualified <U> > tu, Func <T, U, V> tuv) => TerminalOrValue.Match( term => new ProblemQualified <V>(Either <Array1 <string>, V> .FromLeft(term), NonTerminalWarnings), val => tu(val).Let(nq => new ProblemQualified <V>(nq.TerminalOrValue.Map(x => x, x => tuv(val, x)), NonTerminalWarnings.Concat(nq.NonTerminalWarnings))));
public static ProblemQualified <T> ForTerminal(string terminal) => new ProblemQualified <T>(Either <Array1 <string>, T> .FromLeft(Array1.Build(terminal)), Enumerable.Empty <string>());
public static ProblemQualified <T> ForTerminal(Array1 <string> terminal, IEnumerable <string> nonTerminalWarnings) => new ProblemQualified <T>(Either <Array1 <string>, T> .FromLeft(terminal), nonTerminalWarnings);
public static DrawnResult <TFinalValue, TDrawInput, TDrawResult> Return(TFinalValue t) => new DrawnResult <TFinalValue, TDrawInput, TDrawResult>(Either <TFinalValue, Draw> .FromLeft(t));