// Take/Until public static IEnumerable <T> TakeUntil <T>(this PeekableEnumerator <T> enumerator, Predicate <T> predicate) { // false, false, [break], true while (enumerator.TakeIfNot(predicate, out var value)) { yield return(value); } }
public static bool TakeIfNot <T>(this PeekableEnumerator <T> enumerator, Predicate <T> predicate, [MaybeNullWhen(false)] out T value) { if (enumerator.PeekNext(out var next) && !predicate(next)) { return(enumerator.MoveNext(out value)); } value = default; return(false); }
public static IEnumerable <T> TakeSliceByLast <T>(this PeekableEnumerator <T> enumerator, Predicate <T> isLast) { // first, last, [break] while (enumerator.MoveNext(out var curr)) { yield return(curr); if (isLast(curr)) { yield break; } } }