public static IInput AdvanceMany(this IInput input, int count) { for (int i = 0; i < count; i++) { input = input.Advance(); } return input; }
public static IInput AdvanceAssert(this IInput input, Action<IInput, IInput> assertion) { var result = input.Advance(); assertion(input, result); return result; }
public static int AdvanceWhile(this Subject subject, char c, long max = int.MaxValue) { var start = subject.Index; var index = start; max = Math.Min(start + max, subject.Text.Length); while (index < max && subject.Text[index] == c) { index += 1; } return index > start ? subject.Advance(index - start) : 0; }
public static string Take(this Subject subject, int count) { var result = subject.Text.Substring(subject.Index, count); subject.Advance(count); return result; }
public static char Take(this Subject subject) { if (subject.EndOfString) { return char.MinValue; } var result = subject.Char; subject.Advance(); return result; }
public static int AdvanceWhileNot(this Subject subject, Func<char, bool> predicate, long max = int.MaxValue) { var start = subject.Index; var index = start; max = Math.Min(start + max, subject.Text.Length); while (index < max && !predicate(subject.Text[index])) { index += 1; } return index > start ? subject.Advance(index - start) : 0; }